LY.JAVA面向对象编程.final、多态、抽象类、接口

2018-07-08    13:47:26

 final关键字

 多态

 从右向前念

                            

 

多态的成员访问特点及转型的理解

 1 多态的问题理解:
 2     class 孔子爹 {
 3         public int age = 40;
 4         
 5         public void teach() {
 6             System.out.println("讲解JavaSE");
 7         }
 8     }
 9     
10     class 孔子 extends 孔子爹 {
11         public int age = 20;
12         
13         public void teach() {
14             System.out.println("讲解论语");
15         }
16         
17         public void playGame() {
18             System.out.println("英雄联盟");
19         }
20     }
21     
22     //Java培训特别火,很多人来请孔子爹去讲课,这一天孔子爹被请走了
23     //但是还有人来请,就剩孔子在家,价格还挺高。孔子一想,我是不是可以考虑去呢?
24     //然后就穿上爹的衣服,带上爹的眼睛,粘上爹的胡子。就开始装爹
25     //向上转型
26     孔子爹 k爹 = new 孔子();
27     //到人家那里去了
28     System.out.println(k爹.age); //40
29     k爹.teach(); //讲解论语
30     //k爹.playGame(); //这是儿子才能做的
31     
32     
33     //讲完了,下班回家了
34     //脱下爹的装备,换上自己的装备
35     //向下转型
36     孔子 k = (孔子) k爹; 
37     System.out.println(k.age); //20
38     k.teach(); //讲解论语
39     k.playGame(); //英雄联盟
40     

多态继承中的内存图解

向上转型

向下转型

 抽象类

 1 /*
 2     抽象类的概述:
 3         动物不应该定义为具体的东西,而且动物中的吃,睡等也不应该是具体的。
 4         我们把一个不是具体的功能称为抽象的功能,而一个类中如果有抽象的功能,该类必须是抽象类。
 5         
 6     抽象类的特点:
 7         A:抽象类和抽象方法必须用abstract关键字修饰
 8         B:抽象类中不一定有抽象方法,但是有抽象方法的类必须定义为抽象类
 9         C:抽象类不能实例化
10             因为它不是具体的。
11             抽象类有构造方法,但是不能实例化?构造方法的作用是什么呢?
12             用于子类访问父类数据的初始化
13         D:抽象的子类
14             a:如果不想重写抽象方法,该子类是一个抽象类。
15             b:重写所有的抽象方法,这个时候子类是一个具体的类。
16             
17         抽象类的实例化其实是靠具体的子类实现的。是多态的方式。
18             Animal a = new Cat();
19 */
20 
21 //abstract class Animal //抽象类的声明格式
22 abstract class Animal {
23     //抽象方法
24     //public abstract void eat(){} //空方法体,这个会报错。抽象方法不能有主体
25     public abstract void eat();
26     
27     public Animal(){}
28 }
29 
30 //子类是抽象类
31 abstract class Dog extends Animal {}
32 
33 //子类是具体类,重写抽象方法
34 class Cat extends Animal {
35     public void eat() {
36         System.out.println("猫吃鱼");
37     }
38 }
39 
40 class AbstractDemo {
41     public static void main(String[] args) {
42         //创建对象
43         //Animal是抽象的; 无法实例化
44         //Animal a = new Animal();
45         //通过多态的方式
46         Animal a = new Cat();
47         a.eat();
48     }
49 }

 1 /*
 2     抽象类的成员特点:
 3         成员变量:既可以是变量,也可以是常量。
 4         构造方法:有。
 5                     用于子类访问父类数据的初始化。
 6         成员方法:既可以是抽象的,也可以是非抽象的。
 7         
 8     抽象类的成员方法特性:
 9         A:抽象方法 强制要求子类做的事情。
10         B:非抽象方法 子类继承的事情,提高代码复用性。
11 */
12 abstract class Animal {
13     public int num = 10;
14     public final int num2 = 20;
15 
16     public Animal() {}
17     
18     public Animal(String name,int age){}
19     
20     public abstract void show();
21     
22     public void method() {
23         System.out.println("method");
24     }
25 }
26 
27 class Dog extends Animal {
28     public void show() {
29         System.out.println("show Dog");
30     }
31 }
32 
33 class AbstractDemo2 {
34     public static void main(String[] args) {
35         //创建对象
36         Animal a = new Dog();
37         a.num = 100;
38         System.out.println(a.num);
39         //a.num2 = 200;
40         System.out.println(a.num2);
41         System.out.println("--------------");
42         a.show();
43         a.method();
44     }
45 }

 猫狗案例

