抽象类
用abstract关键字来修饰一个类时,这个类就叫做抽象类。
用abstract关键字修饰一个方法时,这个方法就是抽象方法。
注意事项:
1.抽象类不能被实例化
public abstract class Animal {
String name;
int age;
}
//抽象类Animal不能被实例化
2.抽象方法不能有主体
public abstract class Animal {
String name;
int age;
public abstract void eat(); //eat方法只有方法名。没有主体
}
3.抽象类不一定要包含abstract方法(抽象类可以没有abstract方法)
一旦包含了abstract方法,则这个类必须声明为abstract
public abstract class Cat{ //Cat类是抽象类,但可以没有abstract方法
String name;
int age;
}
public abstract class Dog { //eat()方法是abstract方法,所以Dog类必须声明为abstract
String name;
int age;
public abstract void eat();
}
接口
给出一些没有内容的方法,封装到一起,到某个类要使用的时候,在根据具体情况把这些方法写出来。
声明接口:访问修饰符 interface 接口名称{ }
类实现接口 : class 类名 implements 接口名称{ 变量;方法 }
注意事项:
1.接口不能实例化
2.接口中的所有方法都不能有主体
3.一个类可以实现多个接口
4.接口中可以有变量(但是变量不能用private和protected修饰)
a.接口中的变量,本质上都是static的,而且是final的,不管你加不加static修饰
b.在java开发中,我们经常把经常使用的变量,定义在接口中,作为全局变量使用。访问形式:接口名.变量名
5.一个接口不能继承其他的类,但是可以继承别的接口
默认方法
前面说到抽象类和接口方法都不能有主体,但是有时候我们有时候需要重复使用某个方法时,我们希望在抽象类和接口中的方法有主体,这时候我们可以用default关键字来修饰方法。
public abstract class animal{
default public abstract eat(){
System.out.println("动物都要吃东西");
}
}
public interface Hero{
default public void like(){
System.out.println("我们都喜欢英雄");
}
}
接口与抽象类的区别
区别1:
子类只能继承一个抽象类,不能继承多个
子类可以实现多个接口
区别2:
抽象类可以定义
public,protected,package,private
静态和非静态属性
final和非final属性
但是接口中声明的属性,只能是
public
静态
final的
即便没有显式的声明