zoukankan      html  css  js  c++  java
  • 疯狂java学习笔记之面向对象(七)

    super有以下两大作用:

      1、起限定作用强制去访问父类的成员(Field、方法)

      2、起调用作用:指定/显示调用父类的某个构造器

    super调用规则:

      1、子类构造器总会调用父类构造器一次,默认情况下子类构造器会自动调用父类无参数的构造器;

      2、若希望明确指定子类构造器调用父类哪个构造器,可以用super(参数,参数,....),到底调用哪个父类构造器取决于super后面传入的形参列表;

      3、this()调用与super()调用都必须出现在构造器的第一行,所以他们两个调用时不能同时出现的.

    约定俗成:

      1、若没有super()调用,也没有this()调用,默认子类构造器会自动调用父类无参数构造器;

      2、若有super()调用,根据super()调用传入的形参列表去决定调用哪个父类构造器;

      3、若有this()调用,子类构造器会找到this()调用所对应的子类中被重载的构造器

    例1:在方法中使用super.起限定作用

     1 class Fruit{
     2     private String color;
     3     private double weight;
     4     
     5     public Fruit(){}
     6     public Fruit(String color , double weight){
     7         this.color = color;
     8         this.weight = weight;
     9     }
    10 
    11     public void info(){
    12         System.out.println("这是一个水果哦!");
    13         System.out.println("水果颜色是:" + color + ",重量为:" + weight);
    14     }
    15 }
    16 
    17 
    18 public class Apple extends Fruit{
    19     public void info(){
    20         System.out.println("这是个苹果!");
    21     }
    22 
    23     public void test(){
    24         System.out.println("~~Apple test 方法");
    25         //this.info(); - 通过this. 调用info默认总是调用本类中定义的info()方法
    26         super.info();  //- 通过super. 限定后强制调用父类中的info()方法
    27     }
    28 
    29     public static void main(String[] args){
    30         Apple a = new Apple();
    31         a.test();
    32     }
    33 }

    例2:在Field中使用super. 同样起限定作用

     1 class Demo{
     2     int count = 2;
     3 }
     4 
     5 public class TestDemo extends Demo{
     6     int count = 10;
     7     public void test(){
     8         //默认count(即count前不加this./super.)时,其前面默认省略了this
     9         //若一定要使用父类的count Field必须在其前面加上super.
    10         System.out.println("test方法访问当前类的count为:" + this.count);
    11         System.out.println("test方法访问父类的count为:" + super.count);
    12     }
    13 
    14     public static void main(String[] args){
    15         TestDemo t = new TestDemo();
    16         t.test();
    17     }
    18 }

    例3:通过super调用父类构造器

     1 class Person{
     2     protected String name;
     3     protected int age;
     4     protected String sex;
     5 
     6     //程序员定义了有参构造器,因此系统不会再为该类生成无参构造器
     7     public Person(String name , int age , String sex){
     8         this.name = name;
     9         this.age = age;
    10         this.sex = sex;
    11     }
    12 
    13     //假如不定义方法,直接在main方法中调用name/age/sex 参数编译时会报错"staic方法不能引用非static变量"
    14     public void info(){
    15         System.out.println("老师的名字叫:" + name + ",年龄为:" + age + ",性别为:" + sex);
    16     }
    17 }
    18 
    19 public class Teacher extends Person{
    20     private String sex;
    21 
    22     //若不指定构造器,默认会去调用父类的无参构造器,但父类又没有无参构造器则报错
    23     public Teacher(String name , int age , String sex){
    24         super(name,age,sex);
    25     }
    26     
    27     
    28     public static void main(String[] args){
    29         Teacher tt = new Teacher("haha",30,"male");
    30         tt.info();
    31     }
    32 }
  • 相关阅读:
    10种 分布式ID生成方式(新增MongoDB的ObjectId)
    Spring核心接口Ordered的实现及应用 (动态切换数据源时候用到)
    No module named 'Crypto' 解决方案
    使用Anaconda管理多个版本的Python环境
    深入浅出Blazor webassembly 之API服务端保护
    [转载]HTTPS 是如何保护你的安全的
    [转载]api接口token的生成和应用
    深入浅出Blazor webassembly之HttpClient使用
    深入浅出Blazor webassembly之自定义Input组件
    深入浅出Blazor webassembly之EditForm
  • 原文地址:https://www.cnblogs.com/dtest/p/4166676.html
Copyright © 2011-2022 走看看