*注意:分析和实现的过程

  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 abstract class Animal {
 42     //姓名
 43     private String name;
 44     //年龄
 45     private int age;
 46     
 47     public Animal() {}
 48     
 49     public Animal(String name,int age) {
 50         this.name = name;
 51         this.age = age;
 52     }
 53     
 54     public String getName() {
 55         return name;
 56     }
 57     
 58     public void setName(String name) {
 59         this.name = name;
 60     }
 61     
 62     public int getAge() {
 63         return age;
 64     }
 65     
 66     public void setAge(int age) {
 67         this.age = age;
 68     }
 69     
 70     //定义一个抽象方法
 71     public abstract void eat();
 72 }
 73 
 74 //定义具体的狗类
 75 class Dog extends Animal {
 76     public Dog() {}
 77     
 78     public Dog(String name,int age) {
 79         super(name,age);
 80     }
 81     
 82     public void eat() {
 83         System.out.println("狗吃肉");
 84     }
 85 }
 86 
 87 //定义具体的猫类
 88 class Cat extends Animal {
 89     public Cat() {}
 90     
 91     public Cat(String name,int age) {
 92         super(name,age);
 93     }
 94     
 95     public void eat() {
 96         System.out.println("猫吃鱼");
 97     }
 98 }
 99 
100 //测试类
101 class AbstractTest {
102     public static void main(String[] args) {
103         //测试狗类
104         //具体类用法
105         //方式1:
106         Dog d = new Dog();
107         d.setName("旺财");
108         d.setAge(3);
109         System.out.println(d.getName()+"---"+d.getAge());
110         d.eat();
111         //方式2:
112         Dog d2 = new Dog("旺财",3);
113         System.out.println(d2.getName()+"---"+d2.getAge());
114         d2.eat();
115         System.out.println("---------------------------");
116         
117         Animal a = new Dog();
118         a.setName("旺财");
119         a.setAge(3);
120         System.out.println(a.getName()+"---"+a.getAge());
121         a.eat();
122         
123         Animal a2 = new Dog("旺财",3);
124         System.out.println(a2.getName()+"---"+a2.getAge());
125         a2.eat();
126         
127         //练习:测试猫类

128 } 129 }

 员工案例

  1 /*
  2     假如我们在开发一个系统时需要对员工类进行设计,员工包含3个属性:姓名、工号以及工资。
  3     经理也是员工,除了含有员工的属性外,另为还有一个奖金属性。
  4     请使用继承的思想设计出员工类和经理类。要求类中提供必要的方法进行属性访问。
  5     
  6     分析:
  7         普通员工类
  8             成员变量:姓名、工号以及工资。
  9             成员方法:工作
 10         经理类:
 11             成员变量:姓名、工号以及工资,奖金属性
 12             成员方法:工作
 13             
 14     实现:
 15         员工类:
 16         普通员工类:
 17         经理类:
 18 */
 19 //定义员工类
 20 abstract class Employee {
 21     //姓名、工号以及工资
 22     private String name;
 23     private String id;
 24     private int salary;
 25     
 26     public Employee() {}
 27     
 28     public Employee(String name,String id,int salary) {
 29         this.name = name;
 30         this.id = id;
 31         this.salary = salary;
 32     }
 33     
 34     public String getName() {
 35         return name;
 36     }
 37     
 38     public void setName(String name) {
 39         this.name = name;
 40     }
 41     
 42     public String getId() {
 43         return id;
 44     }
 45     
 46     public void setId(String id) {
 47         this.id = id;
 48     }
 49     
 50     public int getSalary() {
 51         return salary;
 52     }
 53     
 54     public void setSalary(int salary) {
 55         this.salary = salary;
 56     }
 57     
 58     //工作
 59     public abstract void work();
 60 }
 61 
 62 //普通员工类
 63 class Programmer extends Employee {
 64     public Programmer(){}
 65     
 66     public Programmer(String name,String id,int salary) {
 67         super(name,id,salary);
 68     }
 69     
 70     public void work() {
 71         System.out.println("按照需求写代码");
 72     }
 73 }
 74 
 75 //经理类
 76 class Manager extends Employee {
 77     //奖金
 78     private int money; //bonus 奖金
 79 
 80     public Manager(){}
 81     
 82     public Manager(String name,String id,int salary,int money) {
 83         super(name,id,salary);
 84         this.money = money;
 85     }
 86     
 87     public void work() {
 88         System.out.println("跟客户谈需求");
 89     }
 90     
 91     public int getMoney() {
 92         return money;
 93     }
 94     
 95     public void setMoney(int money) {
 96         this.money = money;
 97     }
 98 }
 99 
