java-抽象类注意点
ChinesePerson 类
public class ChinesePerson extends Person{
public ChinesePerson(){}
public ChinesePerson(String name, int age){
super(name, age);
}
@Override
public void greet() {
System.out.println("你好,我的名字叫" + this.getName());
}
}
EnglishPerson类
/**
* 一个非抽象的类继承抽象类之后,必须将抽象类中所有的抽象方法全部重写/实现。
*/
public class EnglishPerson extends Person {
public EnglishPerson(){
super();
}
public EnglishPerson(String name, int age){
super(name, age);
}
/* @Override
public void greet() {
System.out.println("Hello, my name is " + this.getName());
}*/
}
Person类:
/**
* 人类
*/
abstract public class Person { // 父类(所有子类的公共属性+公共方法的一个集合体)
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
/**
* 显示人类的详细信息
*/
public void display(){
System.out.println("名字:" + this.getName() + ",年龄:" + this.getAge());
}
/**
* 问候的方法,不同国家的人,问候的方式肯定是不同的。
* 因此,具体是怎么问候的,Person中是不确定,无法实现的。
* 针对这种方法既然不确定具体的实现是什么,那么就不应该给实现。
* 注意:在java中,只要一个方法带着大括号,不管大括号中有什么,
* 只要有大括号就表示一种实现。
*
* 因此像这种无法确定实现的方法,建议定义为抽象方法。
*/
//public void greet(){}
// 抽象方法怎么定义:修饰符列表中添加abstract,然后不能有方法体,以“;”结束。
// public和abstract关键字的顺序没有要求。
// 当一个类中有抽象方法,java要求该类必须是抽象的。
public abstract void greet();
}
PersonTest类:
public class PersonTest {
public static void main(String[] args) {
// 多态
Person p1 = new EnglishPerson("jack", 20);
p1.display();
p1.greet();
Person p2 = new ChinesePerson("张三", 30);
p2.display();
p2.greet();
// 抽象类虽然有构造方法,但是无法实例化。
// 抽象类中构造方法的作用:给子类实现的。
//new Person();
}
}
1.一个非抽象的类继承抽象类之后,必须将抽象类中所有的抽象方法全部重写/实现。
错误分析
你遇到的错误信息
Class 'EnglishPerson' must either be declared abstract or implement abstract method 'greet()' in 'Person'
是 Java 编译器给出的错误提示,意思是EnglishPerson
类必须满足以下两个条件之一:
- 声明为抽象类:如果
EnglishPerson
类不想实现Person
类中的抽象方法greet()
,那么它自身必须被声明为抽象类。抽象类不能被实例化,通常作为其他类的基类。- 实现抽象方法:如果
EnglishPerson
类不是抽象类,那么它必须实现Person
类中定义的抽象方法greet()
。