1.封装的步骤
2.封装的细节
1、关系图
2、基本语法
1.子类继承了所有的属性和方法,非私有的属性和方法可以直接被访问,但是私有属性不能再子类中直接访问,要通过父类提供公共的方法去访问。
2.子类没有继承父类的构造器,但必须要调用父类的构造器,完成父类的初始化。
3.当创建子类对象时,不管使用子类的那个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中 用super()去指定使用父类的那个构造器完成对父类的初始化工作,否则,编译不会通过。
4.如果希望指定去调用父类的某个构造器,则显示的调用一下:super(参数列表)。调用父类的无参构造器,可以不写,默认就是调用super(),调用有参构造器,在()里添加相应参数。
5.super在使用时,必须放在构造器第一行(super只能在构造器中使用)。
6.super()和this()都只能放在构造器第一行,因此这两个方法不能共存一个构造。
7.Java所有类都是Object的子类,Object是所有类的基类。
8.父类构造器的调用不限于直接父类!将一直往上追溯直到Object类(顶级父类)。
9.子类最多只有继承一个父类,即Java中是单继承机制。
10.不能滥用继承,子类父类必须满足is-a的逻辑关系 。[A继承B,B继承C]
(1).首先看子类是否有该属性。
(2).如果子类有这个属性,并且可以访问,则返回信息。
(3).如果子类没有这个属性,就看父类有没有(父类有且可以访问,就返回信息)。
(4).如果父类没有,就按照(3)继续往上找,知道Object。
当子类对象创建好狗,就建立查找的关系
内存布局
1.访问父类的属性,但不能访问父类的private 方法
2.访问父类的方法,不能访问父类的private 方法
3.访问父类的构造器,super()只能放在构造器第一句,只能出现一句。
重载于重写的区别
1.方法的多态
(1)重载体现多态
(2)重写体现多态
2.对象的多态
‼️重要‼️
(1)一个对象的编译类型和运行类型可以不一致
(2)编译类型在定义对象时,就确定了,不能改变
(3)运行类型可以变化的
(4)编译类型看定义=号的左边,运行类型看=号的右边
Animal animal = new Dog();//【ainmal】的编译类型是Animal,运行类型是Dog;
animal = new Cat();//【animal】的运行类型是Cat,编译类型仍然是Animal
向上转型调用的方法的规则如下:
(1)可以调用父类的所有成员(需遵守访问权限)
(2)不能调用子类的特有成员
(3)因为在编译阶段,能调用那些成员,是由编译 类型决定的
(4)最终的运行效果看子类(运行类型)的具体实现,即调用方法时,按照子类(运行类型)开始查找方法,然后调用。(编译是从object类到父类结束,而运行是从子类本类开始)
向下转型调用的方法的规则如下:
(1)语法:子类类型 引用名 =(子类类型) 父类类型;(强制转换)
(2)只能强转父类的引用,不能强转父类的对象
(3)要求父类的引用必须指向的是当前目标类型的对象
(4)可以调用子类类型中的所有的成员
多态的注意事项与细节
属性没有重写,属性的值看编译类型!
方法有重写,方法要看运行类型!
inStanceOf比较操作符,用于判断兑现提供的运行类型是否为xx类型或者xx类型的子类型
*************************************************************************************************************
1.当调用对象的方法时,该方法和该对象的内存地址/运行类型绑定。
2.当调用对象的属性时,没有动态绑定机制,哪里声明,哪里使用。
==是一个比较运算符
1.==:既可以判断基本类型,又可以判断引用类型
2.==:如果判断基本类型,判断的值是否相等。示例:int i = 10;double d = 10.0;
3.==:如果判断引用类型,判断的是地址是否相等,即判定是不同一个对象。【案例说明】
//== 比较引用类型,比较的是地址
A obj1 = new A();
A obj2 = new A();
A obj3 = obj1;//引用赋值,其实给的是地址
equals: 是obje类中的方法,只能判断引用类型,但是在子类中往往重写该方法,比较对象的属性是否相等,比如Integer,String 。
hashCode方法:
1.提高具有哈希结构的容器的效率!
2.两个引用,如果指向的是同一个对象,则哈希值肯定是一样的!
3.两个引用,如果指向的是不同对象,则哈希值是不一样的
4. 哈希值主要根据地址号来的!不能完全将哈希值等价子地址
toString方法:
基本介绍
1.默认返回:全类名+@+哈希值的十六进制,【查看Object 的toString方法】子类往往重写toString方法,用于返回对象的属性信息。例如:
public String tostring()
return getclass().getName() + "@" + Integer.toHexString(hashCode());
2.重写toString方法,打印对象或拼接对象时,都会自动调用该对象的toString形式。
3.当直接输出,一个对象时,toString 方法会被默认的调用
finalize方法
1. 当对象被回收时,系统自动调用该对象的finalize方法。子类可以重写该方法,做一些释放资源的操作
2.什么时候被回收:
当某个对象没有任何引用时,则jvm就认为这个对象是圾对象,就会使用垃圾回收机制来销毁该对象,在销毁该对象前,会先调用finalize方法。
3.垃圾回收机制的调用,是由系统来决定(即有自己的GC算法),也可以通过System.gc(主动触发垃圾回收机制)