• 10 多态


      1 多态
      2 polymorphism 
      3 就是程序的最终状态只有在执行过程中才被决定而非在编译期间就决定了。
      4 java中如何实现多态?使用多态的好处?
      5 引用变量的两种类型:
      6 编译时类型(模糊一点,一般是一个父类)
      7 public  void (Pet pet);
      8 由声明时的类型决定。
      9 运行时类型(运行时,具体是哪个子类就是哪个子类)
     10 由实际对应的对象类型决定。
     11 多态的存在要有3个必要条件:
     12                  要有继承,要有方法重写,父类引用指向子类对象
     13 方法的调用看引用  
     14 方法的执行看对象
     15 作用:
     16 多态
     17 提高了程序的可扩展性和可维护性提高代码复用性
     18 封装
     19 安全
     20 提高代码复用性
     21  继承
     22 提高代码复用性
     23 实现多态的步骤
     24     编写父类
     25    编写子类 子类重写父类方法
     26    运行时,使用父类的类型,子类的对象
     27 引用数据类型的类型转换 
     28 子类转换为父类:自动转换
     29 上转型对象不能操作子类新增的成员变量和方法。
     30 上转型对象可以操作子类继承或重写的成员变量和方法
     31 如果子类重写了父类的某个方法,上转型对象调用该方法时,是调用的重写方法。
     32 父类转换为子类:强制转换
     33 (绝不是做手术,而是父类的真面目就是一个子类,否则会出现类型转换错误)
     34 为了防止转换出错可以先用instanceof判断类型,再去转换
     35 package 引用数据类型转换;
     36 
     37 public class Test {
     38     public static void main(String[] args) {
     39         Pet pet = new Dog();
     40         pet.bark();
     41         
     42         //判断pet的引用指向的对象是否为Cat类型
     43         if (pet instanceof Cat) {
     44             Cat cat = (Cat)pet;
     45             cat.sleep();
     46         }else {
     47             Dog wangcai = (Dog)pet;
     48             wangcai.catchMouse();
     49         }    
     50     }
     51 }
     52 
     53 
     54 ackage 引用数据类型转换;
     55 
     56 public class Cat extends Pet{
     57     public void sleep() {
     58         System.out.println("猫在睡觉。。。");
     59     }
     60 }
     61 
     62 
     63 package 引用数据类型转换;
     64 
     65 public abstract class Pet {
     66     public void bark(){
     67         System.out.println("宠物发出叫声");
     68     }
     69 
     70 
     71 package 引用数据类型转换;
     72 
     73 public class Dog extends Pet{
     74 
     75     @Override
     76     public void bark() {
     77         System.out.println("won won won ....");
     78     }
     79     public void catchMouse() {
     80         System.out.println("狗在抓老鼠");
     81     }
     82 
     83 }
     84 
     85 接口  interface 
     86 为什么需要接口?接口和抽象类的区别?
     87 接口就是比“抽象类”还“抽象”的“抽象类”,可以更加规范的对子类进行约束。全面地专业地实现了:规范和具体实现的分离。
     88 接口就是规范,定义的是一组规则,体现了现实世界中“如果你是…则必须能…”的思想。如果你是天使,则必须能飞。如果你是汽车,则必须能跑。如果你好人,则必须干掉坏人;如果你是坏人,则必须欺负好人。
     89 接口的本质是契约,就像我们人类的法律一样。制定好后大家都遵守
     90 项目的具体需求是多变的,我们必须以不变应万变才能从容开发,此处的“不变”就是“规范”。因此,我们开发项目往往都是面向接口编程!
     91 接口不是类,接口是一种引用数据类型
     92 接口中的属性都必须是public static  final ,声明的时候可以省略   但是接口中的成员变量必须在声明的时候就进行初始化
     93 接口中的方法全都是  public abstract 的方法, public abstract可以省略不写
     94 接口不能被实例化
     95 实现类必须实现接口的所有方法
     96 类可以实现多个接口
     97 接口中不可以有构造方法
     98 接口相关规则:
     99 接口中所有方法都是抽象的。
    100 即使没有显式的将接口中的成员用public标示,也是public访问类型的
    101 接口中变量默认用 public static final标示,所以接口中定义的变量就是全局静态常量。
    102 
    103 可以定义一个新接口,用extends去继承一个已有的接口
    104 接口不能继承普通类
    105 可以定义一个类,用implements去实现一个接口中所有方法。
    106 可以定义一个抽象类,用implements去实现一个接口中部分方法。
    107 如何定义接口?
    108 格式:
    109 [访问修饰符]  interface 接口名   [extends  父接口1,父接口2…]  {
    110 常量定义      //总是public   static  final
    111 方法定义       //总是:public   abstract
    112 }
    113 
    114 如何实现接口
    115 子类通过implements来实现接口中的规范
    116 接口不能创建实例,但是可用于声明引用变量类型。
    117 一个类实现了接口,必须实现接口中所有的方法,并且这些方法只能是public的。
    118 Java的类只支持单继承,接口支持多继承
    119 
    120 package interfacedemo;
    121 /**
    122  * 1,接口可以继承其他的接口,接口支持多继承
    123  * 2,一个类用implements 关键字去实现一个接口,一个类可以实现多个接口
    124  * 3,一个普通的类实现接口,则必须将接口中的所有抽象方法都实现
    125  * 4,一个抽象类实现接口,可以不实现接口中的抽象方法
    126  * @author tang
    127  */
    128 public interface MyInterface{
    129     //接口中可以定义成员变量,接口中的所有成员变量默认都是用public static final 修饰
    130     String name = "wangcai";
    131     //接口中所有的方法都是默认用public abstract 来修饰的
    132     public abstract void test01();
    133     public abstract void test02();
    134 }
    135 ckage interfacedemo;
    136 public class Person implements MyInterface{
    137     @Override
    138     public void test01() {
    139         System.out.println("test01");
    140     }
    141     @Override
    142     public void test02() {
    143         System.out.println("test02");
    144     }
    145 }
    146 
    147 C++支持多重继承,Java支持单重继承
    148 C++多重继承的危险性在于一个类可能继承了同一个方法的不同实现,会导致系统崩溃。
    149 Java中,一个类只能继承一个类,但同时可以实现多个接口,既可以实现多重继承的效果和功能,也避免的多重继承的危险性。
    150 
    151 class Student extents Person implements Runner,Flyer
    152 {…}
    153 注意:extends 必须位于implements之前
    154 
    155 开发打印机,墨盒:彩色,黑白,纸张类型:A4 B5,墨盒和纸张都不是打印机厂商生产的,打印机厂商需要兼容市场上的墨盒纸张
    156 package print;
    157 /**
    158  * 开发打印机,墨盒:彩色,黑白,纸张类型:A4 B5
    159  * 墨盒和纸张都不是打印机厂商生产的,打印机厂商需要兼容市场上的墨盒纸张
    160 
    161  * @author tang
    162  *
    163  */
    164 public class Test {
    165     public static void main(String[] args) {
    166         Print print = new Print();
    167         A4Paper a4 = new A4Paper();
    168         ColorBox box = new ColorBox();
    169         print.setPager(a4);
    170         print.setBox(box);
    171         print.print();
    172         
    173         B5Paper b5 = new B5Paper();
    174         BlackBox black = new BlackBox();
    175         print.setBox(black);
    176         print.setPager(b5);
    177         print.print();    
    178     }
    179 }
    180 
    181 
    182 
    183 package print;
    184 
    185 public class Print {
    186     private PaperInterface pager;
    187     private BoxInterface box;
    188 
    189     public void print() {
    190         System.out.println("正在使用" + box.showColor() + "的墨盒,在"
    191                 + pager.shosSzie() + "的纸张上打印");
    192     }
    193 
    194     public PaperInterface getPager() {
    195         return pager;
    196     }
    197 
    198     public void setPager(PaperInterface pager) {
    199         this.pager = pager;
    200     }
    201 
    202     public BoxInterface getBox() {
    203         return box;
    204     }
    205 
    206     public void setBox(BoxInterface box) {
    207         this.box = box;
    208     }
    209 }
    210 
    211 
    212 package print;
    213 
    214 public interface PaperInterface {
    215     String shosSzie();
    216 }
    217 
    218 
    219 
    220 package print;
    221 
    222 public interface BoxInterface {
    223     String showColor();
    224 }
    225 
    226 
    227 
    228 package print;
    229 
    230 public class ColorBox implements BoxInterface{
    231 
    232     @Override
    233     public String showColor() {
    234         // TODO Auto-generated method stub
    235         return "彩色";
    236     }
    237     
    238 }
    239 
    240 
    241 package print;
    242 
    243 public class BlackBox implements BoxInterface{
    244 
    245     @Override
    246     public String showColor() {
    247         // TODO Auto-generated method stub
    248         return "黑色";
    249     }
    250     
    251 }
    252 
    253 
    254 package print;
    255 
    256 public class B5Paper implements PaperInterface{
    257 
    258     @Override
    259     public String shosSzie() {
    260         // TODO Auto-generated method stub
    261         return "B5";
    262     }
    263 
    264 }
    265 
    266 
    267 package print;
    268 
    269 public class A4Paper implements PaperInterface{
    270 
    271     @Override
    272     public String shosSzie() {
    273         // TODO Auto-generated method stub
    274         return "A4";
    275     }
    276 
    277 }
  • 相关阅读:
    Vue.js中css的作用域
    vue搭建脚手架
    一对多,多对一关系映射
    java.time.format.DateTimeFormatter
    java.time.ZonedDateTime
    Akka(23): Stream:自定义流构件功能-Custom defined stream processing stages
    Akka(22): Stream:实时操控:动态管道连接-MergeHub,BroadcastHub and PartitionHub
    Akka(21): Stream:实时操控:人为中断-KillSwitch
    Akka(20): Stream:异步运算,压力缓冲-Async, batching backpressure and buffering
    Akka(19): Stream:组合数据流,组合共用-Graph modular composition
  • 原文地址:https://www.cnblogs.com/meizhoulqp/p/11280463.html
Copyright © 2020-2023  润新知