package mypackage;
//类中只要有一个abstract,则类就必须是abstract
public abstract class Person
{
//当在定义一个类时,其没有属性(这个类中没有定义实例域),实际其没有任何意义
//在这里,没有任何东西可以描述一个人
//当然,可以返回一个空串,表示这个人没有什么可以描述的
//比如上大街上,找个路人问我要找一个人,别人问你有没有什么可以描述一个人的,你说没有,那这个人怎么找
//就是一个空的、虚的、没有意义的人
// public String getDescription()
// {
// return "the person has nothing";
// }
//但通常,这不是一个好的办法
//既然这是一个没有意义的类,那给其提供一个没有意义的方法,实际也没什么意义,还不如不要
//但不要又不太好描述,所有就有了抽象的概念
public abstract String getDescription();
//将一个方法定义为abstract,可以不提供具体的实现,而有子类来实现
//但定义为一个抽象方法后,该类就必须是一个抽象类,需要把类也定义为abstract
//abstract类中,同样还是可以定义具体的实例域和方法的,只不过该类还是不能定义一个对象
//只不过,这样的做法看起来好像有一点点混乱,既然abstract类没有意义,怎么又会有代表这个类的属性
//但好处是,可以将大量重复的、相同的“东西”放到abstract类中进行统一的处理
//这里的“东西”不太好概括,因为很有可能它们和这个类本身没有什么关系,只是找到一个可以统一处理的地方
//所以往后就有了接口的说法
private String m_sName = "Pernson";
public String getName()
{
return m_sName;
}
}
//定义一个学生,学生也是一个人,同时,它有自己的身份“学生”
class Student extends Person
{
String m_sIdentify = "student";
public String getDescription()
{
return m_sIdentify;
}
}
需要注意,abstract类是不能定义对象的,会报错。
但其变量和继承中一样,是可以引用子类对象的。
//abstract类是不允许定义一个对象的,因为它没有实际意义
// Person p = new Person();
// System.out.println(p.getDescription());
//abstract类不允许定义对象,其子类只要实现了就是可以的
Student st = new Student();
Person p = st;//并且,abstract类变量同样是可以引用子类对象的
System.out.println(st.getDescription());
System.out.println(p.getDescription());
System.out.println(p.getName());