接口
- 首先,接口中的所有方法默认都是public abstract
- 接口中的常量默认为public static final
- 接口不能实例化,没有构造方法
- 如果一个类实现了接口,那么就必须实现接口中的所有方法
- 接口更像是一种规范,它其实是like a的关系。他的核心是定义行为,并不关注是怎样实现的。并且一个类可以实现多个接口
抽象类
- 抽象类是用abstract修饰的类,抽象类不一定有抽象方法,但是有抽象方法的类一定是抽象类
- 抽象类可以存在普通的成员方法,以及成员变量。
- 抽象类的设计目的是代码的复用,更像是is a的关系,抽象类包含并且实现了子类的共同特性,把不同的特新抽象留个子类自己去实现
- 子类只能继承一个抽象类
- 抽象类有构造方法但是不能实例化,他的构造方法是用来给子类初始化的时候调用的。
内部类
内部类的好处:
内部类可以作为JAVA的多继承的一种实现方式, 每个内部类都能独立的继承一个类或接口,所以整个类就可以实现多继承。
方便将存在一定逻辑关系的类组织在一起, 又可以对外界隐藏 。
1.成员内部类
成员内部类就是一个类里面的一个普通的类,如下代码:
public class MemberInner {
private int age = 18;
public String s = "成员内部类";
static String address = "成都市";
class Inner{
private String msg = "内部类信息";
public void test(){
int a = 1;
fun();
System.out.println(age);
System.out.println(address);
System.out.println(s);
}
}
public void fun(){
Inner inner = new Inner();
String msg = inner.msg;
System.out.println(msg);
}
}
-
成员内部类不能直接创建对象,它需要借助外部类对象
MemberInner.Inner inner = new MemberInner().new Inner();
-
可以直接访问外部类的所有成员 包括private,但是外部类想要访问它必须通过对象调用。
-
jdk16之前成员内部类里面不能有静态成员,jdk16之后开始支持静态成员
2.静态内部类
在一个类的里面定义一个静态类就是静态内部类
public class StaticInner {
private int a = 10;
private static int b = 11;
public static class Inner{
static int v = 10;
public static void a(){
System.out.println(b);
}
}
}
-
静态内部类只能访问外部类的静态成员变量和静态方法,即使是private也可以。
-
静态内部类可以定义普通方法和变量,也可以定义静态变量和方法
-
其他类访问静态内部类的静态变量或者是方法的时候可以直接通过外部类名.内部类名.方法名/变量名。但是访问普通方法就必须通过对象。静态内部类实例化与成员内部类有所不同
StaticInner.Inner inner1 = new StaticInner.Inner();
3.局部内部类
定义在一个方法内部的内部类,只能在当前方法中才能使用,方法外不能使用。
public class LocalInner {
public void fun(){
//局部内部类不能有访问修饰符
class Inner{
}
}
}
- 局部类不能有访问修饰符
- 在外部内中不能创建内部类的实例,创建内部类的实例只能在包含它的方法中;
- 内部类访问包含他的方法中的变量必须有final修饰;
- 外部类不能访问局部内部类,只能在方法体中访问局部内部类,且访问必须在内部类定义之后
4.匿名内部类
如果接口的实现类(或者是父类的自类)只需要使用唯一一次,那么就可以省略该类的定义,改为使用【匿名内部类】
public class AnonymousInner {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("我是用匿名内部类实现的");
}
}).start();
}
}