100 class AbstractTest4 {
101     public static void main(String[] args) {
102         //测试普通员工
103         Employee emp = new Programmer();
104         emp.setName("林青霞");
105         emp.setId("czbk001");
106         emp.setSalary(18000);
107         System.out.println(emp.getName()+"---"+emp.getId()+"---"+emp.getSalary());
108         emp.work();
109         System.out.println("-------------");
110         emp = new Programmer("林青霞","czbk001",18000);
111         System.out.println(emp.getName()+"---"+emp.getId()+"---"+emp.getSalary());
112         emp.work();
113         System.out.println("-------------");
114         
115         /*
116         emp = new Manager();
117         emp.setName("刘意");
118         emp.setId("czbk002");
119         emp.setSalary(8000);
120         emp.setMoney(2000);
121         */
122         //由于子类有特有的内容,所以我们用子类来测试
123         Manager m = new Manager();
124         m.setName("刘意");
125         m.setId("czbk002");
126         m.setSalary(8000);
127         m.setMoney(2000);
128         System.out.println(m.getName()+"---"+m.getId()+"---"+m.getSalary()+"---"+m.getMoney());
129         m.work();
130         System.out.println("-------------");
131         
132         //通过构造方法赋值
133         m = new Manager("刘意","czbk002",8000,2000);
134         System.out.println(m.getName()+"---"+m.getId()+"---"+m.getSalary()+"---"+m.getMoney());
135         m.work();
136     }
137 }

 

接口

new 对象时   从右往前念

接口的概念和特点

 1 /*
 2     接口的特点:
 3         A:接口用关键字interface表示    
 4             interface 接口名 {}
 5         B:类实现接口用implements表示
 6             class 类名 implements 接口名 {}
 7         C:接口不能实例化
 8             那么,接口如何实例化呢?
 9             按照多态的方式来实例化。
10         D:接口的子类
11             a:可以是抽象类。但是意义不大。
12             b:可以是具体类。要重写接口中的所有抽象方法。(推荐方案)
13     
14     由此可见:
15         A:具体类多态(几乎没有)
16         B:抽象类多态(常用)
17         C:接口多态(最常用)
18 */
19 //定义动物培训接口
20 interface AnimalTrain {
21     public abstract void jump();
22 }
23 
24 //抽象类实现接口
25 abstract class Dog implements AnimalTrain {
26 }
27 
28 //具体类实现接口
29 class Cat implements AnimalTrain {
30     public void jump() {
31         System.out.println("猫可以跳高了");
32     }
33 }
34 
35 class InterfaceDemo {
36     public static void main(String[] args) {
37         //AnimalTrain是抽象的; 无法实例化
38         //AnimalTrain at = new AnimalTrain();
39         //at.jump();
40         
41         AnimalTrain at = new Cat();
42         at.jump();
43     }
44 }

 接口的默认修饰符:

public  static final  ...

 建议自己手动给出   

接口成员的特点:

  成员变量:

    只能是常量,并且是静态的

    默认修饰符:public static final

    建议:自己手动给出

  构造方法:接口没有构造方法

  成员方法:

    只能是抽象方法

    默认修饰符:public abstrac

    建议自己手动给出

所有的类都默认继承自一个类:Object.

