一.抽象类
1.理解
同一个父类的不同子类拥有同种行为,但行为的实现方式不同。我们就可以将该行为方法定义为抽象方法,父类为抽象类。由父类指出子类应该有的方法,具体的实现交给较为具体的子类。
2.规则
- 抽象方法与抽象类必须使用abstract修饰
- 抽象方法不能有方法体{},子类完成具体实现。
- 抽象类不能被实例化,其构造器用于被子类调用
- 含有抽象方法的类只能定义为抽象类
- 由于子类要去重写抽象类中的方法,所以abstract不能与final,static,private连用。
3.意义:
利用多态,使程序更加灵活;抽象类可以作为子类的设计模板。
public class Main {
public static void main(String[] args) {
Animal c=new Cat("lucy");
Animal d=new Dog("luck");
System.out.println(c.getName());//lucy
System.out.println(c.getType());//猫
c.call();//喵喵喵
c.eat();//猫俩、鱼
System.out.println(d.getName());//lucy
System.out.println(d.getType());//狗
d.call();//汪汪汪
d.eat();//狗粮、肉
}
}
abstract class Animal{
private String name;
public Animal(String name){
this.name=name;
}
abstract protected void call();
abstract protected void eat();
abstract protected String getType();
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
}
class Cat extends Animal{
public Cat(String name){
super(name);
}
protected void call(){
System.out.println("喵喵喵");
}
protected void eat(){
System.out.println("猫粮、鱼");
}
protected String getType(){
return "猫";
}
}
class Dog extends Animal{
public Dog (String name){
super(name);
}
protected void call(){
System.out.println("汪汪汪");
}
protected void eat(){
System.out.println("狗粮、肉");
}
protected String getType(){
return "狗";
}
}
二.接口
1.理解
抽象类是多个类的设计模板,而接口则比抽象类更抽象,他里面只有常量与方法,定义的是多个类共同的行为规范。
2.定义
[修饰符] interface 接口名 extends 父接口1,父接口2...
{
常量定义...
抽象方法定义...
内部类,接口,枚举定义...
私有方法,默认方法,类方法定义...
}
- 修饰符为public或省略(default)
- 接口不能继承类
- 不能被实例化,不能包含构造器和初始化块
- 不包含实例变量,只能是(pubilc static final/省略)静态常量,须指定默认值
- 系统会自动为抽象方法加pubilc abstract
- 内部类默认(public static)
- 私有方法主要为默认方法与类方法提供支持,作为工具方法。可以用static修饰
- 除私有方法和默认方法外,所有成员均为pubic修饰
- 私有,默认,类方法都必须有方法体{}
默认方法其实就是实例方法,目的是当我们要新增一个方法时,要去修改涉及的全部类,使用默认方法就不必去一个一个改了,必要时覆写即可。但是由于接口没有定义字段,所以默认方法也就不能访问字段。
(建议先别管非抽象方法,会混淆的。)
3.接口的继承
接口支持多继承,子类会获得父接口的所有抽象方法,常量。
4.接口的使用
实现接口使用implement关键字,类可以实现多个接口
接口的主要用途:
- 定义接口引用变量,可以转型
- 调用接口中的常量
- 被其他类实现
public class Main {
public static void main(String[] args) {
Computer pc=new Computer();
pc.flashDrive.read();//U盘正在通过USB读取数据...
pc.flashDrive.write();//U盘正在通过USB写入数据...
pc.keyBoard.read();//键盘正在通过USB读取数据...
pc.keyBoard.write();//键盘正在通过USB写入数据...
}
}
interface USB{
void read();//public abstract省略
void write();
}
class FlashDrive implements USB{
public void read(){
System.out.println("U盘正在通过USB读取数据...");
}
public void write(){
System.out.println("U盘正在通过USB写入数据...");
}
}
class KeyBoard implements USB{
public void read(){
System.out.println("键盘正在通过USB读取数据...");
}
public void write(){
System.out.println("键盘正在通过USB写入数据...");
}
}
class Computer{
KeyBoard keyBoard=new KeyBoard();
FlashDrive flashDrive=new FlashDrive();
}