抽象类的定义
- 用abstract关键字来修饰一个类时,这个类叫做抽象类,用abstract来修饰一个方法时,该方法叫做抽象方法
- 含有抽象方法的类必须被声明为抽象类,抽象类必须被继承,抽象方法必须被重写
- 抽象类不能被实例化
- 抽象方法只需声明,而不需实现
Final关键字
- final的变量值不能够被改变
- final的成员变量
- final的局部变量(形参)
- final的方法不能够被重写
- final的类不能够被继承
接口定义
- 接口是抽象方法和常量值的定义的集合
- 从本质上讲,接口是一种特殊的实现类,这种抽象类中只包含常亮和方法的定义,而没有变量和方法的实现
- 多个无关的类可以实现同一个接口
- 与继承关系类似,接口与实现类之间存在多态性
接口特性
- 接口可以多重实现
- 接口中声明的属性默认为public static final 的,也只能是public static final的
- 接口中只能定义抽象方法,而且这些方法默认为public的,也只能是public的
- 接口可以继承其他的接口,并添加新的属性和抽象方法
先上代码
interface Singer
{
public void sing();
public void sleep();
}
interface Painter
{
public void paint();
public void eat();
}
class Student implements Singer
{
private String name;
public Student(String name){this.name=name;}
public void study(){}
public void sing(){}
public void sleep(){}
}
class Teacher implements Singer,Painter
{
private String name;
public Teacher(String name){this.name=name;}
public void study(){}
public void sing(){}
public void sleep(){}
public void paint(){};
public void eat(){};
}
主程序
public static void main(String[] args)
{
Singer s1=new Teacher("tom");
s1.sing();
s1.sleep();
Painter p1=(Painter)s1;
p1.paint();
p1.eat();
}
这里来分析一下内存图
这里有个有趣的现象
1. new一个Teacher对象在堆区初始化对象
2. 对象里面有两个函数指针,指向代码区的方法
3. 这里代码,把Teacher对象,指向Singer接口,从而使得s1只能看到Singer接口的方法。看不到其他东西,注意那条实线的指向为止,同理,P1也是一样的
Singer s1=new Teacher("tom");