抽象类和抽象函数: abstract
abstract class Person{
Person(){
System.out.println("Person的构造函数");
}
String name ;
int age ;
void introduce(){
System.out.println("我的名字叫"+this.name+", 年龄是"+this.age);
}
abstract void eat(); //这个就是抽象函数,没有函数体
//如果类中有抽象函数,那么这个类也必须是抽象类
}
// 1. 抽象类不能生成对象
// 2. 抽象类天生就是用来做父类的
// 3. 如果一个类中没有抽象函数,也可以被声明为抽象类
// 4. 抽象类里可以有构造函数 --> 只能用 super() 进行调用,而不能用new创建一个对象
// 抽象类 也叫 基类
//与接口相比,抽象类可以进行部分的复写,而接口必须全部实现; 接口可以多实现,而抽象类只能被单继承
class Test{
public static void main(String args []){
//Person p1 = new Person(); //这句话是不行的
Person p2 = new Chinese(); //向上转型 (既可以转型成抽象类,也可以转型成接口)
p2.eat();
}
}
class Chinese extends Person{ //如果不复写抽象函数eat()的话,就必须声明Chinese类也为abstract型
Chinese(){
System.out.println("Chinese的构造函数");
}
void eat(){
System.out.println("用筷子吃饭"); //复写了父类中的abstract抽象函数
}
}
---------------------------
综合实现:
abstract class Printer{
void open(){
System.out.println("open");
}
void close(){
System.out.println("close");
}
// void print(){ //为了预防在开发过程中子类忘记复写 print() ,那么就把它定义成抽象函数更好一些
// }
abstract void print();
}
// 总结: 抽象类就像一个目录,一个总括一样,把要实现的目标功能列出来,在以后的子类中具体化,并最大程度的防止
// 漏写
//该打印机为喷墨打印机
class HPPrinter extends Printer{
void print(){
System.out.println("使用喷墨打印机进行打印");
}
}
//该打印机为针式打印机
class CanonPrinter extends Printer{
void print(){
System.out.println("使用针式打印机进行打印");
}
}
class Test2{
public static void main(String args []){
Printer p1 = new HPPrinter() ; //这里为什么要用向上转型?
Printer p2 = new CanonPrinter() ;
p1.open();
p1.print();
p1.close();
p2.open();
p2.print();
p2.close();
HPPrinter h1 = new HPPrinter();
CanonPrinter h2 = new CanonPrinter();
System.out.println("--------------------------");
h1.open();
h1.print();
h1.close();
h2.open();
h2.print();
h2.close();
}
}