面向对象编程–抽象类
抽象类是无法实例化的类(我们无法创建抽象类的对象)。在Java中,我们使用abstract关键字声明一个抽象类。
出现抽象类的原因:
- 不能够明确 一个类 中的具体设计 是什么样的, 可以考虑设置成抽象类
- 不能明确一个方法 应该如何实现(方法没有方法体) ,那么 该方法可以变成 抽象方法 , 那么拥有抽象方法的类必须是抽象类。
- 一个类 不想被实例化(不想有对象) 就可以设置成抽象类。
声明一个抽象类
abstract class 类名{}
- 抽象类 仅仅不可以实例化,其他的内容与其他的类没有任何区别。
- 抽象类中存在构造, 仅供 子类调用。
- 抽象类中可以有抽象方法,也可以有非抽象方法 。
抽象方法的定义
[修饰符] abstract 返回类型 方法名();
本质就是通过创建 子类的实例 来获取 抽象类的实例 。
常用的获取 抽象类实例的 方式 :
- 抽象类中的 static 修饰的方法
- 抽象类子类中的 static 修饰的方法
- new 抽象类的子类
示例
/**
* 声明一个抽象类
*/
public abstract class Person {
private String name ;
public static final String hometown ;
static{
hometown = "地球" ;
}
/**
* 保证每次调用都返回同一个对象
*/
public static Person getInstance(){
return new Hindu();
}
/**
* 抽象类中, 存在构造 , 但是不是让你 用来 实例化的
* 而是 供 子类使用
*/
public Person() {
}
public Person(String name) {
this.name = name;
}
/**
* 定义抽象方法
* 具体用什么工具吃饭 不确定 , 所以将 其方法设置成 抽象方法
*/
public abstract void eat() ;
public void sleep(){
System.out.println( this.name + " 开始睡觉!");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//子类继承
/**
* 两种解决策略 :
* 1. 子类 也是一个抽象类
* 2. 实现 父类中的 抽象方法
*/
public class Hindu extends Person{
/**
* 实现 父类中的 抽象方法
*/
@Override
public void eat() {
System.out.println( this.getName() + " 用手抓着吃饭 ");
}
public static Hindu getInstance(){
return new Hindu() ;
}
}
//主函数测试
public class TestAbstract {
public static void main(String[] args) {
/* 父类 引用 指向 子类对象 (多态) */
Person person = new Hindu() ;
person.eat();
// Peason的静态方法(static 修饰的方法) 来获取 抽象类的对象
// Person.getInstance() 中依旧是 new Hindu()
Person person1 = Person.getInstance();
person1.eat();
// 使用 Peason子类的静态方法来获取
// Hindu.getInstance() 中依旧是 new Hindu()
Person person2 = Hindu.getInstance() ;
person2.eat();
}
}
447

被折叠的 条评论
为什么被折叠?



