目录
1. 面向对象高级01
1.1 static 关键字
1.1.1 static 关键字的介绍
1.1.2 static 修饰成员的特点
1.1.3 static 关键字总结
1.2 继承
1.2.1 继承介绍
1.2.2 继承 - 学习路径
1.2.3 继承中的成员访问特点 - 成员变量
1.2.4 继承中的成员访问特点 - 成员方法
1.2.5 Java 中继承的特点
1.2.6 继承中的构造方法执行流程 - 内存图解
1.2.7 this 和 super
1.3 final 关键字
1.3.1 final 关键字的介绍
1.3.2 final 修饰变量的细节补充
1.3.3 今日学习目标
1.4 包
1.5 抽象类
1.5.1 抽象类的介绍
1.5.2 抽象类注意事项
1.5.3 abstract 关键字的冲突
1.6 接口
1.6.1 抽象类与接口
1.6.2 接口的介绍
1.6.3 接口中成员的特点
1.6.4 类和接口之间的各种关系
1.6.5 抽象类和接口的对比
1.6.6 接口的应用场景
1.7 多态
1.7.1 多态介绍
1.7.2 多态的成员访问特点⭐
1.7.3 多态的好处和弊端
1.7.4 多态中的转型
1.7.5 多态中的转型问题
1.7.6 今日学习目标
1. 面向对象高级01
1.1 static 关键字
1.1.1 static 关键字的介绍
static 是静态的意思,可以修饰成员变量,也可以修饰成员方法
1.1.2 static 修饰成员的特点
- 被其修饰的成员, 被该类的所有对象所共享
- 多了一种调用方式, 可以通过类名调用
- 随着类的加载而加载, 优先于对象存在
- 在静态方法中, 只能访问静态成员 (直接访问)
如在线人数: 被所有人共享,即可用static修饰该成员。
详细具体的内存结构如下
1.1.3 static 关键字总结
1.2 继承
1.2.1 继承介绍
什么时候使用继承?
当类与类之间,存在相同 (共性) 的内容,并且产生了 is a 的关系,就可以考虑使用继承,来优化代码。
学生:姓名,年龄 项目经理:姓名,工号,工资
老师:姓名,年龄 程序员:姓名,工号,工资
-------------------------- ---------------------------------------
人:姓名,年龄 员工:姓名,工号,工资
1.2.2 继承 - 学习路径
- -成员变量
- -成员方法
- -构造方法
1.2.3 继承中的成员访问特点 - 成员变量
如需要使用父类的,怎么办? 使用super关键字来进行解决,即在成员变量面前使用super.
public class Zi extends Fu {
int num = 20;
public void method(){
// System.out.println(num);
System.out.println(super.num);
}
}
1.2.4 继承中的成员访问特点 - 成员方法
子类重写父类的要求
注意事项
权限修饰符
1.2.5 Java 中继承的特点
为什么不支持多继承? 因为这样会产生冲突。
为啥多层继承可以? 因为不会产生冲突,子类的方法覆盖了父类的方法。
需明确 this super所在的位置
'com.itheima.mextends.ExtendsDemo3.super' cannot be referenced from a static context
public class ExtendsDemo3 { public static void main(String[] args) { Son s = new Son(30); s.love(); s.getMethod(); System.out.println(s.num); // 这个的super指的不是 Father 因为此时所在的类为ExtendsDemo3 // 即需要主要所在的类 以及this super 的归属问题 // System.out.println(super.num); } } class Father { public int num ; public Father(int num) { this.num = num; } public void love() { System.out.println("送花"); System.out.println("送肉"); System.out.println("唱歌"); } public void getMethod(){ System.out.println("124"); } } class Son extends Father { @Override public void love() { System.out.println("送酱肉包"); System.out.println("送口红"); System.out.println("我喜欢你, 一起去爬山吗~"); } public Son(int num) { super(num); } }
继承中的成员访问特点 – 构造方法
在子类中如何完成父类的初始化?
在所有的构造方法中,都默认隐藏了一句话 super();
通过这句代码,来访问父类的空参构造方法
1.2.6 继承中的构造方法执行流程 - 内存图解
1.2.7 this 和 super
- this:代表本类对象的引用
- super:代表父类存储空间的标识
注意:this() 和 super() 都在争夺构造方法第一行的位置,所以二者不能共存.
被调用的变量和方法, 在子类中不存在, super.可以直接省略的
1.3 final 关键字
1.3.1 final 关键字的介绍
final 关键字是最终的意思,可以修饰(方法,类,变量)
final 修饰的特点
- 修饰方法:表明该方法是最终方法,不能被重写
- 修饰类:表明该类是最终类,不能被继承
- 修饰变量:表明该变量是常量,不能再次被赋值
1.3.2 final 修饰变量的细节补充
- 变量是基本类型:final 修饰指的是基本类型的数据值不能发生改变
- 变量是引用类型:final 修饰指的是引用类型的地址值不能发生改变,但是地址里面的内容是可以发生改变的
- 成员变量如果被 final 修饰,需要在构造方法结束之前完成赋值
1.3.3 今日学习目标
1.4 包
1.5 抽象类
1.5.1 抽象类的介绍
抽象类是一种特殊的父类,内部可以编写抽象方法
抽象类: 特殊的父类 问题: 特殊在哪里呢? 回答: 内部允许编写抽象方法 问题: 什么是抽象方法? 回答: 当我们将共性的方法, 抽取到父类之后, 发现这个方法在父类中无法给出具体明确(描述不清了) 而且这个方法, 还是子类必须要有的方法, 就可以设计为抽象方法.public class AbstractTest1 { public static void main(String[] args) { } } abstract class Animal { public abstract void eat(); } class Cat extends Animal { @Override public void eat() { System.out.println("猫吃鱼"); } } class Dog extends Animal { @Override public void eat() { System.out.println("狗吃肉"); } }
抽象方法和抽象类
■ 抽象方法的定义格式:
- public abstract 返回值类型 方法名(参数列表);
■ 抽象类的定义格式:
- public abstract class 类名{}
1.5.2 抽象类注意事项
1.5.3 abstract 关键字的冲突
- final:被 abstract 修饰的方法,强制要求子类重写,被 final 修饰的方法子类不能重写
- private:被 abstract 修饰的方法,强制要求子类重写,被 private 修饰的方法子类不能重写
- static:被 static 修饰的方法可以类名调用,类名调用抽象方法没有意义
1.6 接口
生活中的接口,其实接口是一种规则。
1.6.1 抽象类与接口
接口是一种特殊的抽象类
接口: 体现的思想就是声明 [规则] 思路: 如果发现一个类, 所有的组成, 都是抽象方法 - 没有成员变量 - 没有普通方法 这种类, 我们通常会设计为Java中的接口, 因为现在这个类存在的唯一价值, 就只是声明规则了
1.6.2 接口的介绍
1.6.3 接口中成员的特点
接口的成员特点 : 1. 成员变量 : 只能定义常量, 因为系统会默认加入三个关键字 public static final - 这三个关键字没有顺序关系 2. 成员方法 : 只能是抽象方法, 因为系统会默认加入两个关键字 public abstract 3. 构造方法 : 没有
1.6.4 类和接口之间的各种关系
接口继承接口
1.6.5 抽象类和接口的对比
1.6.6 接口的应用场景
接口可以为程序制定规则, 代码更加规范
抽象类和接口的对比
- 抽象类 : 对事物做抽象 (描述事物)
- 接口 : 对行为抽象 (制定规则)
1.7 多态
1.7.1 多态介绍
同一个行为具有多个不同表现形式或形态的能力
多态前提
- 有继承 / 实现关系
- 有方法重写
- 有父类引用指向子类对象
1.7.2 多态的成员访问特点⭐
- 成员变量:编译看左边(父类),执行看左边(父类)
- 成员方法:编译看左边(父类),执行看右边(子类)
1.7.3 多态的好处和弊端
多态的好处 :提高了程序的扩展性
- 对象多态 : 将方法的形参定义为父类类型, 这个方法可以接收该父类的任意子类对象
- 行为多态 : 同一个行为, 具有多个不同表现形式或形态的能力
多态的弊端:不能使用子类的特有成员
1.7.4 多态中的转型
1.7.5 多态中的转型问题
概述:如果被转的引用类型变量,对应的实际类型和目标类型不是同一种类型,那么在转换的时候就会出现ClassCastException
- 关键字 instanceof
- 使用格式:
对象名 instanceof 类型
判断一个对象是否是一个类的实例
通俗的理解:判断关键字左边的对象,是否是右边的类型,返回boolean类型结果