09.01 final关键字引入
例:
1 class Fu
2 {
3 public final void show()
4 {
5 System.out.println("访问底层资源");
6 }
7 }
8 class Zi extends Fu
9 {
10 public void show()
11 {
12 System.out.println("Zi show run");
13 }
14 }
15 class Demo
16 {
17 public static void main(String[] args)
18 {
19 Zi z = new Zi();
20 z.show();
21 }
22 }
上面的代码中父类中的show()方法如果不想被子类覆盖,可以使用final关键字修饰,当子类覆盖了父类中的show()方法,将会报以下错误:
final关键字是最终的意思,可以修饰类,成员变量,成员方法
09.02 final关键字修饰类,方法以及变量的特点
修饰类,类不能被继承
修饰方法,方法不能被重写
修饰变量,变量就变成了常量,只能被赋值一次



09.03 final关键字修饰局部变量
例:
1 class Student
2 {
3 int age = 10;
4 }
5 class Demo
6 {
7 public static void main(String[] args)
8 {
9 //final修饰基本类型的局部变量
10 final int x = 10;
11 //x = 20; 值不能被改变
12 System.out.println(x);
13
14 //final修饰引用类型的局部变量
15 final Student s = new Student();
16 //s = new Student(); 引用类型的地址值不能变
17 s.age = 20;
18 System.out.println(s.age);
19 }
20 }
final修饰基本类型的局部变量,该变量的值不能被改变
final修饰引用类型的局部变量,引用类型的地址值不能变
09.04 final修饰变量的初始化时机
例:
1 class Test
2 {
3 int num1;
4 final int num2; //在对象构造完毕前即可
5 public Test()
6 {
7 num1 = 100;
8 num2 = 200;
9 }
10 }
11 class Demo
12 {
13 public static void main(String[] args)
14 {
15 Test t = new Test();
16 System.out.println(t.num1);
17 System.out.println(t.num2);
18 }
19 }
09.05 多态的概述和前提条件
多态概述:某一个对象,在不同时刻表现出来的不同状态。
举例:猫可以是猫的类型。Cat c = new Cat();
同时猫也是动物的一种,也可以把猫称为动物。Animal a = new Animal();
多态的前提:
1.有继承关系
2.有方法重写
3.有父类引用指向子类对象
09.06 按照多态前提给出代码体现
1 class Fu
2 {
3 public void show()
4 {
5 System.out.println("Fu show run")
6 }
7 }
8 class Zi extends Fu
9 {
10 public void show()
11 {
12 System.out.println("Zi show run")
13 }
14 }
15 class Demo
16 {
17 public static void main(String[] args)
18 {
19 //父类引用指向子类对象
20 Fu f = new Zi();
21 }
22 }
09.07 多态中的成员访问特点
1.成员变量 编译看左边,运行看左边
例:
1 class Fu
2 {
3 public int num1 = 10;
4 }
5 class Zi extends Fu
6 {
7 public int num1 = 20;
8 public int num2 = 30;
9
10 }
11 class Demo
12 {
13 public static void main(String[] args)
14 {
15 //编译时查看Fu类中是否有num1,有就编译通过
16 Fu f = new Zi();
17 //运行时输出Fu类中的num1
18 System.out.println(f.num1);
19 //Fu类中没有num2,编译失败
20 //System.out.println(f.num2);
21 }
22 }
2.成员方法 编译看左边,运行看右边
例:
1 class Fu
2 {
3 public void show()
4 {
5 System.out.println("Fu show run");
6 }
7
8 }
9 class Zi extends Fu
10 {
11 public void show()
12 {
13 System.out.println("Zi show run");
14 }
15 public void method()
16 {
17 System.out.println("Zi method run");
18 }
19
20 }
21 class Demo
22 {
23 public static void main(String[] args)
24 {
25 Fu f = new Zi();
26 //编译时查看Fu类中是否有show()方法,有就编译通过
27 //运行时输出Zi类中show()方法
28 f.show();
29 //Fu类中没有num2,编译失败
30 //f.method();
31 }
32 }
3.静态方法 编译看左边,运行看左边(静态方法与类相关,不能算方法的重写)
例:
1 class Fu
2 {
3 public static void show()
4 {
5 System.out.println("Fu show run");
6 }
7
8 }
9 class Zi extends Fu
10 {
11 public static void show()
12 {
13 System.out.println("Zi show run");
14 }
15 public void method()
16 {
17 System.out.println("Zi method run");
18 }
19
20 }
21 class Demo
22 {
23 public static void main(String[] args)
24 {
25 Fu f = new Zi();
26 //编译时查看Fu类中是否有show()方法,有就编译通过
27 //运行时输出Fu类中show()方法
28 f.show();
29 }
30 }
09.08 多态的好处
多态的好处
提高了程序的维护性(由继承保证)
提高了程序的扩展性(由多态保证)
例:
1 class Animal
2 {
3 public void eat()
4 {
5 System.out.println("eat");
6 }
7 }
8 class Cat extends Animal
9 {
10 public void eat()
11 {
12 System.out.println("猫吃鱼");
13 }
14 }
15 class Dog extends Animal
16 {
17 public void eat()
18 {
19 System.out.println("狗吃肉");
20 }
21 }
22 class Demo
23 {
24 public static void main(String[] args)
25 {
26 Cat c = new Cat();
27 Dog d = new Dog();
28 method(c);
29 method(d);
30 }
31 //提高了代码的扩展性,前期定义的代码可以使用后期的内容
32 public static void method(Animal a)
33 {
34 a.eat();
35 }
36 }
09.09 多态的弊端
多态的弊端:不能访问子类特有功能
例:
1 class Fu
2 {
3 public void show()
4 {
5 System.out.println("Fu show run");
6 }
7 }
8 class Zi extends Fu
9 {
10 public void show()
11 {
12 System.out.println("Zi show run");
13 }
14 public void method()
15 {
16 System.out.println("Zi method run");
17 }
18 }
19 class Demo
20 {
21 public static void main(String[] args)
22 {
23 Fu f = new Zi();
24 f.show();
25 //错误,不能访问子类特有功能
26 //f.method();
27 }
28 }
09.10 多态中向上转型和向下转型
例:
1 class Fu
2 {
3 public void show()
4 {
5 System.out.println("Fu show run");
6 }
7 }
8 class Zi extends Fu
9 {
10 public void show()
11 {
12 System.out.println("Zi show run");
13 }
14 public void method()
15 {
16 System.out.println("Zi method run");
17 }
18 }
19 class Demo
20 {
21 public static void main(String[] args)
22 {
23 Fu f = new Zi();
24 f.show();
25 //使用向下转型以使用子类特有方法
26 Zi z = (Zi)f;
27 z.method();
28 }
29 }
运行结果:
Zi show run Zi method run
向上转型:从子到父,父类引用指向子类对象。例:Fu f = new Zi();
向下转型:从父到子,父类引用转为子类对象。例:Zi z = (Zi)f;
09.11 孔子装爹案例讲解多态现象
多态的问题理解:
1 class 孔子爹
2 {
3 public int age = 40;
4
5 public void teach()
6 {
7 System.out.println("讲解JavaSE");
8 }
9 }
10
11 class 孔子 extends 孔子爹
12 {
13 public int age = 20;
14 public void teach()
15 {
16 System.out.println("讲解论语");
17 }
18 public void playGame()
19 {
20 System.out.println("英雄联盟");
21 }
22 }
23
24 //Java培训特别火,很多人来请孔子爹去讲课,这一天孔子爹被请走了
25 //但是还有人来请,就剩孔子在家,价格还挺高。孔子一想,我是不是可以考虑去呢?
26 //然后就穿上爹的衣服,带上爹的眼睛,粘上爹的胡子。就开始装爹
27 //向上转型
28 孔子爹 k爹 = new 孔子();
29 //到人家那里去了
30 System.out.println(k爹.age); //40
31 k爹.teach(); //讲解论语
32 //k爹.playGame(); //这是儿子才能做的
33
34 //讲完了,下班回家了
35 //脱下爹的装备,换上自己的装备
36 //向下转型
37 孔子 k = (孔子) k爹;
38 System.out.println(k.age); //20
39 k.teach(); //讲解论语
40 k.playGame(); //英雄联盟
09.12 多态继承中的内存图解

