父类的属性或者方法被private修饰过之后,子类是否能继承的问题,以及this和super的区别

首先,继承的定义:继承是指一个对象直接使用另一对象的属性和方法

很明显,父对象被private修饰过的属性和方法,子对象无法直接使用(可以通过父类的get 、set方法间接使用

那么根据继承的定义来判断:private修饰过的都无法被继承

得出结论之后,我自己写了一些代码进行测试,然后自己YY出关于继承的一些问题。

  1.  使用继承后,父对象会随着子对象的创建而创建,根据内存加载的顺序也可以看出来。

  2.  父对象会比子对象早一步先创建:原因

      2.1  子类的构造方法第一句总是要写上父类的构造犯法,用来创建父对象,因为继承是发生在对象与对象之间的,所以必须先有一个父对象,子对象再去继承父对象

  3.  随着子对象的创建完毕,内存也同时存在父对象,这个父对象只能被子对象使用,子对象通过 super 关键字调用父对象的属性和方法

  4.  如果没有重写属性和方法,那么子对象里面实际上并没有一个真正属于 "自己" 的属性和方法,所以此时我们无论用 this 或者 super ,调用的都是父对象的东西,也就是说关键词写不写都无所谓,反正引用的都是同一个内存地址

  5.  发生重写后,子对象从实际上拥有了属于 "自己" 的属性和方法,所以这时候我们必须使用 thissuper 关键字来区分到底使用谁的数据

以上是我个人猜想出来的,如果有大神来个正确的补充那就更好了,接下来看测试代码

public class Test01 {
    public static void main(String[] args) throws CloneNotSupportedException {
        //创建子对象
        B b = new B();    
        
        //调用子对象的t1方法
        b.t1();

    }
}

//父类
class A {
    private int test = 7;
    
    String name;
    int age;

    A(String name) {
        this.name = name;
    }
}

//子类
class B extends A {
    int test = 8;
    
    //重写age后,子对象拥有属于自己的age
    int age;

    B() {
        
        // 创建父类对象,父对象初始化 name = "小明"
        super("小明"); 
    }

    void t1() {
        
        // 小明
        System.out.println(super.name); 
        
        // 小明   从这里可以看出继承是先有父对象,子对象使用或继承(复制)父对象的name,
        //      但是我们还不能判断子对象是复制还是直接调用父对象的name。
        System.out.println(this.name);     
                                        
        this.name = "小红";
        
         // 小红 这里表示,this.name和super.name是同一个变量,也就是说继承之后,父对象的属性和对象可以被子对象调用
        System.out.println(super.name);
        
        super.age = 1;
        this.age = 2;
        
        //    1    父对象age并没有被修改
        System.out.println(super.age);
        
        //    2    这里显示的是子对象自己的age
        System.out.println(this.age);
        
        //super.test报错(被private保护了)
        //System.out.println(super.test);
        
        //this.test可用
        System.out.println(this.test);
    }

}

猜你喜欢

转载自www.cnblogs.com/Peter-Yu/p/9992278.html