接口
接口是一组常量和抽象方法、默认方法、静态方法的集合。实现接口的类必须覆盖接口中的所有抽象方法。
声明接口:
[访问修饰符] interface 接口名 [extends 父接口1,父接口2…] {
常量定义;
方法定义;
}
接口中的常量默认被public static final 修饰;
接口中的方法默认被public abstract 修饰;
接口的使用:
public class Main {
public static void main(String[] args) {
A a = new C();
A.b();
System.out.println(A.a);
}
}
interface A { //声明接口
int a = 100;
void b();
}
class C implements A{ //实现接口
public void b() {
System.out.println("bbb");
}
}
结果:
bbb
100
注意:
1.接口不能创建实例,但是可用于声明引用变量类型;
2.一个类实现了接口,必须实现接口中所有的方法,并且这些方法只能是public的;
3.接口可以多继承;
内部类
我们把一个类放在另一个类的内部定义,成为内部类;
内部类的作用
内部类提供了更好的封装。只能让外部类直接访问,不允许同一个包中的其他类直接访问;
内部类可以直接访问外部类的私有属性,内部类被当成其外部类的成员。 但外部类不能访问内部类的内部属性;
内部类体现了多重继承;
定义内部类:
/**外部类Outer*/
class Outer {
private int age = 10;
public void show(){
System.out.println(age);//10
}
/**内部类Inner*/
public class Inner {
//内部类中可以声明与外部类同名的属性与方法
private int age = 20;
public void show(){
System.out.println(age);//20
}
}
}
匿名内部类
适合那种只需要使用一次的类
this.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
);
this.addKeyListener(new KeyAdapter(){
@Override
public void keyPressed(KeyEvent e) {
myTank.keyPressed(e);
}
@Override
public void keyReleased(KeyEvent e) {
myTank.keyReleased(e);
}
}
);
注意
匿名内部类没有访问修饰符;
匿名内部类没有构造方法;
局部内部类
局部内部类是定义在方法中的只作用域局限于该方法
public class Test2 {
public void show() {
//作用域仅限于该方法
class Inner {
public void fun() {
System.out.println("helloworld");
}
}
new Inner().fun();
}
public static void main(String[] args) {
new Test2().show();
}
}