zoukankan      html  css  js  c++  java
  • 《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 }
  • 相关阅读:
    Matlab中如何将(自定义)函数作为参数传递给另一个函数
    字幕文件 WebVTT 与 srt 之间的互相转化
    MathType 常用快捷键
    如何解决mathpage.dll或MathType.dll文件找不到问题
    Accelerating Matlab
    VR 相关专业词汇
    Computer Graphics Research Software
    C 和 C++ 混合代码 cmath编译出错
    CG&CAD resource
    Python 面向对象编程——初见
  • 原文地址:https://www.cnblogs.com/sun-/p/5338371.html
Copyright © 2011-2022 走看看