前面我们已经说明了什么是继承?继承的好处弊端等,不清楚的可参照链接 java 继承(上)

本篇文章主要理解 继承中变量,构造方法,成员方法的访问特点。

1、继承中变量的访问特点

1.1 代码实现

不看结果,尝试看代码。看下是否知道输出的age是什么?

(1)Fu类的代码实现

public class Fu {
    int age = 40;
}

(2)Zi类的代码实现

public class Zi extends Fu{
    int height = 175;
    int age = 30;
    public void method(){
        int age = 20;
        System.out.println(height);
        System.out.println(age);
    }
}

(3)Test类的代码实现

public class Test {
    public static void main(String[] args) {
        Zi z = new Zi();
        z.method();
    }
}

(4)运行结果

Java extends继承类id获取不到值_父类

1.2 上面运行结果分析,在子类方法中访问变量的次序,遵循“就近原则”,也就是会按下面的次序依次查找。

(1)子类局部范围找;

(2)子类成员范围找;

(3)父类成员范围找;

(4)如果都没有就报错(不考虑父亲的父亲...)。

2、继承中构造方法的访问特点

2.1 代码实现

(1)Fu类的代码实现

public class Fu{
    public Fu() {
        System.out.println("父类中无参构造方法被调用。。");
    }
    public Fu(int age) {
        System.out.println("父类中带参构造方法被调用。。");
    }
}

(2)Zi类的代码实现

public class Zi extends Fu{
     public Zi(){
         System.out.println("子类中无参构造方法被调用。。");
     }
    public Zi(int age){
        System.out.println("子类中带参构造方法被调用。。");
    }
}

2.2 代码分析

(1)通过Zi z = new Zi(); 去调用。

public class Test {
    public static void main(String[] args) {
        Zi z = new Zi();
    }
}

运行结果

Java extends继承类id获取不到值_java_02

特点:子类中所有的构造方法默认都会访问父类中无参的构造方法。

为什么呢?

  • 因为子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化。
  • 每一个子类构造方法的第一条语句默认都是:super(),也就是说下面的两个类是等价的。

Java extends继承类id获取不到值_java_03

(2)如果Fu类只有带参构造方法呢?

Fu类:

Java extends继承类id获取不到值_开发语言_04

Zi类就会报错:

Java extends继承类id获取不到值_构造方法_05

原因分析:这是因为父类中有了带参的构造方法的话,它会把无参构造方法覆盖掉,也就是说它就不会有默认的无参构造方法了。那怎么解决呢?很简单,给super加参数,调用父类的有参构造方法即可。

Java extends继承类id获取不到值_父类_06

2.3 特点总结

(1)子类中所有的构造方法默认都会访问父类中无参的构造方法;

(2)如果父类中没有无参构造方法,只有带参构造方法,该怎么办呢?

        ① 通过使用super关键字去显示的调用父类的带参构造方法;

        ② 在父类中自己提供一个无参构造方法;

        ③ 推荐:自己给出无参构造方法。

3、继承中成员方法的访问特点

3.1 代码实现

(1)Fu类的代码实现

public class Fu {
    public void show() {
        System.out.println("父类的show方法被调用。。");
    }
    public void method() {
        System.out.println("父类的method方法被调用。。");
    }
}

(2)Zi类的代码实现

public class Zi extends Fu {
    public void method() {
        System.out.println("子类中method方法被调用。。");
    }
}

(3)Test类的代码实现

public class Test {
    public static void main(String[] args) {
        Zi z = new Zi();
        z.method();
        z.show();
    }
}

(4)运行结果

Java extends继承类id获取不到值_子类_07

3.2 访问特点

通过子类对象访问一个方法过程:

(1)子类成员范围找

(2)父类成员范围找

(3)如果都没有就报错(不考虑父亲的父亲..)

如果想直接访问父类的方法可以通过super关键字。

Java extends继承类id获取不到值_java_08

 

本文为学习笔记,所参考文章均已附上链接,若有疑问请私信!

创作不易,如果对你有点帮助的话麻烦点个赞支持一下!

新手小白,欢迎留言指正!