笔记内容:今天讲解的主要是多态
笔记来源:毕向东Java基础视频第08天
正文:
毕老师 day-8
1 多态:可以理解为事物存在的多种体现形态
人:男人,女人
动物:猫, 狗
猫 x=new 猫();
动物 x=new 猫();
动物 x=new 狗();
动物 x=new 鸡();
这种事物存在多种形态吧
多态在对象上面的体现 也在方法上面体现
1 多态的体现
父类的引用指向了 自己的子类对象
父类的引用也可以接受自己的子类对象
2 多态的前提
必须是类与类之间有关系,要么继承,要么实现
存在覆盖
3 多态的好处
大大提高了程序的扩展性。
4 多态的弊端
只能使用父类的引用访问父类中的成员
父类告诉你应该做什么(父类中的成员),你做不就可以了吗
5 多态的应用
类型提升,向上转型
如果想要调用猫的特有方法时,如何操作
强制将父类的引用,转换成为子类类型,向下转型
6 多态的出现代码中的特点(多态使用的注意事项)
成员函数的特点:(非静态,因为有重写特性)
编译时期,new出来的还不存在,引用型变量所属的类中是否有调用的方法。如果没有编译失败
运行时期,对象所属的类是否有调用方法
Fu f=new Zi();
编译看f
运行看Zi
简单总结:编译看左边,运行看右边
多态中成员变量中的特点,
在多态中,静态成员函数的特点,无论编译或者运行都是参考左边 static
Fu f=new Zi();
父类,子类同名变量,多态时,调用的是左边的
静态方法不需要对象,只要是父类的引用,就去引用型变量,不属于对象
Fu.method4() f.method1()
静态绑定 动态绑定
静态只是参考引用所属 Fu f (进到内存就绑定好了,对象会变的)
静态的话,就不会被覆盖了
Animal a=new Animal();//向上提升
a.eat();
Cat c=(Cat)a;
c.catchMouse();
多态里面至始至终都是子类对象在做着变化
instanceof 判断所属类型,之后使用所属类型的特有方法
1 子类是有限的
10.3 :多态的主板实例
结合图来写
先有规则,大家都照着做,就和谐了
接口:实现了功能的扩展 复写就可以了
多态:提高了程序扩展性
PCI p=new NetCard();
接口:降低了耦合性,提高了扩展性,implements 这个规则就可以了
接口的引用,提高程序的扩展性,多态
接口和多态的综合使用
10.4 多态的扩展实例
需求:数据库操作
1 连接数据库 JDBC Hibernate
2 操作数据库
c create r read u update d delete
3 关闭数据库连接
考虑过程序的扩展性吗?
为了降低耦合性,通过接口完成
两者之间先不要动手,定义一个规则,按照这个规则,我就可以实现你
DAO data access object
使用一个接口
10.4 Object类 所有对象的直接或者间接父类
类层次结构的根类 上帝类
该类中定义的肯定是所有对象都具备的功能。
java对象认为:所有对象都具备比较性
没有必要重新定义,只要沿袭父类的功能,建立自己特有比较内容即可,这就是覆盖
(object)父类默认是比较两个对象的地址相等否,可以比较,但是意义不大
想要建立自身特有内容
1 复写
2 但是父类的参数是object所以,需要做判断和转换动作
才可以进行有意义的比较
这些class 文件都有名称,构造函数,一般方法 Class 来描述这些class文件
equals() 方法 toString()方法 hashCode()方法 getClass() 方法 getMethods() 方法 反编译,运行文件给我,反编译,知道怎么写的 getName() 方法
getClass().getName()+@+Integer.toHexString(d1.hashCode());
有共性就可以描述
所有的对象都有自己的内存地址(哈希值)
new Demo(4);
进去内存的时候,类文件被封装成为对象了
类里面又很多东西
对象里面定义很多功能,来获取其中某些东西
Person
getName();
父类默认的没有什么太大的意义,一般在子类都被复写了
如果object被抽象了,那么写子类要复写抽象,不方便
基本数据类型不是对象,是一种特殊的存在
一个变量存一个值 数组存多个值
栈(掌握)
A 存储局部变量:定义在方法声明上和方法中的变量 定义在方法中,以及方法上面的参数
B 堆 存储new出来的数组或者对象 new
C 方法区:代码区
D 本地方法区 :与系统有关
E 寄存器 : 给CPU使用
运行.class 加载到内存里面
有进栈的(局部变量),有进堆的(new出来的)
new int[3]; 连续的三块空间,动态初始化
首先,主方法相当于子弹,进入栈底部 先进后出
数组最大的好处:每一个元素都有一个索引,可以通过索引去获取元素,对于数据操作方式的改变,这个效率是非常高的
内存图解:
越界与空指针
java中到底是传值还是传址
[I@ (十六进制的值) 这个是真正传递的值
总结:
java中有木有真正意义上的的引用传递?
int[] arr={}; 引用=变量
谈谈你对值传递和引用传递的理解
java中没有真正意义的引用传递
基本类型的变量作为参数传递过来的是变量的值
引用类型的变量作为参数传递过来的是地址值
我们对引用类型的变量的操作实际是根据 内存地址值 对 内存中对象 的操作 |