接口:
接口中只有抽象方法,而没有非抽象方法
特点:
1:接口不能被实例化,只能通过多态的形式,让子类实例化
2:接口的子类
A:可以是具体类,但是要求实现所有的抽象方法
B:可以是接口,使用关键字 extends
C:可以是抽象类,使用关键字 implements
// 接口中可不可以有成员变量?可以
// 接口中的成员变量,默认 必须要final修饰,必须是常量
// The blank final field age may not have been initialized
public static final String name = "";
public static final int age = 5;
// 接口中的成员变量,jvm默认 添加public static final
int i = 10;
// 接口中不能存在 构造方法
/**
* 成员方法:
* 接口中能不能存在成员方法,肯定能
* jdk1.8之前都可以 说 接口中只能有抽象方法
*
* 接口中的成员方法,jvm 默认添加 public abstract 修饰
*/
public abstract void eat();
public abstract void sleep();
public abstract void jump();
void method1();
// 创建一个接口对象,也叫实例化一个接口,这个是不允许的
// Cannot instantiate the type IAnimal
// IAnimal ia = new IAnimal();
// 父类引用指向了子类对象
IAnimal ia = new Cat();
接口的子类,也可以是抽象类,此时使用关键字 implements
public abstract class Mammal implements IAnimal {
}
接口的子类,还可以是接口,只不过要将"implements"改成extends
// Syntax error on token "implements", extends expected
public interface Pet extends IAnimal, ICat {
}
形式参数
如果形式参数是接口类型,那么传递实参的时候,传递的是实现了该接口的子类对象
如果形式参数是抽象类类型,那么传递实参的时候,传递的是继承了该抽象类的子类对象
返回值
如果返回值类型是接口类型,那么返回返回值时,实际上是实现了该接口的子类对象
如果返回值类型是抽象类类型,那么返回返回值时,实际上是继承了该抽象类的子类对象
内部类
特点:
1:内部类可以直接访问外部类的成员,包括私有,
2:外部类要访问内部类的成员,必须创建对象
局部内部类的访问特点
在局部内部类的 成员方法内,可以直接访问外部类的成员变量
// 如何在外部类的外部,创建内部类的对象
// 格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象
A.B b1 = new A().new B();
// 成员内部类
// 正常情况下,我们习惯将 成员内部类 设置为 private,为了安全性
private static class CPU {
}
匿名内部类的代码演示
前提:需要存在一个类或者抽象类,或者接口
格式:
new 类名 或者接口名(){ 重写的方法()};
本质:
是一个继承了类或者实现了接口的 子类 的匿名对象
// 匿名内部类
new IPerson() {
@Override
public void eat() {
// TODO Auto-generated method stub
}
@Override
public void sleep() {
// TODO Auto-generated method stub
}
};
好处
好处是缩短了 对象的生命周期,适合在android开发的场景,用完就回收内存