第11章(下)--面向对象编程(高级特性)

Posted -xuewuzhijing-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第11章(下)--面向对象编程(高级特性)相关的知识,希望对你有一定的参考价值。

1.  抽象类

 

当父类的一些方法不能确定时,可以用abstract关键字来修饰该方法,这个方法就是抽象方法,用abstract 来修饰该类就是抽象类。

技术图片

 

 

 

      抽象类的介绍

 

1)      用abstract 关键字来修饰一个类时,这个类就叫抽象类
访问修饰符 abstract 类名{
}

2)      用abstract 关键字来修饰一个方法时,这个方法就是抽象方法
访问修饰符 abstract 返回类型 方法名(参数列表);

 

3)      抽象类的价值更多是在于设计,是设计者设计好后,让子类继承并实现抽象类(即:实现抽象类的抽象方法)

 

4)      抽象方法在编程中用的不是很多,但是在公司笔试时,却是考官比较爱问的知识点

 

 

 

   抽象类使用的注意事项和细节讨论

 

1)      抽象类不能被实例化  [举例]

2)      抽象类不一定要包含abstract方法。也就是说,抽象类可以没有abstract方法 [举例]

3)      一旦类包含了abstract方法,则这个类必须声明为abstract [说明]

4)      abstract 只能修饰类和方法,不能修饰属性和其它的。[说明]

5)      抽象类可以有任意成员【因为抽象类还是类】,比如:非抽象方法、构造器、静态属性等等 [举例]

6)      抽象方法不能有主体,即不能实现.如图所示

7)      如果一个类继承了抽象类,则它必须实现抽象类的所有抽象方法,除非它自己也声明为abstract类。[举例 A类,B类,C类]

8)      抽象方法不能使用privatefinal static来修饰,因为这些关键字都是和重写相违背的。说明: static关键字是不和重写相关,static方法不能重写

 

  • 和前面一样,多态在抽象类上也体现在

多态数组【存放不同的子类对象, Dog和Cat】

多态参数【接收不同的子类对象】

技术图片

 

 

 1 public class AbstractPolyDemo {
 2 
 3     public static void main(String[] args) {
 4         // TODO Auto-generated method stub
 5         
 6         Animal03 animals[] = new Animal03[2];
 7         animals[0] = new Cat03();
 8         animals[1] = new Dog03();
 9         
10         //抽象类体现出多态数组
11         for (int i = 0; i < animals.length; i++) {
12             animals[i].eat();
13             show(animals[i]);
14         }
15 
16     }
17     
18     //多态参数
19     public static void show(Animal03 animal) {
20         if (animal instanceof Cat03) {
21             Cat03 cat = (Cat03)animal;
22             cat.catchMouse();
23         } else if (animal instanceof Dog03) {
24             Dog03 dog = (Dog03)animal;
25             dog.watchDoor();
26         }
27     }
28 
29 }
30 
31 abstract class Animal03 {
32     
33     abstract public void eat();
34 }
35 
36 class Cat03 extends Animal03 {
37 
38     @Override
39     public void eat() {
40         // TODO Auto-generated method stub
41         System.out.println("小猫喜欢吃<?)))><<");
42     }
43     
44     public void catchMouse() {
45         System.out.println("小猫抓老鼠");
46     }
47     
48 }
49 
50 class Dog03 extends Animal03 {
51 
52     @Override
53     public void eat() {
54         // TODO Auto-generated method stub
55         System.out.println("小狗喜欢吃骨头~~");
56     }
57     
58     public void watchDoor() {
59         System.out.println("小狗看门~~");
60     }
61     

 

 

        抽象类最佳实践-模板设计模式

1.1.1       基本介绍

 

抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会保留抽象类的行为方式。

功能内部一部分实现是确定,一部分实现是不确定的。这时可以把不确定的部分暴露出去,让子类去实现

编写一个抽象父类,父类提供了多个子类的通用方法,并把一个或多个方法留给其子类实现,就是一种模板模式。

   

     最佳实践

 

设计一个抽象类(Template),能完成如下功能:

1)      编写方法caleTime() ,可以计算某段代码的耗时时间

