1.上转型对象
Teacher teacher=new MathTeacher();
teacher.teach();
1.1 对于成员方法来说
编译看左边,运行看右边
teacher对象可以使用的方法,是在teacher类中定义过的方法teach(),真正执行的时候,调用的是子类MathTeacher对象中重写的方法teach()
1.2 对于成员变量来说
teacher对象使用的是父类中的成员变量,而不是子类中的成员变量
1.3 对于static方法来说
编译看父类,运行看父类
2.多态转型
1.上转型
2.下转型
3.抽象类
1.抽象类不能直接实例化,不能用new方法创建对象
2.抽象类中抽象方法没有方法体,无法执行
3.抽象类不⼀定有抽象⽅法, 有抽象⽅法的类⼀定是抽象类或者接⼝
4.1 抽象类的使用
1.可以使用普通子类完成抽象类的对象创建--子类必须重写所有的抽象方法
2.使用匿名内部类
5.抽象类中普通成员方法和抽象方法都可以存在
6.抽象中成员变量和普通类中一样
4.抽象类的子类可以是什么
1.普通子类
普通子类必须重写所有的抽象方法--创建抽象类对象
Abstract abstract;
public class A extends abstract;
A a=new abstract();
2.抽象子类--继承抽象父类
直接继承抽象父类的所有抽象方法,不一定要重写所有的抽象方法
Abstract abstract;
Abstract abstract2 extends abstract;
5.abstract
6.static
*被static修饰的变量,推荐通过类名调用
6.1 属性、方法
1.被static 修饰的属性,属于类本身,所有这个类生成的对象都拥有这个属性
2.被static 修饰的变量,存在于方法区/静态区,叫静态变量/类变量
3.被static修饰的方法,叫静态方法/类方法
6.2 属性、方法的调用
1.可以由对象调用静态属性/静态方法
2.可以由类调用静态属性/静态方法
3.静态方法只能调用静态属性和静态方法
6.3 静态成员声明周期
1.静态成员随着类的加载而存在,类消失而消失 ,当类被使用的时候, jvm不关闭, 静态就⼀直存在, 太多话 ,容易造成内存溢出,类的字节码文件会被加载到方法区,静态成员被加载到静态方法区
2.静态方法中不能使用this,因为static方法的加载在对象创建之前
6.4 static 使用范围
1.频繁被使用的成员变量和成员方法推荐使用static
6.5 局部变量 成员变量 类变量
局部变量 成员变量 类变量区别:
位置:
局部变量:方法中
成员变量:类中方法外
类变量:类中方法外,被static修饰
内存中位置:
局部变量:栈内
成员变量:堆内
类变量: 方法区内,只有一份
生命周期:
局部变量:和方法相关,随着方法的存在/消亡而存在/消亡
成员变量:和对象相关,随着对象的存在/消亡而存在/消亡
类变量: 和类相关,随着类的存在/消亡而存在/消亡
使用方法:
局部变量:只能在方法内使用
成员变量:通过对象调用,对象名.成员变量名
类变量: 共享的,类名.类变量名
初始化:
局部变量:要手动初始化后才能使用
成员变量:有初始化值,自行设定或者是默认值
类变量:有初始化值,自行设定或者是默认值
局部变量 | 成员变量 | 类变量 | |
---|---|---|---|
代码中位置 | 方法中 | 类中方法外 | 类中方法外 |
内存中位置 | 栈 | 堆 | 静态方法区 |
声明周期 | 方法存在它存在 | 对象存在它存在 | 类存在它存在 |
使用方法 | 被方法使用 | 被对象使用 | 被类和对象使用 |
初始化 | 要手动初始化才可使用 | 声明之后初始化,或者使用默认值 | 声明之后初始化,或者使用默认值 |