类Object是类层次结构的根类。每个类都使用Object作为超类

 1 /*
 2     接口成员特点
 3         成员变量;只能是常量,并且是静态的。
 4                 默认修饰符:public static final
 5                 建议:自己手动给出。
 6         构造方法:接口没有构造方法。
 7         成员方法:只能是抽象方法。
 8                 默认修饰符:public abstract
 9                 建议:自己手动给出。
10         
11     所有的类都默认继承自一个类:Object。
12     类 Object 是类层次结构的根类。每个类都使用 Object 作为超类。
13 */
14 interface Inter {
15     public int num = 10;
16     public final int num2 = 20;
17     public static final int num3 = 30;
18     
19     //错误: 需要<标识符>
20     //public Inter() {}
21     
22     //接口方法不能带有主体
23     //public void show() {}
24 
25     //abstract void show(); //默认public
26     public void show(); //默认abstract
27 }
28 
29 //接口名+Impl这种格式是接口的实现类格式
30 /*
31 class InterImpl implements Inter {
32     public InterImpl() {
33         super();
34     }
35 }
36 */
37 
38 class InterImpl extends Object implements Inter {
39     public InterImpl() {
40         super();
41     }
42     
43     public void show() {}
44 }
45 
46 //测试类
47 class InterfaceDemo2 {
48     public static void main(String[] args) {
49         //创建对象
50         Inter i = new InterImpl();
51         System.out.println(i.num);
52         System.out.println(i.num2);
53         //i.num = 100;
54         //i.num2 = 200;
55         //System.out.println(i.num); //无法为最终变量num分配值
56         //System.out.println(i.num2);//无法为最终变量num2分配值
57         System.out.println(Inter.num);
58         System.out.println(Inter.num2);
59         System.out.println("--------------");
60     }
61 }

 类与类,类与接口,接口与接口的关系

类与类:

  继承关系,只能单继承,可以多层继承

类与接口:

  实现关系,可以单实现,也可以多实现

  并且还可以继承一个类的同时实现多个接口

接口与接口:

  继承关系,可以单继承,也可以多继承

 1 /*
 2     类与类:
 3         继承关系,只能单继承,可以多层继承。
 4     类与接口:
 5         实现关系,可以单实现,也可以多实现。
 6         并且还可以在继承一个类的同时实现多个接口。
 7     接口与接口:
 8         继承关系,可以单继承,也可以多继承。
 9 */
10 interface Father {
11     public abstract void show();
12 }
13 
14 interface Mother {
15     public abstract void show2();
16 }
17 
18 interface Sister extends Father,Mother {
19 
20 }
21 
22 //class Son implements Father,Mother //多实现
23 class Son extends Object implements Father,Mother {
24     public void show() {
25         System.out.println("show son");
26     }
27     
28     public void show2() {
29         System.out.println("show2 son");
30     }
31 }
32 
33 class InterfaceDemo3 {
34     public static void main(String[] args) {
35         //创建对象
36         Father f = new Son();
37         f.show();
38         //f.show2(); //报错
39     
40         Mother m = new Son();
41         //m.show(); //报错
42         m.show2();
43     }
44 }

 

2018-07-09   08:06:34

接口    接口中定义的是该继承体系的扩展功能

分析过程:从具体到抽象

实现过程:从抽象到具体

  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 interface Jumpping {
 35     //跳高功能
 36     public abstract void jump();
 37 }
 38 
 39 //定义抽象类
 40 abstract class Animal {
 41     //姓名
 42     private String name;
 43     //年龄
 44     private int age;
 45     
 46     public Animal() {}
 47     
 48     public Animal(String name,int age) {
 49         this.name = name;
 50         this.age = age;
 51     }
 52     
 53     public String getName() {
 54         return name;
 55     }
 56     
 57     public void setName(String name) {
 58         this.name = name;
 59     }
 60     
 61     public int getAge() {
 62         return age;
 63     }
 64     
 65     public void setAge(int age) {
 66         this.age = age;
 67     }
 68     
 69     //吃饭();
 70     public abstract void eat();
 71     
 72     //睡觉(){}
 73     public void sleep() {
 74         System.out.println("睡觉觉了");
 75     }
 76 }
 77 
 78 //具体猫类
 79 class Cat extends Animal {
 80     public Cat(){}
 81     
 82     public Cat(String name,int age) {
 83         super(name,age);
 84     }
 85     
 86     public void eat() {
 87         System.out.println("猫吃鱼");
 88     }
 89 }
 90 
 91 //具体狗类
 92 class Dog extends Animal {
 93     public Dog(){}
 94     
 95     public Dog(String name,int age) {
 96         super(name,age);
 97     }
 98     
 99     public void eat() {
100         System.out.println("狗吃肉");
101     }
102 }
103 
104 //有跳高功能的猫
105 class JumpCat extends Cat implements Jumpping {
106     public JumpCat() {}
107     
108     public JumpCat(String name,int age) {
109         super(name,age);
110     }
111 
112     public void jump() {
113         System.out.println("跳高猫");
114     }
115 }
116 
117 //有跳高功能的狗
118 class JumpDog extends Dog implements Jumpping {
119     public JumpDog() {}
120     
121     public JumpDog(String name,int age) {
122         super(name,age);
123     }
124 
125     public void jump() {
126         System.out.println("跳高狗");
127     }
128 }
129 
130 class InterfaceTest {
131     public static void main(String[] args) {
132         //定义跳高猫并测试
133         JumpCat jc = new JumpCat();
134         jc.setName("哆啦A梦");
135         jc.setAge(3);
136         System.out.println(jc.getName()+"---"+jc.getAge());
137         jc.eat();
138         jc.sleep();
139         jc.jump();
140         System.out.println("-----------------");
141         
142         JumpCat jc2 = new JumpCat("加菲猫",2);
143         System.out.println(jc2.getName()+"---"+jc2.getAge());
144         jc2.eat();
145         jc2.sleep();
146         jc2.jump();
147         
148         //定义跳高狗并进行测试的事情自己完成。
149     }
150 }

