Java 继承与接口
- 继承
- 多个类相同的成员可以放到同一个类中 提高了代码的维护性 如果功能的代码需要修改,修改一处即可 让类与类之间产生了关系,是多态的前提 其实这也是继承的一个弊端:类的耦合性很强
- Java中继承的注意事项
- 子类只能继承父类所有非私有的成员(成员方法和成员变量)子类不能继承父类的构造方法,但是可以通过super(后面讲) 关键字去访问父类构造方法
- 不要为了部分功能而去继承结论:
- 在子类方法中访问一个变量 首先在子类局部范围找然后在子类成员范围找
- 最后在父类成员范围找(肯定不能访问到父类局部范围) 如果还是没有就报错。(不考虑父亲的父亲…)
- 继承中构造方法的关系
- 如何父类中没有构造方法,该怎么办呢?
- 子类通过super去显示调用父类其他的带参的构造方法
- 子类通过this去调用本类的其他构造方法
- 本类其他构造也必须首先访问了父类构造 一定要注意:
- super(…)或者this(….)必须出现在第一条语句
- 否则,就会有父类数据的多次初始化
- 方法重写的注意事项
- 父类中私有方法不能被重写
- 子类重写父类方法时,
- 访问权限不能更低
- 父类静态方法,子类也必须通过静态方法进行重写。
- final修饰局部变量
- 在方法内部,该变量不可以被改变
- 在方法声明上,分别演示基本类型和引用类型作为参数的情况
- 基本类型,是值不能被改变
- 引用类型,是地址值不能被改变
- 多态成员访问特点
- 成员变量 编译看左边,运行看左边 成员方法 静态方法 编译看左边,运行看左边
- 静态方法不能算方法的重写
- 多态的好处和弊端
- 多态的好处
- 提高了程序的维护性(由继承保证)
- 提高了程序的扩展性(由多态保证)
- 多态的弊端
- 不能访问子类特有功能 多态中的转型
- 从子到父 父类引用指向子类对象向下转型
- 从父到子 父类引用转为子类对象
- 抽象类概述
- 一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。
- 抽象类特点
- 抽象类和抽象方法必须用abstract关键字修饰
- 抽象类不一定有抽象方法,有抽象方法的类一定是抽象类
- abstract不能和哪些关键字共存
- private 冲突 final 冲突static 无意义
- 接口
- 接口成员特点
- 成员变量: 只能是常量
- 默认修饰符
- public static final
- 构造方法:
- 没有,因为接口主要是扩展功能的,而没有具体存在
- 成员方法:
- 只能是抽象方法 默认修饰符 public abstract
- 类与类,类与接口以及接口与接口的关系
- 类与类 继承关系,
- 只能单继承,但是可以多层继承
- 类与接口
- 实现关系,可以单实现,也可以多实现。还可以在继承一个类的同时实现多个接口
- 接口与接口
- 继承关系,可以单继承,也可以多继承
- 抽象类和接口的区别
- 成员区别 抽象类 变量,常量;有抽象方法;
- 接口 常量 非抽象方法
- 关系区别
- 类与类 继承,单继承
- 类与接口 实现,单实现,多实现
- 接口与接口 继承,单继承,多继承
- 设计理念区别
- 抽象类 被继承体现的是:”is a”的关系。共性功能
- 接口
- 被实现体现的是:”like a”的关系。
- 扩展功能
- 内部类的访问特点:
- 内部类可以直接访问外部类的成员,包括私有。
- 外部类要访问内部类的成员,必须创建对象。
- 内部类位置 成员位置(成员内部类)
- 外部类名.内部类名 对象名=外部类对象.内部类对象;
- 局部位置(局部内部类)被静态修饰的成员内部类只能访问外部类的静态成员
- 内部类被静态修饰后的方法
- 静态方法
- 非静态方法局部内部类 可以直接访问外部类的成员 可以创建内部类对象,通过对象调用内部类方法,来使用局部内部类功能
- 权限修饰符
-
- 类及其组成可以用的修饰符
- 类:
- 默认,public,final,abstract我们自己定义:public居多
- 成员变量:
- 四种权限修饰符均可,final,static
- 我们自己定义:private居多
- 构造方法:
- 四种权限修饰符均可,其他不可
- 我们自己定义:public 居多
- 成员方法:
- 四种权限修饰符均可,fianl,static,abstract
- 我们自己定义:public居多
- 内部类概述
- 把类定义在其他类的内部,这个类就被称为内部类。
- 举例:在类A中定义了一个类B,类B就是内部类。
- 内部类的访问特点:
- 内部类可以直接访问外部类的成员,包括私有。
- 外部类要访问内部类的成员,必须创建对象。
- 内部类位置
- 按照内部类在类中定义的位置不同,可以分为如下两种格式:
- 成员位置(成员内部类)
- 局部位置(局部内部类)
- 成员内部类
- 外界如何创建对象
- 外部类名.内部类名 对象名=外部类对象.内部类对象;
- 成员内部的常见修饰符
- private 为了保证数据的安全性
- static 为了让数据访问更方便
- 被静态修饰的成员内部类只能访问外部类的静态成员
- 内部类被静态修饰后的方法
- 静态方法
- 非静态方法
- 局部内部类
- 可以直接访问外部类的成员
- 可以创建内部类对象,通过对象调用内部类方法,来使用局部内部类功能
- 局部内部类访问局部变量的注意事项:
- 必须被final修饰?为什么呢?
- 因为局部变量会随着方法的调用完毕而消失,这个时候,局部对象并没有立马从堆内存中消失,还要使用那个变量。为了让数据还能继续被使用,就用fianl修饰,这样,在堆内存里面存储的其实是一个常量值
- 匿名内部类
- 就是内部类的简化写法。
- 前提:存在一个类或者接口
- 这里的类可以是具体类也可以是抽象类。
- 格式:
- new 类名或者接口名() {重写方法;}
- 本质:
- 是一个继承了类或者实现了接口的子类匿名对象