2)      编写抽象方法code()

3)      编写一个子类Sub,继承抽象类Template,并实现code方法。

4)      编写一个测试类TestTemplate,看看是否好用。

 

 1 public class AbstractTemplateDemo {
 2 
 3     public static void main(String[] args) {
 4         // TODO Auto-generated method stub
 5         Sub sub = new Sub();
 6         sub.caleTime();
 7         
 8         Sub2 sub2 = new Sub2();
 9         sub2.caleTime();
10 
11     }
12 
13 }
14 
15 // 通过抽象类开发要给 模板设计模式
16 
17 abstract class Template {
18 
19     abstract public void code(); // code不确定.
20     // 统计code() 方法执行时间
21 
22     public void caleTime() {
23         // 1先得到当前的时间(毫秒)
24         long nowTime = System.currentTimeMillis();
25         code();
26         // 2得到执行后的时间
27         long endTime = System.currentTimeMillis();
28         System.out.println("执行代码时间为=" + (endTime - nowTime));
29     }
30 }
31 
32 class Sub extends Template { // 张三
33 
34     @Override
35     public void code() {
36         // TODO Auto-generated method stub
37         // 测试 hello, 拼接 10000次
38         String str = "hello";
39         for (int i = 0; i < 20000; i++) {
40             str += "jack" + i;
41         }
42 
43     }
44 
45 }
46 
47 class Sub2 extends Template {// 李四
48 
49     @Override
50     public void code() {
51         // TODO Auto-generated method stub
52         // 测试 hello, 拼接 10000次
53         StringBuilder str = new StringBuilder("hello");
54         for (int i = 0; i < 20000; i++) {
55             str.append("jack" + i);
56         }
57 
58     }
59 
60 }

技术图片

 

 

 标准 服务 产品 项目

接口快速入门

 1 public class InterfaceDemo {
 2 
 3     public static void main(String[] args) {
 4         // TODO Auto-generated method stub
 5         Computer computer = new Computer();
 6         Phone phone = new Phone();
 7         Camera camera = new Camera();
 8         
 9         computer.work(phone); //这里因为Phone已经实现了UsbInterface
10         computer.work(camera);//这里因为Camera已经实现了UsbInterface
11 
12     }
13 
14 }
15 
16 
17 class Computer {
18     public void work(UsbInterface usbInterace) {
19         //...
20         usbInterace.start();
21         usbInterace.start();
22     }
23 }
24 
25 //定义给接口,要求各个类去实现
26 interface UsbInterface {
27     //定一些规范, 规范可以简单的理解就是方法(没有实现的方法)
28     public void start();
29     public void stop();
30 }
31 
32 class Camera implements UsbInterface {
33 
34     @Override
35     public void start() {
36         // TODO Auto-generated method stub
37         System.out.println("相机开始工作~~");
38     }
39 
40     @Override
41     public void stop() {
42         // TODO Auto-generated method stub
43         System.out.println("相机结束工作~~");
44         
45     }
46     
47 }
48 
49 class Phone implements UsbInterface {
50 
51     @Override
52     public void start() {
53         // TODO Auto-generated method stub
54         System.out.println("手机开始工作~~");
55         
56     }

 

以上是关于第11章(下)--面向对象编程(高级特性)的主要内容,如果未能解决你的问题,请参考以下文章

Scala核心编程_第09章 面向对象编程(高级特性)

Scala核心编程_第09章 面向对象编程(高级特性)

第8章 面向对象高级编程与网络编程

第10章 面向对象编程(高级部分)

Python之路第11章:Python面向对象

韩顺平循序渐进学Java零基础 第10章 面向对象编程(高级部分)