抽象
在解决实际问题时,一般将父类定义为抽象类,需要使用这个父类进行继承与多态处理。
abstract 是定义抽象类的关键字,使用 abstract 关键字定义的类称为抽象类,使用 abstract 关键字定义的方法称为抽象方法。
抽象类只能被继承,不能被实例化。
拥有抽象方法的类被标记为抽象类。
接口
接口是抽象类的延伸,接口中的方法都没有方法体。
假设某一位偶像练习生会唱,跳,Rap,还有篮球。
若我们在Person类中同时写出这些方法会造成大量的冗余。
若我们让偶像练习生类继承歌手类,歌手类继承运动员类,运动员类继承Person类会造成逻辑上的混乱,况且比不一定所有的偶像练习生都会唱,跳,Rap,还有篮球。
而Java又不支持多重继承,所以引入接口解决这类问题。
实例
Person类
public abstract class Person {
public String name;
public String sex;
public int age;
public void showInfo(); //抽象类方法没有方法体
}
Singer接口
public interface Singer {
//int x; //接口中的任何字段都是自动的static和final的
void Sing(String s);
//接口中定义的方法必须被定义为public或abstract形式
//即使不将该方法声明为public形式,它也是public
}
Dancer接口
public interface Dancer{
void Dancer(String d);
}
Player接口
public interface Player{
void Player(String p);
}
IdolProducer类
public class IdolProduce extends Person implements Singer,Dancer,Player {
public void setInfo(String name, String sex, int age){
super.name = name;
super.sex = sex;
super.age = age;
}
@Override
public void Dance(String d) {
System.out.println(this.name + "会跳" + d);
}
@Override
public void play(String p) {
System.out.println(this.name + "会" + p);
}
@Override
public void Sing(String s) {
System.out.println(this.name + "会唱" + s);
}
@Override
public void showInfo() {
System.out.println("姓名:" + super.name + " 性别:" + super.sex + " 年龄:" + super.age);
}
}
main方法
public class MainDemo {
public static void main(String[] args) {
IdolProduce cxk = new IdolProduce();
cxk.setInfo("蔡徐坤","不清楚",22);
cxk.showInfo();
cxk.Dance("脱衣舞");
cxk.play("胯下运球");
cxk.Sing("鸡你太美");
}
}
输出结果
最后感谢某位练习时长两年半的偶像练习生提供了学习素材。