2018.6.9
1.多态
多态是同一个行为具有多个不同表现形式或形态的能力。
多态就是同一个接口,使用不同的实例而执行不同操作。
多态存在的三个必要条件:
继承
重写
父类引用指向子类对象
注意:
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果 没有,则编译错误;如果有,再去调用子类的同名方法。
多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进 行通用处理。
成员变量
编译看左边,运行看左边
成员方法
编译看左边,运行看右边
静态方法
编译看左边,运行看左边
所以前面我说静态方法不能算方法的重写
无法访问子类独有的成员变量和方法。
常用情景:
Person p1 = new Teacher();
Person p2 = new Student();
public static void test(Person p) {
p.run();
}
2.抽象(abstract)
抽象类中可以有属性
抽象类有构造方法,但是不能实例化:用于子类访问父类数据的初始化
抽象类中可以写普通的方法
有抽象方法不能写方法体 public abstract void run();
抽象成员方法:可以规范子类必须实现某些功能
子类继承抽象类:
如果父类有抽象类,子类必须重写
如果子类也是抽象的,那么子类继承父类的抽象方法可以是抽象的。
抽象类不一定有抽象方法,有抽象方法的类一定是抽象类
抽象类不能实例化
那么,抽象类如何实例化呢?
按照多态的方式,由具体的子类实例化。其实这也是多态的一种,抽象类多态。
抽象类的子类
要么是抽象类
要么重写抽象类中的所有抽象方法
3.接口(interface)
可以定义属性,但必须赋值.默认为public static final
可以定义方法:default和static修饰的方法,
没有方法体的方法(public abstract)
没有构造方法,不能实例化
格式:class 类名 implements 接口名 {}
4.类与接口之间的关系
类与类
继承关系,只能单继承,但是可以多层继承
类与接口
实现关系,可以单实现,也可以多实现。还可以在继承一个类的同时实现多个接口
接口与接口
继承关系,可以单继承,也可以多继承
5.抽象和接口的区别
成员区别
抽象类: 变量,常量; 抽象方法,非抽象方法
接口: 常量;抽象方法
关系区别
一个类只能继承一个抽象类
一个类可以实现多个接口
设计理念区别
抽象类:共性功能
接口:扩展功能
抽象类可以定义构造函数,接口没有公祖奥函数
接口:方法都是public abstract 变量都是public static final
抽象:方法有普通也有抽象,变量有常量和变量
6.包
package 包名; . //在程序第一行
import 包名;
public —>都可以访问
private—>只有本类中可以访问
7.内部类
类中的类:内部类访问外部类的内容,包括私有:(访问任意内容)
外部类访问内部类 ,必须创建对象。
成员内部类 Outer.Inner i = new Outer().new Inner();
常用修饰符:private 为了保证数据的安全性;
static 为了让数据访问更方便
静态内部类 Outer.Inner i = new Outer.Inner();
对象名.成员;
局部内部类 {
class Inner{}
new Inner().成员;
}
局部内部类访问局部变量,必须被final修饰。
8.匿名内部类
内部类的简化形式
前提:存在一个类或者接口,
这里的类可以是具体类也可以是抽象类
本质:继承了一个类或者实现了一个接口
new T() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("我比刘翔跑的快");
}}.run(); //输出:我比刘翔跑得快