Java SE学习总结 Day (12)

Day 12开篇:
      
        "
今天java基础主要学习了面向对象中多态情况下虚拟方法调用,关于多态当中方法重写的或者重载的问题,instanceof操作符,对象的类型转换问题,接口,模板设计模式, 抽象类等。 "




知识点反馈:

今天的知识点总结的思维导图

 


 

一. 多态
1. 多态情况下虚拟方法调用:
子类当中定义了和父类同名同参数的方法,在多态的情况下,将此时父类的那个方法称之为"虚拟方法";父类根据赋给他的不同子类对象,动态的调用该子类的方法,这样的方法调用在编译器是无法确定的,所以也被称之为动态绑定。
例子:
     Person s = new Student();
     s.getInfo();
我们在编译s的Person类的时候,而方法的调用是在运行时确定的,所以调用的是Student的getInfo方法
 
2. 关于多态当中方法重写的或者重载的问题:
(1) 重载:在同一个类当中,出现了方法名相同参数列表不同,与返回值无关。编译器会根据方法的不同参数列表,对方法名进行标识修饰,对于编译器而言,这些同名的方法其实已经被划分不同的标识地址,他们在编译的时候其实就已经分好类了,这个其实也被称之为"静态绑定"/"早绑定"。
(2) 重写:对于多态的这种情况,如果存在了方法重写,因为编译器在编译的时候涉及到了N个类,他无法确定你究竟是调用哪个类,或者说是不是有进行重写。 因为类不是被同时加载,所以在类加载的时候根本无法确定你到底调用的是哪个类的哪个方法,只有你在运行的时候,才内确定你的内存空间是什么,这种也被称之为"动态绑定"/"晚绑定"。
(3) 多态采用的是动态绑定,所有是运行时确定。
(4) 成员方法:因为方法存在重写的问题,如果是重写则一定执行子类
(5) 成员变量:变量不存在重写,所以一定以左边栈内存为主
(6) 静态资源:因为不存在,所以一定左边的栈内存位置
 
3. instanceof操作符:
(1) 格式: x instanceof A:检查x是否为A类的对象,返回值为boolean类型
(2) 注意:
<1>x必须是A的直属类,或者是父子关系类,否则编译错误
<2>如果x是A的子类,或者A的孙子类,其结果也是true
<3>这个操作符一般使用多态的向下转型当中,避免类型不同而操作类型转换失败
 
4. 对象的类型转换问题:
(1) 基本数据类转换:
<1>自动转换:小的数据可以自动的转化为大的数据:
例如:int a = 10; long l = a;
<2>强制转换:将大的数据类型强制赋值小的数据类型
例如:long l = 200; int a = (int)l;
(2) Java的对象的强制类型转换也被称之为造型转换:
<1>从子类转换父类直接进行自动转换
<2>从父类到子类必须进行强制转换
<3>无继承关系的情况下,所有引用数据的相互转换都是非法
<4>在转换之前,如果代码复杂,建议您使用instanceof进行类型校验
 
 
 
 
二. 接口
1. 接口的特点:
(1) 接口使用interface进行定义:interface 接口名{}
(2) 如果一个类需要实现一个接口,则使用implements:class 类名 implements 接口名{}
(3) 接口无法进行实例化,使用具体的实现类来进行实例:Eraser e = new  ClearPencil();
(4) 接口会不会有子类?
<1>接口可以继承接口,但是意义不大 因为继承的还是一个接口
<2>具体类可以实现接口,但是不能继承接口(具体类实现接口是推荐方案,一般只会这么做)
<3>抽象类可以实现接口,但是不能继承接口
 
2. 接口的成员特点:
(1) 成员变量:只能定义常量,必须是静态常量
例如: 默认语法为:
                public final static int num = 20;
                却什么关键字,系统默认给你补什么关键字,你无法控制。
(2)成员方法:只能是抽象方法
例如:默认修饰符:public abstract void show();
(3)构造方法:没有构造方法,因为对于接口来说,构造方法没有任何用途,因为没有任何数据需要进行初始化
 
3.继承和实现区别(类和接口的区别):
(1)类和类:继承关系(extends),而且只能是单继承
(2)类和接口:实现关系(implements),可以是多实现,而且可以继承一个类的时候,仍然可以实现多个接口
(3)接口和接口:继承关系,可以是单根继承,也可是多根继承
 
4.接口的作用:约束、规范、标准、扩展
 
5.什么时候使用抽象或使用接口?
 
(1)抽象:适合的场景是在继承的前提下,当父类出现了无法具体的行为的时候,要求子类必须具体化的过程。
(2)接口:适合使用的场景是在某一些类无法满足功能的时候,进行扩展的行为,且某一些行为需要被约束的时候。
 
6.抽象和接口的区别:
(1)接口是一个比抽象更加抽象的行为,以为抽象类允许存在非抽象方法,而接口只能抽象方法。
(2)抽象类允许存在常量、变量以及静态,而接口只能是常量静态。
 
三. 模板设计模式
1. 概念:
例如以后再开发当中,可能会遇到不同的算法,而这个算法需要被经常使用,这个算法只有某一个部分是其他程序进行编写,而大部分是进行固定的。此时这种情况,我们就应该将固定的代码包裹成一个方法,不固定的代码要求其他程序员进行填充。这种模式其实就是模板设计模式。
 
2. 步骤:
(1)定义一个骨架方法(固定的代码片段)
(2)定义一个强制要求填充的代码片段(抽象方法)
(3)调用骨架方法,此时也会要求其他人必须填充不固定的代码(继承和多态的前提)
 
四. 抽象类:
1. 概念:
当一个类的大部分行为是不具体的,那么这个时候,就应该将这些方法进行抽象,那么谁来继承这个类,子类就要求必须将该方法进行具体,父类不能具体方法,强制要求子类去实现。
 
2. 抽象类的特点:
(1)用abstract关键字来修饰一个类,这个类叫做抽象类
(2)用abstract来修饰一个方法,该方法叫做抽象方法;抽象方法:只有方法的声明,没有方法的实现。以分号结束(因为一个抽象方法,本身就不是一个具体,何必去写代码)
(3)含有抽象方法的类必须被声明为抽象类。
(4)抽象类不能被实例化。抽象类是用来被继承的,抽象类的子类必须重写,那么怎么去使用抽象,就是多态,利用其具体的子类来进行实例。
(5)不能用abstract修饰变量、代码块、构造器
(6)不能用abstract修饰私有方法、静态方法、final的方法、final的类。
(7)抽象类的子类:
a.子类必须重新父类的所有抽象方法
我能不能不重写?
能,因抽象类子类依旧还可以是抽象类,那么就继续用abstract修饰子类就可以了
b.如果子类不想继续抽象,就必须重新父类的所有抽象方法。
总结一句话:
强制要求子类必须实现父类没有完成方法,父类进行抽象,子类进行具体,谁继承谁负责




 

发布了29 篇原创文章 · 获赞 7 · 访问量 3170

猜你喜欢

转载自blog.csdn.net/weixin_45406656/article/details/104217722