多态(重要)
多态 : 事物的多种形态
狗 -> 金毛,藏獒,哈士奇..
人 -> 黄种人,白种人,黑种人,红种人..
水 -> 液态,固态,气态
多态的前提条件:
1. 必须有继承/实现关系 -> 必要条件
2. 要有方法的重写 -> 不是必要条件,如果有方法的重写,会看到 "动态绑定" 现象
3. 父引用指向子类对象 -> 必要条件: Fu fu = new Zi(); //向上转型
Dog dog = new JingMao(); √
JingMao jm = new Dog(); X
多态的本质: Java引用数据类型子父类之间的类型转换!!
基本数据类型之间有类型转换 : byte,short,char < int < long < float < double
自动提升 : 大类型的变量接收小类型的值/变量
强制转换 : 小类型的变量强制接收大类型的值/变量 -> 可能会有精度损失
引用数据类型子父类之间有类型转换 : 父类/父接口 > 子类
向上转型: 父 接收 子
向下转型: 子 接收 父
只要有对象调,先找到对象创建的位置:
- 对象调属性 : 编译看左边,运行看左边
- 对象调方法 : 编译看左边,运行看右边
- 对象调静态方法: 编译看左边,运行看左边
多态场景下成员访问问题
多态场景下成员变量的访问问题: 和继承关系下成员变量的访问特点一致
-> 就近原则/子类有就调子类的,子类没有就找父类要,父类也没有报错
多态场景下成员方法的访问问题: --> "动态绑定"
具体传入的对象是谁.就调用哪个对象的方法
多态的使用场景
1. 把父引用作为方法的形参,启动方法的方式是 n + 1 种 (n: 子类们 1 : 父类自己)
2. 把父引用作为方法的返回值类型,返回方法结果的方式是 n + 1 种
3. 把父引用作为容器的数据类型,容器中元素的数据类型就可以是n + 1 种
权限修饰符(掌握)
访问权限修饰符 :
public > protected > 不写 > private
public : 只要在一个模块下,都可以访问
private : 只能在本类中用
protected 比 默认不写的权限修饰符 多一个 在不同包下有继承关系类中 可以访问;
同一个类 | 同包不同类 | 不同包有继承关系 | 不同包无关类 | |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | |
不写 | √ | √ | ||
private | √ |
构造代码块(理解)
构造代码块:写在类中方法外的代码块 叫构造代码块
格式:
public class 类名{
{
//构造代码块
}
}
执行时机 :
1. 每一次调用构造方法(创建对象)的时候,构造方法都要执行一次;
2. 构造代码块要先于构造方法执行!!
作用: 为对象的出现做准备!!
静态代码块(理解)
静态代码块:
格式:
public class 类名{
static{
//静态代码块
}
}
执行时机:
当类第一次使用的时候(类加载的时候)执行一次静态代码块,而且只执行一次静态代码块
作用:
静态代码块是为了类加载做准备 -> 类加载的驱动
成员内部类(了解)
内部类 : 定义在类内部的类叫内部类
成员内部类 : 定义在类成员位置的类叫成员内部类
成员内部类的使用场景 : 当一个类只为另一个类服务时,可以把这个类作为外部类的内部类,在外部类的内部去定义!!
格式:
public class Outer{//外部类
//成员内部类
public class Inner{//内部类
}
}
a. 在内部类中访问成员:
1. 成员变量 : 作用域/就近原则
this.num : 强制访问本类成员位置上的变量
Outer.this.num : 强制访问本类外部类成员位置上的变量
2. 成员方法 :
可以无阻碍的访问外部类的不同名方法(隐藏了 Outer.this.)
强制访问外部类的同名成员方法 : Outer.this.show();
b. 在外部类中访问成员:
1. 无阻碍的访问本类自己的
2. 不能直接访问本类内部类的成员,如果要访问 就必须创建内部类的对象
c. 在第三方类中访问内部类成员
Outer.Inner inner = new Outer().new Inner();
静态成员内部类(了解)
格式:
public class Outer{//外部类
//成员内部类
public static class Inner{//内部类
}
}
a. 在内部类中访问外部类成员
注意: 静态成员内部类中不能访问外部类非静态的成员,非要访问:
1. 把外部类成员用static修饰
2. 创建外部类的对象访问
b. 在外部类中访问内部类成员 : 创建内部类对象,内部类对象调用成员
c. 在第三方类中访问内部类成员
创建内部类对象,内部类对象调用成员
Outer.Inner inner = new Outer.Inner();
局部内部类(了解)
局部内部类的使用场景 : 一个类只为一个方法服务时,可以把这个类定义在方法内! --> 此场景很少见!!
匿名对象(掌握)
匿名 : 没有名字
对象 : 类名 对象名 = new 类名();
匿名对象 : new 类名();
匿名对象能干嘛 ? 对象能干嘛它能干嘛!
注意 : 匿名对象是一次性的,使用一次后就不能再用了
匿名对象的使用场景 : 如果一个对象只使用一次,那么就可以拿着这个对象的匿名对象直接使用!
匿名内部类(重要)
匿名内部类:
1. 匿名内部类是局部内部类中的一种(匿名内部类使用很多)
2. 匿名内部类是对 接口/抽象父类/普通父类 的简化的实现/继承方式!!
使用前提 : 匿名
如果接口的实现类对象/抽象父类的子类对象/普通父类的子类对象 仅仅只使用一次,那么就可以使用匿名内部类简化代码量;
匿名内部类的使用格式:
new 接口/抽象父类/普通父类(){
//接口/抽象父类/普通父类一个不知名实现类/子类的 类主体!!
实现接口/抽象父类的抽象方法 / 主动重写普通父类中的方法;
};
匿名内部类匿名掉的是 实现类/子类的 类名!!