第四天-Java继承
制作Java文档
通过命令:javadoc -d 目录 -author -version 文件.java代码块
在Java中,使用{}括起来的代码被成为代码块。根据其位置和声明的不同,可以分为
局部代码块:局部位置,限定变量的生命周期构造代码块:在内中的成员位置作用:可以把多个构造方法中的共同代码放在一起, 对对象进行初始化。静态代码块:在内中的成员位置,要用static修饰作用:一般是对类进行初始化问题:静态代码块,构造代码块,构造方法的执行顺序
静态代码块 -- 构造代码块-- 构造方法 静态代码块:只执行一次构造代码块:每次调用构造方法都执行继承
优点:
- 提高了代码的复用性
- 提高了代码的维护性
- 让类与类之间产生了关系,是多态的前提
- Java只支持单继承,不支持多继承,
- Java支持多层继承
缺点:
让类的耦合性增加,某个类的改变,会影响其他和该类相关的类
高内聚,低耦合耦合:类与类的关系
内聚:方法之间的调用
封装性被破坏
注意:一个类的初始化过程
成员变量进行初始化 默认初始化 显示初始化 构造方法初始化 静态代码块的内容会优先执行; 子类初始化之前会先进行父类初始化(分层初始化)Java继承中的成员关系
成员变量
- 子类的成员变量与父类的成员变量名称不一致
- 子类的成员变量与父类的成员变量名称一致
子类方法访问变量的顺序:
在子类方法的局部范围找,有就使用
在子类的成员范围找,有就使用
在父类的成员范围找,有就使用
成员方法
- 子类的成员方法与父类的成员方法名称不一致
- 子类的成员方法与父类的成员方法名称一致的
通过子类对象访问一个方法的查找顺序
在子类中找,有就使用
在父类中找,有就使用
构造方法
- 子类的构造方法默认访问父类的无參构造方法
为了子类访问父类数据的初始化 - 父类中如果没有无參构造方法?
子类通过super明确调用带參构造
- 子类的构造方法默认访问父类的无參构造方法
问题:为什么类中的所有的构造方法默认都会访问父类中空参数的构造方法?
因为子类会继承父类中的数据,
可能还会使用父类的数据。
所以,在子类初始化之前,一定要先完成父类数据的初始化。
所以子类构造方法的第一条语句默认都是super();this和super是什么?
this是本类对应的引用
super代表父类存储空间的标识
如何在子类中调用父类的构造方法?
super(…)
如何调用本类的构造方法?
this(…)
方法重写Override和方法重载Overload
方法重写:和父类一模一样的方法声明
方法重载:同一个类中,方法名相同,参数列表不同的现象,能改变返
回值类型,与返回值类型无关。一些代码演示
public class TestExtends2 {public static void main(String[] args) {Child child = new Child();} }class Parent{static{System.out.println("静态Parent");}{System.out.println("构造Parent");}public Parent(){System.out.println("构造方法Parent");} }class Child extends Parent{static{System.out.println("静态Child");}{System.out.println("构造Child");}public Child(){System.out.println("构造方法Child");} }
输出结果:
静态Parent
静态Child
构造Parent
构造方法Parent
构造Child
构造方法Child
演示2:
class X {Y b = new Y();X() {System.out.print("X");}
}class Y {Y() {System.out.print("Y");}
}public class Z extends X {Y y = new Y();Z() {//super();System.out.print("Z");}public static void main(String[] args) {new Z(); }
}
结果:
YXYZ
注意: 虽然子类中构造方法都默认一个super(),初始化的时候,不是按照那个顺序进行的,而是标识分层初始化进行的,它仅仅标识要先初始化父类数据,再初始化子类数据。
演示3:
public class TestExtends {public static void main(String[] args) {new Student().testAge();new Student().testSex();new Student().testInnerSex();new Student().testAll();}}class Person{public int age = 0;public int sex = 1;private int address;}class Student extends Person{public int sex = 2;public void testAge(){System.out.println(age);//0// 报错,父类的private权限不能直接访问成员变量//System.out.println(address);}public void testSex(){System.out.println(sex);//2}public void testInnerSex(){int sex = 3;System.out.println(sex);//3}public void testAll(){int sex = 4;System.out.println(sex);//4System.out.println(this.sex);//2System.out.println(super.sex);//1}}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
