Super的原理:
代表的是当前对象this的父类型特征
如果类加载过程中,这个类有静态代码块,有静态变量,一律都会执行,系统会先分配空间
只要方法调用,就一定会进行方法压栈
new一个方法,其实是调用其构造方法,构造方法会调用构造方法中的super();
所有的构造方法中,如果没有写上super(),系统会默认隐藏式添加this.属性=默认属性值;
注意:虽然调用构造方法,在构造方法执行过程中一连串调用了父类的构造方法,父类的构造方法又继续向下调用它的父类的构造方法,但是实际上对象只是创建了一个
思考:super(实参);的作用?
作用是:初始化当前对象的父类型特征,并不是创建新的对象,实际上对象只创建了一个,继承过来的东西通过初始化后就变成子类自己的东西,并不属于父类
为什么需要继承父类型的属性,为什么要通过父类型的构造方法去给属性初始化?
这两个问题其实很简单,父类型的属性为私有的变量,通过调用构造方法,就可以访问到这些变量,注意,这里是访问,并不能修改父类型属性里面的值,this.属性=属性值; 这里的属性值是初始化给子类,并不会初始化给父类,父类的属性和子类的属性原则上不耦合,但是子类要继承父类的属性,属性值就是由子类进行再次初始化
注意:方法中如果有static关键字,就不能用super 和 this 关键字
super 和 this 都不能出现在静态方法中
假设子类中也有一个和父类同名的属性
java中允许在子类中出现和父类一样的同名属性,在构造方法中默认是 this.属性=默认属性值;
super . 什么时候不能省略
如果父类和子类中有同名属性A,希望在子类对象中访问的是父类中的属性A,不想访问子类中的属性A,则super. 一定不能省略
不能理解为覆盖:只有方法才有覆盖这个概念
为什么super不能单独使用?
public class Teat01 {public void dosome(){System.out.println(this);}public static void main(String[] args){Teat01 teat01 = new Teat01();teat01.dosome();}
}
结果:
等同于:
System.out.println(this); =========//System.out.println(this.toString());
输出引用的时候,会自动调用引用的toString()方法
编译错误:
通过这个测试得出结论:
super 不是引用,super也不保存内存地址,super也不指向任何对象
super 只是代表当前对象内部的那一块父类型的特征
这样记忆:super 在内存空间代表的是一块父类型区域的特征, this 在内存空间代表的是当前对象的引用地址
super 的使用:
super . 属性名 访问父类的属性
super . 方法名() 访问父类的方法
super() 调用父类的构造方法