09.13 多态中的对象变化内存图解

09.14 猫狗案例多态版
1 class Animal
2 {
3 public void eat()
4 {
5 System.out.println("吃饭");
6 }
7 }
8 class Cat extends Animal
9 {
10 public void eat()
11 {
12 System.out.println("猫吃鱼");
13 }
14 public void playGame()
15 {
16 System.out.println("猫玩游戏");
17 }
18 }
19 class Dog extends Animal
20 {
21 public void eat()
22 {
23 System.out.println("狗吃肉");
24 }
25 public void lookDoor()
26 {
27 System.out.println("狗看门");
28 }
29 }
30 class Demo
31 {
32 public static void main(String[] args)
33 {
34 Animal a = new Dog();
35 a.eat();
36 Dog d = (Dog)a;
37 d.lookDoor();
38 System.out.println("------");
39 a = new Cat();
40 a.eat();
41 Cat c = (Cat)a;
42 c.playGame();
43 }
44 }
运行结果:
狗吃肉 狗看门 ------ 猫吃鱼 猫玩游戏
09.15 南北方人案例
1 class Person
2 {
3 String name;
4 Person(String name)
5 {
6 this.name = name;
7 System.out.println(name);
8 }
9 public void eat()
10 {
11 System.out.println("吃饭");
12 }
13 }
14
15 class SouthPerson extends Person
16 {
17 SouthPerson(String name)
18 {
19 super(name);
20 }
21 public void eat()
22 {
23 System.out.println("炒菜,吃米饭");
24 }
25
26 public void jingShang()
27 {
28 System.out.println("经商");
29 }
30 }
31
32 class NorthPerson extends Person
33 {
34 NorthPerson(String name)
35 {
36 super(name);
37 }
38 public void eat()
39 {
40 System.out.println("炖菜,吃馒头");
41 }
42
43 public void yanJiu()
44 {
45 System.out.println("研究");
46 }
47 }
48 class Demo
49 {
50 public static void main(String[] args)
51 {
52 //测试
53 //南方人
54 Person p = new SouthPerson("南方人");
55 p.eat();
56 SouthPerson sp = (SouthPerson)p;
57 sp.jingShang();
58 System.out.println("--------");
59
60 //北方人
61 p = new NorthPerson("北方人");
62 p.eat();
63 NorthPerson np = (NorthPerson)p;
64 np.yanJiu();
65 }
66 }
运行结果:
南方人 炒菜,吃米饭 经商 -------- 北方人 炖菜,吃馒头 研究
09.16 多态的练习题看程序写结果
1.看程序写结果:先判断有没有问题,如果没有,写出结果
1 class Fu
2 {
3 public void show()
4 {
5 System.out.println("fu show run");
6 }
7 }
8
9 class Zi extends Fu
10 {
11 public void show()
12 {
13 System.out.println("zi show run");
14 }
15
16 public void method()
17 {
18 System.out.println("zi method run");
19 }
20 }
21 class Demo
22 {
23 public static void main(String[] args)
24 {
25 Fu f = new Zi();
26 //找不到符号
27 //f.method();
28 f.show();
29 }
30 }
运行结果:
zi show run
2.看程序写结果:先判断有没有问题,如果没有,写出结果
1 class A
2 {
3 public void show()
4 {
5 show2();
6 }
7 public void show2()
8 {
9 System.out.println("hello ");
10 }
11 }
12 class B extends A
13 {
14 /*
15 //从父类继承
16 public void show()
17 {
18 show2();
19 }
20 */
21
22 public void show2()
23 {
24 System.out.println("world ");
25 }
26 }
27 class C extends B
28 {
29 public void show()
30 {
31 super.show();
32 }
33 public void show2()
34 {
35 System.out.println("java ");
36 }
37 }
38 class Demo
39 {
40 public static void main(String[] args)
41 {
42 A a = new B();
43 a.show();
44
45 B b = new C();
46 b.show();
47 }
48 }
运行结果:
world java
09.17 抽象类的引入
动物本身并不是一个具体的事物,而是一个抽象的事物。只有真正的猫,狗才是具体的动物。同理,不同的动物吃的东西应该是不一样的,所以,我们不应该在动物类中给出具体体现,而是应该给出一个声明即可。
在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。
09.18 抽象类的特点
抽象类特点:
1.抽象类和抽象方法必须用abstract关键字修饰
格式: abstract class 类名 {}
public abstract void method();
2.抽象类不一定有抽象方法,有抽象方法的类一定是抽象类
3.抽象类不能实例化,因为抽象类不是具体的,抽象类有构造方法,按照多态的方式,由具体的子类实例化。其实这也是多态的一种,抽象类多态。
4.抽象类的子类如果不重写父类中的抽象方法,那么该子类还是抽象类,否则必须重写抽象类中的所有抽象方法
例:
1 abstract class Animal
2 {
3 public abstract void eat();
4 }
5 class Cat extends Animal
6 {
7 public void eat()
8 {
9 System.out.println("猫吃鱼");
10 }
11 }
12 class Demo
13 {
14 public static void main(String[] args)
15 {
16 //多态
17 Animal a = new Cat();
18 a.eat();
19 }
20 }
运行结果:
猫吃鱼
09.19 抽象类的成员特点
成员变量:可以是变量,也可以是常量
构造方法:有构造方法,但是不能实例化,构造方法的作用是用于子类访问父类数据的初始化
成员方法:可以有抽象方法限定子类必须完成某些动作,也可以有非抽象方法提高代码复用性
例:
1 abstract class Animal
2 {
3 public int num1 = 10;//变量
4 public final int num2 = 20;//常量
5 public Animal(){}//构造函数
6 public abstract void show();//抽象方法
7 public void method()//非抽象方法
8 {
9 System.out.println("Animal method run");
10 }
11 }
12 class Cat extends Animal
13 {
14 public void show()
15 {
16 System.out.println("Cat show run");
17 }
18 }
19 class Demo
20 {
21 public static void main(String[] args)
22 {
23 //创建对象
24 Animal a = new Cat();
25 System.out.println(a.num1);//访问变量
26 System.out.println(a.num2);//访问常量
27 a.show();//访问抽象方法
28 a.method();//访问非抽象方法
29 }
30 }
运行结果:
10 20 Cat show run Animal method run
09.20 抽象类练习猫狗案例
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 abstract class Animal
41 {
42 //姓名
43 private String name;
44 //年龄
45 private int age;
46
47 public Animal() {}
48
49 public Animal(String name,int age)
50 {
51 this.name = name;
52 this.age = age;
53 }
54
55 public String getName()
56 {
57 return name;
58 }
59
60 public void setName(String name)
61 {
62 this.name = name;
63 }
64
65 public int getAge()
66 {
67 return age;
68 }
69
70 public void setAge(int age)
71 {
72 this.age = age;
73 }
74
75 //定义一个抽象方法
76 public abstract void eat();
77 }
78 //定义具体的狗类
79 class Dog extends Animal
80 {
81 public Dog() {}
82
83 public Dog(String name,int age)
84 {
85 super(name,age);
86 }
87
88 public void eat()
89 {
90 System.out.println("狗吃肉");
91 }
92 }
93
94 //定义具体的猫类
95 class Cat extends Animal
96 {
97 public Cat() {}
98
99 public Cat(String name,int age)
100 {
101 super(name,age);
102 }
103
104 public void eat()
105 {
106 System.out.println("猫吃鱼");
107 }
108 }
109 class Demo
110 {
111 public static void main(String[] args)
112 {
113 //测试狗类,具体类用法 方式1
114 Dog d = new Dog();
115 d.setName("旺财");
116 d.setAge(3);
117 System.out.println(d.getName()+"---"+d.getAge());
118 d.eat();
119 //测试狗类,具体类用法 方式2:
120 Dog d2 = new Dog("旺财",3);
121 System.out.println(d2.getName()+"---"+d2.getAge());
122 d2.eat();
123 System.out.println("-------------");
124 //测试狗类,多态用法 方式1:
125 Animal a = new Dog();
126 a.setName("旺财");
127 a.setAge(3);
128 System.out.println(a.getName()+"---"+a.getAge());
129 a.eat();
130 //测试狗类,多态用法 方式2:
131 Animal a2 = new Dog("旺财",3);
132 System.out.println(a2.getName()+"---"+a2.getAge());
133 a2.eat();
134 }
135 }
运行结果:
旺财---3 狗吃肉 旺财---3 狗吃肉 ------------- 旺财---3 狗吃肉 旺财---3 狗吃肉
09.21 抽象类练习老师案例
1 /*
2 老师案例
3 具体事物:基础班老师,就业班老师
4 共性:姓名,年龄,讲课。
5
6 分析:
7 基础班老师
8 姓名,年龄
9 讲课。
10 就业班老师
11 姓名,年龄
12 讲课。
13 实现:
14 老师类
15 基础班老师
16 就业班老师
17 */
18 //定义抽象的老师类
19 abstract class Teacher
20 {
21 //姓名
22 private String name;
23 //年龄
24 private int age;
25
26 public Teacher() {}
27
28 public Teacher(String name,int age)
29 {
30 this.name = name;
31 this.age = age;
32 }
33
34 public String getName()
35 {
36 return name;
37 }
38
39 public void setName(String name)
40 {
41 this.name = name;
42 }
43
44 public int getAge()
45 {
46 return age;
47 }
48
49 public void setAge(int age)
50 {
51 this.age = age;
52 }
53
54 //抽象方法
55 public abstract void teach();
56 }
57
58 //基础班老师类
59 class BasicTeacher extends Teacher
60 {
61 public BasicTeacher(){}
62
63 public BasicTeacher(String name,int age)
64 {
65 super(name,age);
66 }
67
68 public void teach()
69 {
70 System.out.println("基础班老师讲解JavaSE");
71 }
72 }
73
74 //就业班老师类
75 class WorkTeacher extends Teacher
76 {
77 public WorkTeacher(){}
78
79 public WorkTeacher(String name,int age)
80 {
81 super(name,age);
82 }
83
84 public void teach()
85 {
86 System.out.println("就业班老师讲解JavaEE");
87 }
88 }
89 class Demo
90 {
91 public static void main(String[] args)
92 {
93 //多态测试
94 //基础班老师
95 Teacher t = new BasicTeacher();
96 t.setName("小明");
97 t.setAge(30);
98 System.out.println(t.getName()+"---"+t.getAge());
99 t.teach();
100 System.out.println("--------------------");
101
102 t = new BasicTeacher("小明",30);
103 System.out.println(t.getName()+"---"+t.getAge());
104 t.teach();
105 System.out.println("--------------------");
106
107 //就业班老师
108 t = new WorkTeacher();
109 t.setName("小红");
110 t.setAge(35);
111 System.out.println(t.getName()+"---"+t.getAge());
112 t.teach();
113 System.out.println("--------------------");
114
115 t = new WorkTeacher("小红",35);
116 System.out.println(t.getName()+"---"+t.getAge());
117 t.teach();
118 }
119 }
运行结果:
小明---30 基础班老师讲解JavaSE -------------------- 小明---30 基础班老师讲解JavaSE -------------------- 小红---35 就业班老师讲解JavaEE -------------------- 小红---35 就业班老师讲解JavaEE
09.22 抽象类练习学员案例
1 /*
2 学生案例
3 具体事务:基础班学员,就业班学员
4 共性:姓名,年龄,班级,学习,吃饭
5
6 分析:
7 基础班学员
8 成员变量:姓名,年龄,班级
9 成员方法:学习,吃饭
10 就业班学员
11 成员变量:姓名,年龄,班级
12 成员方法:学习,吃饭
13
14 得到一个学员类。
15 成员变量:姓名,年龄,班级
16 成员方法:学习,吃饭
17
18 实现:
19 学员类
20 基础班学员
21 就业班学员
22 */
23 //定义抽象学员类
24 abstract class Student
25 {
26 //姓名
27 private String name;
28 //年龄
29 private int age;
30 //班级
31 private String grand;
32
33 public Student() {}
34
35 public Student(String name,int age,String grand)
36 {
37 this.name = name;
38 this.age = age;
39 this.grand = grand;
40 }
41
42 public String getName()
43 {
44 return name;
45 }
46
47 public void setName(String name)
48 {
49 this.name = name;
50 }
51
52 public int getAge()
53 {
54 return age;
55 }
56
57 public void setAge(int age)
58 {
59 this.age = age;
60 }
61
62 public String getGrand()
63 {
64 return grand;
65 }
66
67 public void setGrand(String grand)
68 {
69 this.grand = grand;
70 }
71
72 //学习
73 public abstract void study();
74
75 //吃饭
76 public void eat()
77 {
78 System.out.println("吃饭");
79 }
80 }
81
82 //具体基础班学员类
83 class BasicStudent extends Student
84 {
85 public BasicStudent() {}
86
87 public BasicStudent(String name,int age,String grand)
88 {
89 super(name,age,grand);
90 }
91 //重写父类抽象方法
92 public void study()
93 {
94 System.out.println("基础班学员学习JavaSE");
95 }
96 }
97
98 //具体就业班学员类
99 class WorkStudent extends Student
100 {
101 public WorkStudent() {}
102
103 public WorkStudent(String name,int age,String grand)
104 {
105 super(name,age,grand);
106 }
107 //重写父类抽象方法
108 public void study()
109 {
110 System.out.println("就业班学员学习JavaEE");
111 }
112 }
113 class Demo
114 {
115 public static void main(String[] args)
116 {
117 //按照多态的方式测试基础班学员
118 Student s = new BasicStudent();
119 s.setName("小明");
120 s.setAge(27);
121 s.setGrand("1111");
122 System.out.println(s.getName()+"---"+s.getAge()+"---"+s.getGrand());
123 s.study();
124 s.eat();
125 System.out.println("--------------");
126
127 s = new BasicStudent("小红",28,"1111");
128 System.out.println(s.getName()+"---"+s.getAge()+"---"+s.getGrand());
129 s.study();
130 s.eat();
131 }
132 }
运行结果:
小明---27---1111 基础班学员学习JavaSE 吃饭 -------------- 小红---28---1111 基础班学员学习JavaSE 吃饭
09.23 抽象类练习员工案例
假如我们在开发一个系统时需要对员工类进行设计,员工包含3个属性:姓名、工号以及工资。
经理也是员工,除了含有员工的属性外,另为还有一个奖金属性。
请使用继承的思想设计出员工类和经理类。要求类中提供必要的方法进行属性访问。
1 /*
2
3 分析:
4 普通员工类
5 成员变量:姓名、工号以及工资。
6 成员方法:工作
7 经理类:
8 成员变量:姓名、工号以及工资,奖金属性
9 成员方法:工作
10
11 实现:
12 员工类:
13 普通员工类:
14 经理类:
15 */
16 //定义员工类
17 abstract class Employee
18 {
19 //姓名、工号以及工资
20 private String name;
21 private String id;
22 private int salary;
23
24 public Employee() {}
25
26 public Employee(String name,String id,int salary)
27 {
28 this.name = name;
29 this.id = id;
30 this.salary = salary;
31 }
32
33 public String getName()
34 {
35 return name;
36 }
37
38 public void setName(String name)
39 {
40 this.name = name;
41 }
42
43 public String getId()
44 {
45 return id;
46 }
47
48 public void setId(String id)
49 {
50 this.id = id;
51 }
52
53 public int getSalary()
54 {
55 return salary;
56 }
57
58 public void setSalary(int salary)
59 {
60 this.salary = salary;
61 }
62
63 //工作
64 public abstract void work();
65 }
66
67 //普通员工类
68 class Programmer extends Employee
69 {
70 public Programmer(){}
71
72 public Programmer(String name,String id,int salary)
73 {
74 super(name,id,salary);
75 }
76
77 public void work()
78 {
79 System.out.println("按照需求写代码");
80 }
81 }
82
83 //经理类
84 class Manager extends Employee
85 {
86 //奖金
87 private int money;
88
89 public Manager(){}
90
91 public Manager(String name,String id,int salary,int money)
92 {
93 super(name,id,salary);
94 this.money = money;
95 }
96
97 public void work()
98 {
99 System.out.println("跟客户谈需求");
100 }
101
102 public int getMoney()
103 {
104 return money;
105 }
106
107 public void setMoney(int money)
108 {
109 this.money = money;
110 }
111 }
112 class Demo
113 {
114 public static void main(String[] args)
115 {
116 //测试普通员工
117 Employee emp = new Programmer();
118 emp.setName("小明");
119 emp.setId("czbk001");
120 emp.setSalary(18000);
121 System.out.println(emp.getName()+"---"+emp.getId()+"---"+emp.getSalary());
122 emp.work();
123 System.out.println("-------------");
124 emp = new Programmer("小明","czbk001",18000);
125 System.out.println(emp.getName()+"---"+emp.getId()+"---"+emp.getSalary());
126 emp.work();
127 System.out.println("-------------");
128
129 //由于子类有特有的内容,所以我们用子类来测试
130 Manager m = new Manager();
131 m.setName("小红");
132 m.setId("czbk002");
133 m.setSalary(8000);
134 m.setMoney(2000);
135 System.out.println(m.getName()+"---"+m.getId()+"---"+m.getSalary()+"---"+m.getMoney());
136 m.work();
137 System.out.println("-------------");
138
139 //通过构造方法赋值
140 m = new Manager("小红","czbk002",8000,2000);
141 System.out.println(m.getName()+"---"+m.getId()+"---"+m.getSalary()+"---"+m.getMoney());
142 m.work();
143 }
144 }
运行结果:
小明---czbk001---18000 按照需求写代码 ------------- 小明---czbk001---18000 按照需求写代码 ------------- 小红---czbk002---8000---2000 跟客户谈需求 ------------- 小红---czbk002---8000---2000 跟客户谈需求
09.24 抽象类中的小问题
1.一个类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?
可以。不让创建对象。
2.abstract不能和哪些关键字共存
private 冲突
final 冲突
static 无意义
09.25 接口的引入
为了体现事物功能的扩展性,Java中就提供了接口来定义这些额外功能,并不给出具体实现,将来哪些猫狗需要被培训,只需要这部分猫狗把这些额外功能实现即可。
09.26 接口的特点
接口特点:接口用关键字interface表示,格式:interface 接口名 {}
类实现接口用implements表示,格式:class 类名 implements 接口名 {}
接口不能实例化,按照多态的方式,由具体的子类实例化。其实这也是多态的一种,接口多态。
接口的子类要么是抽象类,要么重写接口中的所有抽象方法
09.27 接口的成员特点
成员变量:只能是常量,默认修饰符 public static final
构造方法:没有,因为接口主要是扩展功能的,而没有具体存在
成员方法:只能是抽象方法,默认修饰符 public abstract
09.28 类与类,类与接口,接口与接口的关系
类与类的关系:继承关系,只能单继承,但是可以多层继承
类与接口的关系:实现关系,可以单实现,也可以多实现。还可以在继承一个类的同时实现多个接口
接口与接口的关系:继承关系,可以单继承,也可以多继承
09.29 抽象类和接口的区别
成员区别:
抽象类:成员变量,可以是变量也可以是常量。构造方法,有。成员方法,可以是抽象方法也可以是非抽象方法
接口:成员变量,只可以是常量。构造方法,没有。成员方法,只可以是抽象方法
关系区别:
类与类继承,单继承
类与接口实现,单实现,多实现
接口与接口继承,单继承,多继承
设计理念区别:
抽象类被继承体现的是:”is a”的关系。继承体系的共性功能
接口被实现体现的是:”like a”的关系。继承体系的扩展功能
09.30 猫狗案例加入跳高功能分析
猫狗案例,加入跳高的额外功能
分析:从具体到抽象
猫:姓名,年龄 吃饭,睡觉
狗:姓名,年龄 吃饭,睡觉
由于有共性功能,所以,我们抽取出一个父类:
动物:姓名,年龄 吃饭();睡觉(){}
猫:继承自动物
狗:继承自动物
跳高的额外功能是一个新的扩展功能,所以我们要定义一个接口:跳高
部分猫:实现跳高
部分狗:实现跳高
实现:从抽象到具体
使用:使用具体类
09.31 猫狗案例加入跳高功能代码实现
1 //定义跳高接口
2 interface Jumpping
3 {
4 //跳高功能
5 public abstract void jump();
6 }
7
8 //定义抽象类
9 abstract class Animal
10 {
11 //姓名
12 private String name;
13 //年龄
14 private int age;
15
16 public Animal() {}
17
18 public Animal(String name,int age)
19 {
20 this.name = name;
21 this.age = age;
22 }
23
24 public String getName()
25 {
26 return name;
27 }
28
29 public void setName(String name)
30 {
31 this.name = name;
32 }
33
34 public int getAge()
35 {
36 return age;
37 }
38
39 public void setAge(int age)
40 {
41 this.age = age;
42 }
43
44 //吃饭();
45 public abstract void eat();
46
47 //睡觉(){}
48 public void sleep()
49 {
50 System.out.println("睡觉");
51 }
52 }
53
54 //具体猫类
55 class Cat extends Animal
56 {
57 public Cat(){}
58
59 public Cat(String name,int age)
60 {
61 super(name,age);
62 }
63
64 public void eat()
65 {
66 System.out.println("猫吃鱼");
67 }
68 }
69
70 //具体狗类
71 class Dog extends Animal
72 {
73 public Dog(){}
74
75 public Dog(String name,int age)
76 {
77 super(name,age);
78 }
79
80 public void eat()
81 {
82 System.out.println("狗吃肉");
83 }
84 }
85
86 //有跳高功能的猫
87 class JumpCat extends Cat implements Jumpping
88 {
89 public JumpCat() {}
90
91 public JumpCat(String name,int age)
92 {
93 super(name,age);
94 }
95
96 public void jump()
97 {
98 System.out.println("跳高猫");
99 }
100 }
101
102 //有跳高功能的狗
103 class JumpDog extends Dog implements Jumpping
104 {
105 public JumpDog() {}
106
107 public JumpDog(String name,int age)
108 {
109 super(name,age);
110 }
111
112 public void jump()
113 {
114 System.out.println("跳高狗");
115 }
116 }
117 class Demo
118 {
119 public static void main(String[] args)
120 {
121 //定义猫并测试
122 JumpCat jc = new JumpCat();
123 jc.setName("哆啦A梦");
124 jc.setAge(3);
125 System.out.println(jc.getName()+"---"+jc.getAge());
126 jc.eat();
127 jc.sleep();
128 jc.jump();
129 System.out.println("-----------------");
130
131 JumpCat jc2 = new JumpCat("加菲猫",2);
132 System.out.println(jc2.getName()+"---"+jc2.getAge());
133 jc2.eat();
134 jc2.sleep();
135 jc2.jump();
136 }
137 }
运行结果:
哆啦A梦---3 猫吃鱼 睡觉 跳高猫 ------------ 加菲猫---2 猫吃鱼 睡觉 跳高猫
09.32 老师学生案例加入抽烟功能分析及代码实现
1 /*
2 老师和学生案例,加入抽烟的额外功能
3 分析:从具体到抽象
4 老师:姓名,年龄,吃饭,睡觉
5 学生:姓名,年龄,吃饭,睡觉
6 由于有共性功能,我们提取出一个父类,人类。
7 人类:
8 姓名,年龄
9 吃饭();
10 睡觉(){}
11 抽烟的额外功能不是人或者老师,或者学生一开始就应该具备的,所以,我们把它定义为接口
12 部分老师抽烟:实现抽烟接口
13 部分学生抽烟:实现抽烟接口
14 实现:从抽象到具体
15 */
16 //定义抽烟接口
17 interface Smoking
18 {
19 //抽烟的抽象方法
20 public abstract void smoke();
21 }
22
23 //定义抽象人类
24 abstract class Person
25 {
26 //姓名
27 private String name;
28 //年龄
29 private int age;
30
31 public Person() {}
32
33 public Person(String name,int age)
34 {
35 this.name = name;
36 this.age = age;
37 }
38
39 public String getName()
40 {
41 return name;
42 }
43
44 public void setName(String name)
45 {
46 this.name = name;
47 }
48
49 public int getAge()
50 {
51 return age;
52 }
53
54 public void setAge(int age)
55 {
56 this.age = age;
57 }
58
59 //吃饭();
60 public abstract void eat();
61
62 //睡觉(){}
63 public void sleep()
64 {
65 System.out.println("睡觉");
66 }
67 }
68
69 //具体老师类
70 class Teacher extends Person
71 {
72 public Teacher() {}
73
74 public Teacher(String name,int age)
75 {
76 super(name,age);
77 }
78
79 public void eat()
80 {
81 System.out.println("吃大白菜");
82 }
83 }
84
85 //具体学生类
86 class Student extends Person
87 {
88 public Student() {}
89
90 public Student(String name,int age)
91 {
92 super(name,age);
93 }
94
95 public void eat()
96 {
97 System.out.println("吃红烧肉");
98 }
99 }
100
101 //抽烟的老师
102 class SmokingTeacher extends Teacher implements Smoking
103 {
104 public SmokingTeacher() {}
105
106 public SmokingTeacher(String name,int age)
107 {
108 super(name,age);
109 }
110
111 public void smoke()
112 {
113 System.out.println("抽烟的老师");
114 }
115 }
116
117 //抽烟的学生
118 class SmokingStudent extends Student implements Smoking
119 {
120 public SmokingStudent() {}
121
122 public SmokingStudent(String name,int age)
123 {
124 super(name,age);
125 }
126
127 public void smoke()
128 {
129 System.out.println("抽烟的学生");
130 }
131 }
132 class Demo
133 {
134 public static void main(String[] args)
135 {
136 //测试学生
137 SmokingStudent ss = new SmokingStudent();
138 ss.setName("小明");
139 ss.setAge(27);
140 System.out.println(ss.getName()+"---"+ss.getAge());
141 ss.eat();
142 ss.sleep();
143 ss.smoke();
144 System.out.println("------------");
145
146 SmokingStudent ss2 = new SmokingStudent("小强",30);
147 System.out.println(ss2.getName()+"---"+ss2.getAge());
148 ss2.eat();
149 ss2.sleep();
150 ss2.smoke();
151 }
152 }
原文:http://www.cnblogs.com/hoop-superman/p/5495694.html