老师和学生案例,加入抽烟功能的额外功能

  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 interface Smoking {
 28     //抽烟的抽象方法
 29     public abstract void smoke();
 30 }
 31 
 32 //定义抽象人类
 33 abstract class Person {
 34     //姓名
 35     private String name;
 36     //年龄
 37     private int age;
 38     
 39     public Person() {}
 40     
 41     public Person(String name,int age) {
 42         this.name = name;
 43         this.age = age;
 44     }
 45     
 46     public String getName() {
 47         return name;
 48     }
 49     
 50     public void setName(String name) {
 51         this.name = name;
 52     }
 53     
 54     public int getAge() {
 55         return age;
 56     }
 57     
 58     public void setAge(int age) {
 59         this.age = age;
 60     }
 61     
 62     //吃饭();
 63     public abstract void eat();
 64     
 65     //睡觉(){}
 66     public void sleep() {
 67         System.out.println("睡觉觉了");
 68     }
 69 }
 70 
 71 //具体老师类
 72 class Teacher extends Person {
 73     public Teacher() {}
 74     
 75     public Teacher(String name,int age) {
 76         super(name,age);
 77     }
 78     
 79     public void eat() {
 80         System.out.println("吃大白菜");
 81     }
 82 }
 83 
 84 //具体学生类
 85 class Student extends Person {
 86     public Student() {}
 87     
 88     public Student(String name,int age) {
 89         super(name,age);
 90     }
 91     
 92     public void eat() {
 93         System.out.println("吃红烧肉");
 94     }
 95 }
 96 
 97 //抽烟的老师
 98 class SmokingTeacher extends Teacher implements Smoking {
 99     public SmokingTeacher() {}
100     
101     public SmokingTeacher(String name,int age) {
102         super(name,age);
103     }
104 
105     public void smoke() {
106         System.out.println("抽烟的老师");
107     }
108 }
109 
110 //抽烟的学生
111 class SmokingStudent extends Student implements Smoking {
112     public SmokingStudent() {}
113     
114     public SmokingStudent(String name,int age) {
115         super(name,age);
116     }
117 
118     public void smoke() {
119         System.out.println("抽烟的学生");
120     }
121 }
122 
123 class InterfaceTest2 {
124     public static void main(String[] args) {
125         //测试学生
126         SmokingStudent ss = new SmokingStudent();
127         ss.setName("林青霞");
128         ss.setAge(27);
129         System.out.println(ss.getName()+"---"+ss.getAge());
130         ss.eat();
131         ss.sleep();
132         ss.smoke();
133         System.out.println("-------------------");
134         
135         SmokingStudent ss2 = new SmokingStudent("刘意",30);
136         System.out.println(ss2.getName()+"---"+ss2.getAge());
137         ss2.eat();
138         ss2.sleep();
139         ss2.smoke();
140         
141         //测试老师留给自己练习
142     }
143 }

今日总结: 

1:final关键字(掌握)
(1)是最终的意思,可以修饰类,方法,变量。
(2)特点:
  A:它修饰的类,不能被继承。
  B:它修饰的方法,不能被重写。
  C:它修饰的变量,是一个常量。
(3)面试相关:
  A:局部变量
    a:基本类型 值不能发生改变
    b:引用类型 地址值不能发生改变,但是对象的内容是可以改变的
  B:初始化时机
    a:只能初始化一次。
    b:常见的给值
    定义的时候。(推荐)
    构造方法中。

