子类可以直接调用父类中的非私有属性
在子类中定义了同名的成员变量,在子类中,根据就近原则来进行访问
class Fu{ int x = 10; } class Zi extends Fu{ int x = 100; public void method(){ System.out.println(x); //调用父类的 //System.out.println(super.x); } } public class Demo{ public static void main(String[] args){ Zi zi = new Zi(); zi.method();//100 } } 如果子类中有成员变量与父类中成员变量同名,还想调用父类的属性,则需要在调用时加上super–>super.x。
在初始化子类数据前,必须先完成对父类数据的初始化;
实例化子类对象时,会隐式调用父类无参构造方法(在构造方法第一句默认加上super(),默认访问父类的空参构造);
如果需要调用父类的有参构造,则需要通过显式super(参数列表)进行调用;
当显式super(参数列表)进行调用父类带参构造时,原隐式调用父类无参构造消失;
父类定义了带参构造后无参构造消失,子类(继承)无参构造会报错(因为有隐式调用super(););
构造方法中不能同时存在this()和super(),两个在语法上都要求放在构造方法的第一行;
一个类没有显示继承父类,则默认继承Object类
练习:Java继承中的构造代码块和构造方法执行顺序–层次初始化
class Fu { static { System.out.println("静态代码块Fu");//随类而加载,先加载父类的静态代码块,后执行子类的静态代码块 } { System.out.println("构造代码块Fu");//随对象创建而执行(多次) //对象的初始化过程:父类对象的初始化过程(构造代码块 -> 构造方法)> 子类对象的初始化过程(构造代码块 -> 构造方法)。这步(构造代码块)是随类的加载而加载。 } public F() { System.out.println("构造方法Fu"); } } class Zi extends Fu { static { System.out.println("静态代码块Zi"); } { System.out.println("构造代码块Zi"); } public Zi() { System.out.println("构造方法Zi"); } } public class Demo{ public static void main(String[] args){ Zi zi = new Zi(); } } 子类可以直接调用父类的非私有方法,也可以调用子类的特有方法,但是父类不能调用子类的特有方法。
在子父类中出现方法名相同,但两个方法的实现内容不一样的
重写:
在父类无法满足子类需求时,就可以使用重写;
在具有继承关系的类中,存在同一个方法名,参数相同,返回值类型相 同的方法,就是方法重写(override);
@Override注释可以验证子类方法是否对父类方法重写正确;
父类的static方法和private方法无法被重写;
方法在重写时,权限(权限修饰符)不能越来越小。
一个子类只能继承一个父类
子类可以使用父类成员,同时也可以使用祖类成员
限制局部变量的生命周期/使用范围(大括号外失效)
将多个构造函数中相同代码定义在构造代码块中,从而减少代码冗余
在创建对象时执行,由jvm默认调用
在构造方法执行之前,执行
静态属性赋值,环境变量赋值,设置默认数据(用于执行只需要执行一次的代码)
不会根据对象创建次数而多次执行,只会执行一次;
在类加载的过程中执行的,早于所以的对象相关内容;
表示最终类,不能有子类,其中所以方法不能被重写
方法无法被重写
该属性的值无法被修改(常量)