抽象类
abstract关键字的 使用
1.abstract :抽象的
2.abstract可以用来修饰的结构:类,方法
3.abstract修饰类:抽象类
1.此类不能实例化
2.抽象类中一定有构造器 便于子类对象实例化
3.开发中都会提供抽象类的子类,让子类对象实例化
4.abstract修饰方法 抽象方法
抽象方法只有方法的声明,没有方法体
包含抽象方法的类一定是抽象类 抽象类不一定有抽象方法
子类继承抽象类 那么一定会重写抽象类的抽象方法 如果没有重写的话 此子类一定是抽象类
abstract的注意点:
不能用来修饰:属性构造器等结构
不能用来修饰私有方法,静态方法 final的方法 final的类
抽象类的匿名子类
Person p = new Person(){
重写person类里的方法
相当于重新创建了一个子类 但是这个类没有名字,且只运行一次
};
接口以及内部类
接口的使用
1.接口使用interface来定义
2.java中,接口和类是并列的两个结构
3.如何定义接口:定义接口中的成员
3.1 jdk7及以前
只能定义全局常量和抽象方法
全局常量:public static final的
抽象方法:public abstract的
3.2 jdk8
除了定义全局常量和抽象方法意外,还可以定义静态方法,默认方法
静态方法 可以直接通过接口名调用
public static void 方法名(){
方法体
}
默认方法 就跟普通方法一样 通过new出来的对象调用
public default void 方法名(){
方法体
}
接口中定义的静态方法只能通过接口来调用
通过实现类的对象可以调用接口中的默认方法
如果实现类重写了接口中的默认方法,调用时,仍然调用的是重写后的方法
调用接口当中的默认方法 接口名.super.方法名
4.接口中不可以定义构造器 意味着接口无法实例化
5.java开发中,通过类实现接口 implement
5.1 如果实现类覆盖了接口中的所有抽象方法就可以实例化
5.2 如果实现类没有覆盖接口中的抽象方法,则此实现类仍为一个抽象类
6.java类可以实现多个接口-->弥补的java的单继承性
7.接口跟接口之间可以多继承
8.接口的具体使用体现了多态性
9.接口的使用上也满足了多态性 接口实际上定义的是一种规范
JDBC也是接口 把其他数据库的api变成接口的方法 这样子也相当于面对接口编程
开发中,体会面向接口编程
内部类
内部类也会有单独的字节码文件
java中允许讲一个类A声明在另一个类B中 否则A就是内部类,B是外部类
成员内部类(静态 非静态) vs 局部内部类(方法内,代码块内,构造器内)
成员内部类:
一方面作为外部类的成员
可以调用外部类的结构
可以被static修饰
可以被四种不同的权限修饰
另一方面,作为一个类
1.类内可以定义属性 构造器 方法
2.可以被继承,可以被final修饰,表示此类就不可以被继承了
3.可以被abstract修饰,不能被实例化
关注如下3个问题
1 如何实例化成员内部类的对象
创建Dog实例(静态的成员内部类):
Person.Dog dog = new Person.Dog();
非静态的成员内部类如何调用
Person p = new Person();
Person.Bird bird = p.new Bird();
bird.sing();
2 如何在成员内部类中 去区分调用外部类的结构
3 开发中局部内部类的使用
比较常见的局部内部类
返回一个实现了comparable接口的对象
方式1:
public Comparable(接口) getComparable(){
//创建一个实现了Comparable接口的类
class MyComparable implements Comparable{
里面写重写方法
}
return new MyComparable();
}
方式2 : (匿名类的匿名对象)
return new Comparable(){
写上重写方法
}
在局部内部类中如果调用外部类的变量 那么外部类的变量一定加上了final关键字 在java7.0以后不显示final