2:多态(掌握)
   (1)同一个对象在不同时刻体现出来的不同状态。
   (2)多态的前提:
      A:有继承或者实现关系。
      B:有方法重写。
      C:有父类或者父接口引用指向子类对象。

   多态的分类:
      a:具体类多态
        class Fu {}
        class Zi extends Fu {}

        Fu f = new Zi();
      b:抽象类多态
        abstract class Fu {}
        class Zi extends Fu {}

        Fu f = new Zi();
      c:接口多态
        interface Fu {}
        class Zi implements Fu {}

        Fu f = new Zi();
    (3)多态中的成员访问特点
      A:成员变量
        编译看左边,运行看左边
      B:构造方法
        子类的构造都会默认访问父类构造
      C:成员方法
        编译看左边,运行看右边
      D:静态方法
        编译看左边,运行看左边

      为什么?
        因为成员方法有重写。
    (4)多态的好处:
        A:提高代码的维护性(继承体现)
        B:提高代码的扩展性(多态体现)
    (5)多态的弊端:
        父不能使用子的特有功能。

    现象:
        子可以当作父使用,父不能当作子使用。
    (6)多态中的转型
        A:向上转型
          从子到父
        B:向下转型
          从父到子
    (7)孔子装爹的案例帮助大家理解多态
    (8)多态的练习
        A:猫狗案例
        B:老师和学生案例

3:抽象类(掌握)
    (1)把多个共性的东西提取到一个类中,这是继承的做法。
      但是呢,这多个共性的东西,在有些时候,方法声明一样,但是方法体。
      也就是说,方法声明一样,但是每个具体的对象在具体实现的时候内容不一样。
      所以,我们在定义这些共性的方法的时候,就不能给出具体的方法体。
      而一个没有具体的方法体的方法是抽象的方法。
      在一个类中如果有抽象方法,该类必须定义为抽象类。
    (2)抽象类的特点
        A:抽象类和抽象方法必须用关键字abstract修饰
        B:抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类
        C:抽象类不能实例化
        D:抽象类的子类
          a:是一个抽象类。
          b:是一个具体类。这个类必须重写抽象类中的所有抽象方法。
    (3)抽象类的成员特点:
        A:成员变量
          有变量,有常量
        B:构造方法
          有构造方法
        C:成员方法
          有抽象,有非抽象
    (4)抽象类的练习
        A:猫狗案例练习
        B:老师案例练习
        C:学生案例练习
        D:员工案例练习
    (5)抽象类的几个小问题
        A:抽象类有构造方法,不能实例化,那么构造方法有什么用?
          用于子类访问父类数据的初始化
        B:一个类如果没有抽象方法,却定义为了抽象类,有什么用?
          为了不让创建对象
        C:abstract不能和哪些关键字共存
          a:final 冲突
          b:private 冲突
          c:static 无意义

4:接口(掌握)
    (1)回顾猫狗案例,它们仅仅提供一些基本功能。
      比如:猫钻火圈,狗跳高等功能,不是动物本身就具备的,
      是在后面的培养中训练出来的,这种额外的功能,java提供了接口表示。
    (2)接口的特点:
      A:接口用关键字interface修饰
        interface 接口名 {}
      B:类实现接口用implements修饰
        class 类名 implements 接口名 {}
      C:接口不能实例化
      D:接口的实现类
        a:是一个抽象类。
        b:是一个具体类,这个类必须重写接口中的所有抽象方法。
   (3)接口的成员特点:
      A:成员变量
        只能是常量
        默认修饰符:public static final
      B:构造方法
        没有构造方法
      C:成员方法
        只能是抽象的
        默认修饰符:public abstract
   (4)类与类,类与接口,接口与接口
        A:类与类
          继承关系,只能单继承,可以多层继承
        B:类与接口
          实现关系,可以单实现,也可以多实现。
          还可以在继承一个类的同时,实现多个接口
        C:接口与接口
          继承关系,可以单继承,也可以多继承
   (5)抽象类和接口的区别(自己补齐)?
        A:成员区别
         抽象类:
          接口:
        B:关系区别:
         类与类:
         类与接口:
         接口与接口:
        C:设计理念不同
            抽象类:is a,抽象类中定义的是共性功能。
            接口:like a,接口中定义的是扩展功能。
  (6)练习:
        A:猫狗案例,加入跳高功能
        B:老师和学生案例,加入抽烟功能0

猜你喜欢

转载自www.cnblogs.com/twinkle-star/p/9279881.html