Day17

接口 interface

接口比抽象还抽象,与抽象类似,但注意与抽象类的不同

接口中的属性只能是公开静态常量(public static final)

接口中的方法只能是公开抽象方法(public abstract)

没有构造方法、没有动态代码块、静态代码块

微观概念:是实现,一种能力。

宏观概念:接口是一种标准。has a(区别继承is a)

Java是单继承,当父类中的方法无法满足子类需求时,可实现接口扩充子类能力

任何类再实现接口时,必须实现接口中的所有的抽象方法,否则此类为抽象类

常量接口

将多个常用于表示状态或固定的变量,以静态常量(static final)的形式定义在接口中,统一管理,提高代码的可读性

/**
 * 常量接口
 */
public interface Week {
	//公开静态常量
	String MONDAY = "星期一";
	String TUESDAY = "星期二";
	String WEDWNDAY = "星期三";
	String THURSDAY = "星期四";
	String FRIDAY = "星期五";
	String SATURDAY = "星期六";
	String SUNDAY = "星期日";
}

public class TestWeek {
	public static void main(String[] args) {
		System.out.println(Week.FRIDAY);
	}
}

接口小案例

/**
 * 定义一个接口:USB接口,表示一种标准
 */
public interface USB {
	//服务
	void servicer();
}

/**
 * 实现类
 */
public class UPan implements USB{
	@Override
	public void servicer() {
		System.out.println("U盘和电脑连接成功,开始工作");
	}
}

public class Mouse implements USB{
	@Override
	public void servicer() {
		System.out.println("鼠标和电脑连接成功,开始工作...");
	}
}

public class Keyboard implements USB{
	@Override
	public void servicer() {
		System.out.println("键盘与电脑连接成功...");
	}
}

/**
 * 接口的使用者
 */
public class Computer {
	//使用USB接口 USB是属性
	public USB usb1;
	public USB usb2;
	public USB usb3;
	
	//1电脑运行     方法
	public void run() {
		System.out.println("电脑开始运行...");
		//验证
		if (usb1 != null) {
			//USB usb1 = new UPan();
			usb1.servicer();
		}
		if (usb2 != null) {
			usb2.servicer();
		}
		if (usb3 != null) {
			usb3.servicer();
		}
		
		System.out.println("电脑结束运行...");
	}
}

public class TestComputer {
	public static void main(String[] args) {
		//USB设备
		UPan uPan = new UPan();
		Mouse mouse = new Mouse();
		Keyboard keyboard = new Keyboard();
		
		//电脑
		Computer surfacebook = new Computer();
		//连接
		surfacebook.usb1 = uPan;
		surfacebook.usb3 = mouse;
		surfacebook.usb2 = keyboard;
		
		//工作
		surfacebook.run();
	}
}

补充:

JDK1.8之后接口中可以包含静态方法和默认方法
静态方法:不能被继承,通过接口名.方法名调用
默认方法:可以被继承,通过实现类调用

内部类

在一个类的内部再定义一个完整的类

成员内部类

定义在类的内部,和实例变量实例方法同级别

特点:

成员内部类可以使用任意访问修饰符

成员内部类可以直接访问外部类的属性和方法

成员内部类的属性和外部类的属性同名时,使用外部类名.this访问外部类属性

  • 成员内部类不能包含静态成员,但是可以包含静态常量

静态内部类

在类前面用static修饰,不依赖与外部类对象,相当于外部类

静态内部类可以使用任意访问修饰符

静态内部类不能直接访问外部类的实例属性和方法,可以访问静态的属性和方法

静态内部类可以包含静态成员

局部内部类

局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。

不能使用任何访问修饰符

局部内部类的方法是实例方法,可以直接访问外部类的实例属性和实例方法

局部内部类可以访问局部变量,局部变量必须是final修饰的( JDK1.8之后局部变量可以省略final关键字 对象生命周期长于局部变量)

  • 局部内部类不能声明静态变量,可以声明静态常量

匿名内部类

相当于没有名字的内部类,不是new 接口,定义类、实现类与创建对象合并在一起了

创建匿名内部类对象可以使用接口、抽象类、不同类,必须要实现接口或抽象类中所有的抽象方法

不能手动添加构造方法,不能包含静态成员

一般不包含独有的方法,不能直接访问,可以通过方法调用内部对象访问。

匿名内部类会生成class文件: 类名$编号.class

待整理...

上一篇:一起重新开始学大数据-java篇-DAY17-集合体系:


下一篇:Day17-注解与反射