黑马程序员---类型转换异常,多态中的转型,抽象类。第十天学习笔记

时间:2022-07-02 00:30:39

1.      第九天回顾

  继承:类和类的关系。单继承,多层继承

  成员变量,方法有,就方法,方法没有,子类成员,父类成员

    this本类成员,super父类成员

  成员方法,覆盖,重写,会写覆盖,复制父类方法,粘贴到子类中

  构造方法,子类所有构造器,第一行默认super() 访问父类空参数构造方法

  如果父类多个构造器,子类任选一个方法。父类没有空参数,子类必须手写super(参数),访问父类有参数构造。第一个无论是this,还是super选一个,保证构造方法直接或者间接访问父类构造方法。

  多态,  父类和子类之间的关系的用法  父类引用 = 子类对象,无限扩展子类,运行的方法都是子类重写后的,成员变量运行是父类。多态中,只能使用子类父类共有成员。

  final 成员,构造器,构造代码块,一次  成员都是定义的时候直接就赋值了

 

2.      第十天的学习内容,宠物案例,类型转换异常,多态中的转型,比较运算符 instanceof,多态中的细节--结论。抽象类  抽象方法,定义和使用方式

 

3.      多态中的类型转换

  父类  =  子类  类型的转换,自动类型提升,两边数据类型做到统一,小的转向大的。 子类转成父类类型,才能赋值。调用子类的特有内容,类型的强制转换!!

  类型转换异常  ClassCastException ,进行强制转型的时候,数据类型无法做运转。一旦发生,后面所有程序终止运行。

  避免异常发生,必须对变量a进行判断,a接收的到底是Cat类型,还是Dog类型

  如果是Cat类型,转成Cat,如果是Dog类型,转成、Dog

  使用比较运算符instancof完成这个功能。判断一个引用,是不是指向一个对象:判断出来a到底是猫,还是狗

   instanceof 运行结果是布尔值  引用类型 instanceof 类  

   if(a  instanceof Cat) 判断a引用,是不是指向Cat对象,如果是返回真

 

4.      多态的细节

  为什么多态中,有的运行子类,有的运行父类,有的情况还是编译失败

  存在于多态中,  父类 = new 子类()

l  成员变量,编译时期看引用类型中,有没有这个变量,有编译成功,否则编译失败

l  成员变量,运行时期,运行的是引用变量所属的类的结果

l  非静态成员方法,编译时期看引用类型中,有没有这个方法,有编译成功,否则编译失败

l  非静态成员方法,运行时期,运行子类重写后的方法

l  静态成员变量,编译时期看引用类型中,有没有这个变量,有编译成功,否则编译失败

l  静态成员变量,运行时期,运行的是引用变量所属的类的结果

l  静态成员方法,编译时期,看引用类型中,有没有这个方法,有编译成功,否则编译失败

l  静态成员方法,运行时期,运行的是引用型变量所属的类中的静态方法

简单记法:除了非静态成员方法以外,编译看父类,运行看父类,只有非静态的成员方法,编译看父类,运行看子类

   编译看左边,运行看右边  Fu f = newZi()非静态成员方法

   编译看左边,运行看左边  Fu f = newZi()除了非静态成员方法

     JVM有动态绑定和静态绑定机制,多态中的机制,除了非静态的成员方法以外,JVM都会静态的绑定在父类的引用中,只有在运行非静态的成员方法,JVM会动态的绑定到子类的对象中。

 

5.      抽象类

  抽象方法:说不清楚,讲不明白,定义个方法的时候,发现方法没有实际的意义,没有实现,没有逻辑(Animal 吃什么),使用抽象方法。

  新的关键字abstract , 没有大括号,没有方法体,根本不能运行。

  抽象方法,必须存在于抽象类中,因此,类必须用abstract修饰

 

  抽象类的用法:

     抽象类不能实例化对象,不能区new 一个抽象类

     需要子类继承抽象类,重写抽象方法,建立子类的对象

 

  抽象类继承上的细节:

     如果子类继承后,只重写了部分抽象方法,或者没重写抽象方法,子类还是一个抽象类.

     抽象类,强制子类重写抽象方法

 

6.      抽象类的自身特点:

l  抽象类有没有构造方法,肯定有,第一行默认super

l  抽象类中,有没有普通方法,非抽象方法,可以有,子类继承后直接使用

l  抽象类中,有没有静态普通方法,可以有,类名直接调用

l  抽象类中,可不可以没有抽象方法,,可以没有。真的没有抽想法,能建立对象吗,不可以建立对象,类是抽象的,不可以创建对象

 

7.      abstract和哪些修饰符不能并存,为什么

l  private,抽象就是为了子类重写,私有权限,子类无法继承和重写

l  final,抽象就是为了子类重写,final修饰,方法不能被重写

l  static,可以直接类名调用,抽象没有方法体

 

8.      设计模式

  什么是设计模式:人们用程序解决现实中问题的一种思维方法。Java中的所有设计模式,基于面向对象思想。一共有23种设计模式:模板方法,单例,适配器,装饰。(工厂模式,工厂方法,抽象工厂,享元,中介者,观察者,命令,桥梁)

  要求:

    计算程序的执行时间,1000次for循环。开始前记录一个时间,结束的时候记录一个时间。两个时间相减。

   class System{

        public staticlong currentTimeMillis(){}

   }

  long 变量 = System. currentTimeMillis();

  返回自 1970年1月1日午夜零时,到方法运行的那个时刻,所经过的毫秒值

  1000毫秒=1秒

 

  统计While 1000次.for也是1000次,统计什么,不确定.

  不确定的代码,封装成了另一个方法,调用就可以了。但是问题还是没处理,

  code方法中的代码是不确定,而getTime方法是不变的。将变化的内容,对外暴露出去,自己不实现,等待子类实现.

  引用领域:如果你去实现一个功能,发现功能一部分清楚,一部分不清楚,不清楚的部分写成抽象方法,等待子类重写实现--模板方法设计模式