1.接口
在java中,接口是抽象方法的集合.接口用interface关键字声明.
1.接口声明的语法格式:
修饰符 interface 接口名 [extends 其它接口]{
[声明变量;]
抽象方法;
}
2.接口的优点:
- 接口是功能体的集合
- 是一个引用数据类型,可以多实现,也就是一个实现类可以实现多个接口
- 解耦
- 规定开发规范
3.接口的特性:
- 接口是隐式抽象的,声明时不需要使用abstract关键字
- 接口中的方法也是隐式抽象的,声明时同样不需要使用abstract关键字
- 接口中的方法时公有的
- 实现类实现接口,也拥有接口中的能力,但是需要实现类自己去实现这个功能
4.接口的使用:
-
接口的使用只能通过实现类
-
实现接口使用的关键字:implements,语法格式如下:
修饰符 class 类名 implements 接口名[,其它接口]{
}
-
实现接口必须实现接口中的所有方法,否则类必须声明为抽象类
-
一个类可以实现多个接口
5.接口间的继承
接口之间同样支持继承,且同样使用extends关键字.且接口之间支持多继承
interface 接口名 extends 接口1[接口2,接口3...]{
}
2.内部类
顾名思义,内部类就是在类内部定义的类.
当一个类中成员,也是另一个事物时,就可以把这个事物定义为内部类.
1.内部类分类:
- 成员内部类:当内部类作为外部类的成员时,就是成员内部类
- 私有内部类:用private关键字修饰的内部类就是私有内部类
- 静态内部类:用static修饰的内部类就是静态内部类
- 局部内部类:方法中的内部类
- 匿名内部类:有些实现类,没有自己的功能,就是为了重写抽象方法.为了不浪费类名,不使项目中的类过多,就把这种类实现为匿名类
2.成员内部类
- 是成员就具有成员的特点,就是可以使用成员修饰符来修饰
- 是类就有类的特点,可以继承,实现...
- 内部类中可以使用外部的类的内容,包括私有的
- 在外部类中可以通过内部类的对象使用其成员
- 成员内部类中不能定义静态的内容,除了静态的常量
示例1:
public class Outer {
String name="cat";
int a = 10;
public class Inner {
String name="dog";
static final int b=2;
int a = 20;
public void skr() {
int a = 30;
System.out.println(a);
}
}
public void outter(){
Inner in=new Inner();
in.skr();
}
}
3.私有内部类
- 私有内部类可以使用外部类中的私有内容
- 外部类使用私有内部类中的私有内容,需要通过内部类对象使用
- 私有内部类只能在外部类中使用,不能在其它类中使用
示例2:
public class InnerPrivate {
int a=11;
static int b=12;
private class Inner1{
int c=11;
private void innert(){
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
}
private void outert(){
System.out.println(a);
System.out.println(b);
Inner1 inner=new Inner1();
inner.innert();
}
}
4.静态内部类
- 静态内部类使用外部类中的成员,需要通过外部类的对象使用,因为内部类是静态的
- 在几种内部类中,只有静态内部类才可以定义静态的内容.除了静态的常量
示例3:
public class InnerStatic {
static int a = 666;
int b = 777;
static class Inner2 {
static final int c = 888;
int d = 999;
static void innert() {
System.out.println(a);
System.out.println(new InnerStatic().b);
System.out.println(c);
System.out.println(new Inner2().d);
}
}
static void outter() {
System.out.println(a);
System.out.println(new InnerStatic().b);
System.out.println(Inner2.c);
System.out.println(new Inner2().d);
}
}
5.匿名内部类
-
匿名内部类的唯一目的只是为了实现接口
-
匿名内部类有三种使用方式:
- 接口多态
- 没有应用接收匿名内部类的对象地址,只能在当前行使用
- 做方法的参数
示例4:
public class AnonymousDemo {
public static void main(String[] args) {
// 1.接口多态
Dog d = new Dog() {
@Override
public void shout() {
System.out.println("汪汪汪");
}
};
d.shout();
// 2.直接使用
new Dog() {
@Override
public void shout() {
System.out.println("汪汪汪汪汪汪");
}
}.shout();
// 3.做方法的参数
test(new Dog() {
@Override
public void shout() {
System.out.println("汪汪汪汪汪汪汪汪汪汪汪汪汪汪");
}
});
}
public static void test(Dog d) {
d.shout();
}
}
interface Dog {
void shout();
}