《day10》

 1 //65-面向对象-接口-接口的思想
 2 /*
 3 举例:笔记本电脑。
 4 
 5 
 6 1,接口的出现对功能实现了扩展。
 7 2,接口的出现定义了规则。
 8 3,接口的出现降低了耦合性。(解耦)
 9 
10 接口的出现完成了解耦,说明有两方,一方在使用这个规则,另一方在实现这个规则。
11 比如笔记本电脑在使用这个规则,而外围设备在实现这个规则。
12 */
 1 //66-67面向对象-接口-接口和抽象的区别及总结:
 2 /*
 3 接口和抽象类的区别:
 4 
 5 描述事物:
 6 犬。按照功能分类。导盲犬,缉毒犬...
 7 
 8 犬:
 9     吼叫();
10     吃饭();
11 */
12 
13 abstract class14 {
15     public abstract void 吼叫();
16     public abstract void 吃饭();
17 }
18 class 缉毒犬 extends19 {
20     public void 吼叫(){}
21     public void 吃饭(){}
22     //public void 缉毒(){}
23 }
24 
25 //对于缉毒,有可能还有缉毒猪。具备着缉毒功能。应该将这个缉毒的功能抽取。
26 //对缉毒进行描述。
27 abstract class 缉毒
28 {
29     public abstract void 缉毒(){}
30 }
31 
32 /*
33 缉毒犬既需要犬的功能又需要缉毒的功能。
34 无法直接多继承。
35 是否可以多实现呢?
36 犬是一个接口,缉毒犬多实现即可。
37 类负责描述的是事物的基本功能,接口负责描述事物的扩展功能。
38 缉毒犬是犬中的一种。is a 关系。
39 将犬定义成类,而缉毒是犬的一个扩展功能,这时将缉毒定义成接口。
40 
41 这时描述就变成了这样。
42 */
43 abstract class44 {
45     public abstract void 吼叫();
46     public abstract void 吃饭();
47 }
48 interface 缉毒able
49 {
50     public abstract void 缉毒();
51 }
52 
53 class 缉毒犬 extendsimplements 缉毒able
54 {
55     public void 吼叫(){}
56     public void 吃饭(){}
57     public void 缉毒(){}
58 }
59 
60 /*
61 小节:
62 1,抽象类是描述事物的基本功能,可以描述非抽象的方法。
63    接口中定义的只能是抽象的方法。负责事物功能的扩展。
64 2,类与类之间是继承关系 is a 关系。
65    类与接口之间是实现关系 like a 关系。
66   
67   门:
68     open();
69     close();
70 
71   报警功能的门。
72 
73   
74 interface 报警
75 {
76     public abstract void 报警();
77 }
78 
79 abstract 门
80 {
81     public abstract void open();
82     public abstract void close();
83 }
84 
85 class 报警门 extends 门 implements 报警
86 {
87     public void open(){code...}
88     public void close(){code..}
89     public void 报警(){code...}
90 }
91 
92 
93 */
 1 //68-面向对象-多态-好处&弊端-前提
 2 
 3 //多态技术的引出,解决什么问题?程序扩展性的问题。
 4 //描述Dog
 5 class Dog extends Animal
 6 {
 7     public void eat()
 8     {
 9         System.out.println("骨头");
10     }
11     public void lookHome()
12     {
13         System.out.println("看家");
14     }
15 }
16 
17 //描述猫
18 class Cat extends Animal
19 {
20     public void eat()
21     {
22         System.out.println("鱼");
23     }
24     public void catchMouse()
25     {
26         System.out.println("抓老鼠");
27     }
28 }
29 //进行抽取,将共性的功能抽取到父类中Animal中。
30 abstract class Animal
31 {
32     public abstract void eat();
33 }
34 
35 
36 class  DuoTaiDemo
37 {
38     public static void main(String[] args) 
39     {
40         Dog d = new Dog();
41     //    d.eat();
42         method(d);
43 
44         Cat c = new Cat();
45         method(c);
46 
47         /*
48         发现,每多一个动物,都需要为这个动物单独定义一个功能。
49         让这个动物的对象去做事。
50         这个程序扩展性很差。
51         如何提高扩展性呢?
52         发现既然是让动物去eat,无论是Dog,还是Cat。
53         eat是它们的共性,干脆,将eat进行抽取。抽取到父类Animal中。
54 
55         Dog是Animal中的一种。
56         Dog d = new Dog();
57         Animal a = new Dog();
58 
59         Cat是Animal中的一种。
60         Cat c = new Cat();
61         Animal aa = new Cat();
62         */
63 
64         //只要去建立Ainmal的引用就可以接受所有的Dog,Cat对象。让它们去eat。
65         //提高了程序的扩展性。
66         public static void method(Animal a)
67         {
68             a.eat();
69         }
70 
71 
72         /*
73         //接收Dog,让dog做事。
74         public static vodi method(Dog d)
75         {
76             d.eat();
77         }
78 
79         //接收Cat,让Cat做事。
80         public static void method(Cat c)
81         {
82             c.eat();
83         }
84         */
85     }
86 }
  1 //68-面向对象-多态-好处&弊端-前提
  2 
  3 //多态技术的引出,解决什么问题?程序扩展性的问题。
  4 //描述Dog
  5 class Dog extends Animal
  6 {
  7     public void eat()
  8     {
  9         System.out.println("骨头");
 10     }
 11     public void lookHome()
 12     {
 13         System.out.println("看家");
 14     }
 15 }
 16 
 17 //描述猫
 18 class Cat extends Animal
 19 {
 20     public void eat()
 21     {
 22         System.out.println("鱼");
 23     }
 24     public void catchMouse()
 25     {
 26         System.out.println("抓老鼠");
 27     }
 28 }
 29 
 30 //进行抽取,将共性的功能抽取到父类中Animal中。
 31 abstract class Animal
 32 {
 33     public abstract void eat();
 34 }
 35 
 36 /*
 37 多态:
 38     【体现】
 39     父类的引用或者接口的引用指向了自己的子类对象。
 40     Dog d = new Dog();//Dog 类型是Dog类型。
 41     Animal a = new Dog();//Dog对象的类型右边是Dog类型,左边是Animla类型。
 42     【好处】
 43       提高了程序的扩展性。
 44     【弊端】
 45       通过父类引用操作对象时,只能使用父类中中已有的方法,不能操作子类特有的方法。
 46     【前提】
 47       1,必须有关系,继承,实现。
 48       2,同常都有重写操作。
 49     【子类的特有方法如何调用呢?】
 50      Ainmal a = new Dog();//Animal是父类型,new Dog()是子对像。
 51      但是父类型引用指向子类对象时,这就是让子类对象进行了类型的提升(向上转型)
 52      向上转型的好处:提高了扩展性,隐藏了子类型。弊端,不能使用子类型的特有方法。
 53      如果想使用子类的特有方法,只有子类型可以用。
 54      可以向下转型。(可以用double d = 4  同时也可以把d强转为int型).
 55      Ainmal a = new Dog();
 56      a.eat();
 57 
 58      //向下转型
 59      Dog d = (Dog)a;//将a转型为Dog类型。
 60      d.lookHome();
 61      向下转型什么时候用?当需要使用子类型的特有内容时,
 62 
 63      注意:无论向上还是向下转型,最终都是子类对象在做着类型的变化。
 64      千万不要把父类型的对象进行强转,因为父类型创建以后还不明确它的
 65      子类型到底有哪些?
 66 
 67      【向下转型的注意事项】
 68      Animal a = new Dog();
 69     Cat c = (Cat)a;//向下转型因为不明确具体子类对象类型,
 70                    //所以容易引发ClassCastException:
 71     所以为了避免这个问题,需要在向下转型前,做类型判断。
 72     判断类型用关键字。instanceof
 73     if(a instanceof cat)//a指向的对象时Cat类型。
 74     {
 75         //将a转型成Cat类型
 76         Cat c = (Cat)a;
 77         c.catchMouse();
 78     }
 79     else if(a instanceof Dog)
 80     {
 81         Dog d = (Dog)a;
 82         d.lookHome();
 83     }
 84     【转型总结】
 85     1,什么时候向上转型呢?
 86            提高程序的扩展性,不关心子类型(子类型被隐藏)。
 87            需要用子类的特有方法吗?不需要,哦了,向上转型。
 88     2,什么时候使用向下转型呢?
 89         需要使用子类型的特有方法时。
 90         但是一定要使用instanceof进行类型的判断。避免发生ClassCastException:
 91     
 92     
 93 
 94 */
 95 
 96 class  DuoTaiDemo2
 97 {
 98     public static void main(String[] args) 
 99     {
100         Dog d = new Dog();
101         /*
102         d.eat();
103         d.lookHome();
104         Animal a = new Dog();
105         a.eat();//可以。
106         a.lookHome();//不可以。
107         */
108         method(d);
109 
110         Cat c = new Cat();
111         method(c);
112     }
113 
114         public static void method(Animal a)
115         {
116 
117             a.eat();
118             Dog d = (Dog)a;
119             //d.lookHome();//Exception in thread "main" 
120                             //java.lang.ClassCastException:
121                             //Cat cannot be cast to Dog
122 
123     //        a.lookHome();//不可以,因为动物不具备lookHome功能。
124         }
125 }
 1 //70-面向对象-多态-举例
 2 class 毕姥爷
 3 {
 4     public void 讲课()
 5     {
 6         System.out.println("讲管理");
 7     }
 8     public void 钓鱼()
 9     {
10         System.out.println("钓鱼");
11     }
12 }
13 
14 class 毕老师 extends 毕姥爷
15 {
16     public void 讲课()
17     {
18         System.out.println("Java");
19     }
20     public void 看电影()
21     {
22         System.out.println("看电影");
23     }
24 }
25 class DuoTaiTest
26 {
27     public static void main(String[] args) 
28     {
29         毕姥爷 x = new 毕老师();//多态,向上转型了。
30         x.讲课();
31         x.钓鱼();//可以。
32 //        x.看电影();//不行
33         //想要使用毕老师的特有方法时,需要向下转型。
34         if(x instanceof 毕老师)
35         {
36             毕老师 y = (毕老师)x;
37             y.看电影();
38         }
39 
40         //自始至终都是子类对象在做着类型的变化。
41     }
42 }
  1 //72-面向对象-多态-练习-笔记本电脑
  2 /*
  3 阶段一需求:笔记本电脑运行。
  4 按照面向对象的思想,用代码体现。
  5 名词提炼法。
  6 笔记本电脑:
  7     行为:运行。
  8 
  9 class noteBook
 10 {
 11     //定义一个运行功能。
 12     public void run()
 13     {
 14         System.out.println("notebook run");
 15     }
 16 }
 17 
 18 阶段二需求:想要在笔记本上加上一个手提式鼠标。
 19 多了个对象。鼠标。
 20     行为:开启,关闭。
 21 class Mouse
 22 {
 23     public void open()
 24     {
 25         System.out.println("mouse run");
 26     }
 27     public void close()
 28     {
 29         System.out.println("mouse close");
 30     }
 31 }
 32 
 33 笔记本怎么用鼠标呢?
 34 笔记本中就多了个使用鼠标的功能。
 35 需要修改原来的笔记本类中的内容,添加一个功能。
 36 class noteBook
 37 {
 38     //定义一个运行功能。
 39     public void run()
 40     {
 41         System.out.println("notebook run");
 42     }
 43     //使用鼠标功能。
 44     public void useMouse(Mouse m)
 45     {
 46         if(m!=null)
 47         {
 48             m.open();
 49             m.close();
 50         }
 51     }
 52 }
 53 //问题:如果想要加入一个键盘呢?
 54 只要描述一个键盘类,并在电脑类中加入一个使用键盘的功能。就可以了。
 55 但是从鼠标开始,这个问题就已经产生了。一旦需要添加新设备的时候,
 56 都需要改变电脑的源码。这个扩展性是非常差的。
 57 
 58 设计上该如何改进呢?
 59 之前的问题在于外围设备的增加和笔记本电脑之间的耦合性过高。
 60 如何降低这些外围设备和笔记本电脑的耦合性呢?
 61 外围设备还不确定,我们不要面对外围具体设备。
 62 为了让笔记本可以使用这些设备,可以事先定义好一些规则。
 63 笔记本只要使用这些规则就可以了。
 64 有了这些规则就可以进行功能的扩展。
 65 后期这些外围的设备只要符合这些规则就可以被笔记本使用了。
 66 
 67 那么规则在java中该如何体现呢?
 68 
 69 ./1,描述接口。USB.
 70 
 71 //2,描述笔记本电脑:运行功能,使用USB接口的功能。
 72 
 73 
 74 
 75 */
 76 
 77 //USB接口定义。
 78 interface USB
 79 {
 80     public abstract void open();
 81     public abstract void close();
 82 }
 83 
 84 //描述笔记本电脑。
 85 class NoteBook 
 86 {
 87     public void run()
 88     {
 89         System.out.println("notebook run");
 90     }
 91 
 92     //使用usb接口的功能。
 93     public void usbUSB(USB usb)//多态!//接口类型的变量。接口类型的变量只能
 94                                 //只能指向自己的子类对象。
 95                                 //USB usb = new Mouse();
 96     {
 97         if(usb!=null)
 98         {
 99             usb.open();
100             usb.close();
101         }
102     }
103 }
104 
105 //需要鼠标。想要被笔记本电脑使用,该鼠标必须要符合规则。
106 //描述鼠标。
107 class Mouse implements USB
108 {
109     public void open()
110     {
111         System.out.println("mouse open");
112     }
113     public void close()
114     {
115         System.out.println("mouse close");
116     }
117 }
118 
119 class KeyBoard implements USB
120 {
121     public void open()
122     {
123         System.out.println("keyboard open");
124     }
125     public void close()
126     {
127         System.out.println("keboard close");
128     }
129 }
130 
131 /*
132 发现:接口的出现
133 1,扩展了笔记本的功能。
134 2,定义了规则。
135 3,降低了笔记本电脑和外围设备之间的耦合性。
136 */
137 class DuoTaiTest2
138 {
139     public static void main(String[] args) 
140     {
141         NoteBook book = new NoteBook();
142         book.run();
143         book.usbUSB(null);
144         book.usbUSB(new Mouse());
145         book.usbUSB(new KeyBoard());
146     }
147 }
 1 //73-面向对象-多态-成员变量&成员函数&静态函数的特点
 2 /*
 3 多态中,成员调用的特点。
 4 1,成员变量:
 5     当子父类中出现了同名的成员变量时,
 6     多态调用该变量时,分两个时期:
 7         编译时期参考的是引用型变量所属的类中是否有被调用的成员变量。没有,编译失败。
 8         运行时期,也是调用引用型变量所属的成员变量。
 9         简单记:编译和运行都参考等号左边。
10                 编译运行看左边。
11 2,成员函数:
12     编译:参考左边。如果有,编译通过,如果没有,编译失败。
13     运行:参考右边。参考右边对象所属的类。
14         编译看左边,运行看右边。
15 
16         对于成员函数是动态绑定到对象上。
17 3,静态函数。
18     对于静态函数,编译和运行都看左边。
19         静态函数是静态的绑定到类上的。(因为静态方法加载的时候还没有对象。)
20 
21 总结:
22 对于成员变量和静态函数,编译和运行都看左边。
23 对于成员函数,编译看左边,运行看右边。
24 */
25 
26 class Fu
27 {
28     //成员变量。
29     int num = 3;
30 
31     //成员函数。
32     void show()
33     {
34         System.out.println("fu show run");
35     }
36 
37     //静态函数。
38     static void method()
39     {
40         System.out.println("fu static method run");
41     }
42 }
43 class Zi extends Fu
44 {
45     int num = 5;
46 
47     void show()
48     {
49         System.out.println("zi show run");
50     }
51 
52     //静态函数。
53     static void method()
54     {
55         System.out.println("zi static method run");
56     }
57 }
58 
59 class DuoTaiDemo3
60 {
61     public static void main(String[] args) 
62     {
63         /*测试成员变量的多态调用:
64 
65         //Fu f = new Zi();
66         //System.out.println(f.num);//打印结果:3
67 
68         //Zi z = new Zi();
69         //Zi z = (Zi)f;
70         //System.out.println(z.num);
71         */
72 
73         //测试成员函数的多态调用:
74         //Fu f = new Zi();
75         //f.show();
76 
77         //测试静态成员函数的多态调用:
78         Fu f = new Zi();
79         f.method();
80         //注意:真正开发,静态方法是不会被多态调用的,因为静态方法不所属于对象。
81         //因为静态方法就是应该被类调用的。Fu.method();
82     }
83 }
 1 //76-77-面向对象-Object-概述&toStrng方法。
 2 /*
 3 Object类中的常用方法。
 4 
 5 Object是所有类的根类,定义了所有对象都具备的功能。
 6 API(应用程序接口)文档。
 7 
 8 
 9 
10 */
11 class Person extends Object
12 {
13     private int age;
14     Person(int age)
15     {
16         this.age = age;
17     }
18     //判断是否是同龄人。其实这个方法也是在比较Person对象是否相等。
19     //注意:Person类中是否有比较两个Person对象相等的方法?有的。
20     //因为继承Object,本身就具备着equals方法。
21     //既然有,还需要定义compare方法吗?不需要。
22     //但是equals方法判断的是地址,不是我们所需要的内容。
23     //咋办?继续使用Object的equals方法,但是建立子类自己的内容。
24     //这就是传说中的重写。
25     //重写:
26     //【记住】以后判断对象是否相同,就需要覆盖equals方法。
27     public boolean equals(Object obj)
28     {
29         //建立Person自己的判断相同的依据。判断年龄是否相同。
30 //        return this.age == obj.age;//obj所属类型Object,Object中没有定义age,所有编译失败。
31         
32         //如果调用该方法的对象和传递进来的对象是同一个,就不要转型和判断,直接返回true就可以了。
33         if(this == obj)
34             return true;//效率高一些。
35 
36         //age是Person类型的属性,既然要用到子类型的内容,需要向下转型。
37         if(!(obj instanceof Person))
38 //            return false;
39             throw new ClassCastException("类型是不对的;请改正。");
40         Person p = (Person)obj;
41 
42         return this.age == p.age;
43     }
44 
45     //覆盖toString方法,建立Person对象自己的字符串表现形式。
46     public String toString()
47     {
48         return "Person[age = "+age+"]";
49     }
50     /*
51     public boolean compare(Person p)
52     {
53         return this.age == p.age;
54     }
55     */
56 }
57 
58 class Dog
59 {
60 
61 }
62 class ObjectDemo
63 {
64     public static void main(String[] args) 
65     {
66         Person p1 = new Person(12);
67         Person p2 = new Person(17);
68 //        p1.equals(p2);
69 //        p1.equals(new Dog());//会抛出异常。
70 //        System.out.println(p1.equals(p1));
71 
72         System.out.println(p1.toString());//Person@2a139a55
73                                           //想要建立自定义对象的字符串表示形式,
74                                           //覆盖toString方法。
75         System.out.println(p2.toString());
76 
77 //        System.out.println(p1.compare(p2));
78 //        System.out.println(p1==p2);
79 //        System.out.println(p1.equals(p2));
80     }
81 }
原文地址:https://www.cnblogs.com/sun-/p/5338371.html