java-封装、继承、多态笔记

一、封装

1.封装的步骤

java-封装、继承、多态笔记_第1张图片

2.封装的细节

java-封装、继承、多态笔记_第2张图片

二、继承

1、关系图

java-封装、继承、多态笔记_第3张图片

2、基本语法

extends 非常重要

java-封装、继承、多态笔记_第4张图片

细节:

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。

3.、继承的本质分析

 当子类对象创建好狗,就建立查找的关系

内存布局

java-封装、继承、多态笔记_第5张图片

‼️属性没有动态绑定机制,修改后保持修改后的值不变‼️

4.super关键字

1.访问父类的属性,但不能访问父类的private 方法

2.访问父类的方法,不能访问父类的private 方法

3.访问父类的构造器,super()只能放在构造器第一句,只能出现一句。

java-封装、继承、多态笔记_第6张图片

 方法重写和覆盖java-封装、继承、多态笔记_第7张图片

重载于重写的区别

java-封装、继承、多态笔记_第8张图片

三、多态

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类型的子类型

************************************************************************************************************* 

java的动态绑定机制    ‼️非常非常重要‼️

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  。     

**************************************************************************************************

Object类详解

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(主动触发垃圾回收机制)

你可能感兴趣的:(intellij-idea,java)