publicclassSuperOperator{publicstaticvoidmain(String[] args){/*
TODO 继承中的构造方法:
1.对于子类对象在构建时,必须先创建其父类对象
2.对于子类对象在调用构造方法时,默认需要先调用父类的无参构造
3.在子类中使用super()调用父类的构造方法,必须要放在子类构造方法的第一行 ?
由于必须要先构建父类对象,所以根据代码执行顺序,需要先将父类的构造方法执行完成
TODO 使用 super 关键字
super关键字用于表示父类,可以通过 super()调用父类的构造方法 或者使用 super.调用成员方法或变量
*/Son son =newSon("李杨",17);
son.show();System.out.println("===================");Zi z =newZi();
z.show();}}/*
对于一个代码文件中,只能存在有一个 public 修饰的class类
*/classGrandFather{String name;int age;publicGrandFather(){System.out.println("爷爷出现了...");}publicfinalvoidshow(){System.out.println("我叫"+ name +" 今年:"+ age);}}//final class Father extends GrandFather {classFatherextendsGrandFather{publicFather(String name,int age){super.name = name;this.age = age;System.out.println("父亲出现了...");}}classSonextendsFather{publicSon(String name,int age){super(name,age);System.out.println("儿子出现了...");}// @Override// public void show() {// System.out.println("这是儿子中重新定义的show方法");// }}classFu{publicint num =10;publicFu(){System.out.println("fu");}}classZiextendsFu{publicint num =20;publicZi(){System.out.println("zi");}publicvoidshow(){int num =30;System.out.println(num);System.out.println(this.num);System.out.println(super.num);}}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
5. final关键字
importjava.util.Arrays;publicclassDemo_Final{finalstaticdoublePI=3.145926;finalstaticint[]INT_NUM={3,4,6,5};publicstaticvoidmain(String[] args){/*
TODO final
① 使用该关键字修饰class,后续不能被其他的类所继承 表示为最终类
② 使用该关键字修饰方法,后续不能被其他的子类所重写
③ 使用该关键字修饰变量,表示一个常量 定义后不可改变其中的数据 必须要进行初始化
常量的命名:所有单词字母大写,单词间使用 下划线 连接
*/System.out.println(PI);// PI = 3.1459267;INT_NUM[0]=4;// INT_NUM = new int[5]; // 对于引用类型赋值不能修改其内存地址,但是可以修改其地址上对象的数据System.out.println(Arrays.toString(INT_NUM));}}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
6.多态
publicclassMoreFormat{publicstaticvoidmain(String[] args){/*
TODO 多态
前提条件,当多个类或者接口之间存在有继承或实现关系时,此时对于每个类都可以有其他的表示方式
举例:
张三 <= 张三人
张三他爸爸的儿子 <= 张三人
张三他爷爷的孙子 <= 张三人
对于一个人 可以有多种表示形式
什么需要有多态??
① 对于继承关系来说,父类所有的变量及方法 其子类可以被继承
② 当父类在方法中被调用时,那么其子类也应该满足其要求
③ 为了增加方法的灵活性,可以将子类的对象传给父类变量进行使用
多态定义: 父类引用指向子类对象
注意:
① 对于子类中独有的方法,当有多态时,不能通过父类引用调用子类对象的独有方法
② 在强制类型转换时,需要存在有继承关系,才能相互转换
③ 强制类型转换,不能违反多态的体系 父类引用指向子类对象
*/Sn son1 =newSn("李白",18);Fa son2 =newSn("李白",18);// 多态GrandFa son3 =newSn("李白",18);// 多态GrandFa grandFa =newGrandFa();useInfo(grandFa);//useInfo(son1);// son2.pl//playGame()为son类中的独有方法,若是多态则无法引用,所有要进行强制类型转换Sn changeType2Son =(Sn) son3;
changeType2Son.playGame();// String son31 = (String) son3;// Sn sn1 = new GrandFa(); // 出错// 错误// Sn fa = (Sn) grandFa; // grandFa变量中实际上保存的是 GrandFa 对象地址 进行强制类型转换// fa.playGame();/*
TODO 多态中成员访问特点
成员方法/成员变量:
编译看左边,运行看右边
静态方法:
编译看左边,运行看左边
*/Sn sn1 =newSn("彭飞",18);System.out.println(sn1.name);GrandFa grandFa1 =newSn("彭飞",18);System.out.println(grandFa1.name);System.out.println(grandFa1.age);// System.out.println(grandFa1.skill);//默认调用子类中的show()方法
grandFa1.show();//编译看左边,运行看左边
grandFa1.run();// 爷爷走路步履蹒跚...}publicstaticvoiduseInfo(GrandFa grandFa){System.out.println("获取到了一个对象,其姓名为:"+ grandFa.name +"年龄为:"+ grandFa.age);}// public static void useInfo(Sn grandFa){// System.out.println("获取到了一个对象,其姓名为:"+grandFa.name+"年龄为:"+grandFa.age);// }}/*
TODO 在相同的包下,类只能被定义一次,除了内部类形式
*/classGrandFa{String name;int age;publicGrandFa(){this.name ="爷爷";this.age =60;System.out.println("爷爷出现了...");}publicvoidshow(){System.out.println("爷爷:"+"我叫"+ name +" 今年:"+ age);}//static:静态方法publicstaticvoidrun(){System.out.println("爷爷走路步履蹒跚...");}}//final class Father extends GrandFather {classFaextendsGrandFa{publicFa(String name,int age){// super.name = name;this.name = name;this.age = age;System.out.println("父亲出现了...");}}classSnextendsFa{String name;String skill;publicSn(String name,int age){super(name, age);this.name = name;this.age = age;System.out.println("儿子出现了...");}publicvoidshow(){System.out.println("孙子:我叫"+ name +" 今年:"+ age);}publicvoidplayGame(){System.out.println("孙子年轻,游戏玩的溜溜的...");}publicstaticvoidrun(){System.out.println("孙子走路蹦蹦跳跳");}}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
7.抽象类
publicclassAbstractClazz{publicstaticvoidmain(String[] args){/*
TODO 抽象类:
在Java中表示抽象概念的类,可以定义为一个抽象类
抽象类定义:
abstract 用于修饰抽象类
对于抽象类,不能进行实例化
抽象类可以定义非抽象方法
抽象方法:
在定义方法时,没有给定具体的方法体,并且需要使用abstract修饰
子类继承抽象类:
① 如果子类不是抽象类并且当抽象类中存在有抽象方法,那么需要通过重写实现其抽象方法的逻辑
② 子类可以继承到抽象类中的非抽象方法
为什么需要有抽象方法:
在定义一个抽象类时,需要定义一个抽象方法,用于标记当前抽象类是存在有该行为的
主要的作用是为了规范代码 对于方法的参数以及返回值类型都已经固定了
抽象类的使用场景:
1.当开发代码时,对于具体的功能不知道如何进行运行或定义时,
可以先给定一个抽象类,再调用其中的抽象方法 如果当其他开发人员 再开发相关的功能时,就可以
重写其对应的代码,实现功能
*///补:/*
一个类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?
可以,对于某一些类中存在有共有的方法,同时逻辑也相同,但是没有一个具体的类,可以将该方法
去表示出来,所以需要有一个抽象的概念,来表示,所以需要使用抽象类
*//*
abstract不能和哪些关键字共存
private 冲突 => 私有 => 如果私有那么子类无法继承,也无法对其抽象方法进行重写 无意义
final 冲突 => 最终 => final 的类不能被继承,对于抽象类无法构造本身的实例对象,无意义
static 无意义 => 属于类的 => 可以写但没有意义
*/Animal animal =newAnimal();// 对于Animal类来说,表示的应该是一个概念性
animal.run();// run方法,对于不同的子类,会对其方法进行重写// new AbstractAnimal().run(); //抽象类不能实例化DogAb dogAb =newDogAb();
dogAb.run();
dogAb.eat();/*
TODO 使用抽象类
可以通过 子实现类(继承抽象类的类)来调用重写/继承的方法
*/useAbstractAnimal(newDogAb());// new AbstractA();C c =newC();}publicstaticvoiduseAbstractAnimal(AbstractAnimal animal){
animal.run();}}abstractclassAbstractAnimal{publicabstractvoidrun();// 定义一个抽象方法publicvoideat(){System.out.println("动物需要觅食..");}}classDogAbextendsAbstractAnimal{@Overridepublicvoidrun(){System.out.println("狗可以四肢行走...");}// public abstract void sleep(); // 有抽象方法的类一定是抽象类}/*
TODO 抽象类的继承关系
*/abstractclassAbstractA{/*
TODO 抽象类构造方法:
1.对于抽象方法不能直接使用new 进行调用,但是可以通过创建子类对象的方式来进行调用
*/publicAbstractA(){System.out.println("这是抽象类中的构造方法");}publicabstractvoidfunction();}abstractclassAbstractBextendsAbstractA{/*
对于抽象类继承抽象类,可以选择重写其方法,也可以不重写其方法
*/@Overridepublicvoidfunction(){System.out.println("这是B抽象类中重写的方法");}}classCextendsAbstractA{@Overridepublicvoidfunction(){System.out.println("这是C具体类中重写的方法");}}classDextendsAbstractB{/*
TODO 对于B中继承A的抽象方法已经被重写了,D再继承时,就可以不需要再重写
*/}