1.抽象类出现的原因
当多个类中出现相同的功能,但是功能主体部分不同,这时可以向上抽取的【只抽取功能的定义部分-----方法的声明部分,而不抽取功能的主体部分-----方法的实现部分】
明确的说,抽象的存在的意义是:就是为了被继承
2.抽象类的使用【见代码AbstractUsageDemo.java】
class AbstractUsageDemo { public static void main(String[] args) { //3.抽象类不能实例化对象 //错误: Check是抽象的; 无法实例化 //Check c = new Check(); //c.show(); SubCheck sc = new SubCheck(); sc.show(); sc.display(); //Check.show11(); } } //1.定义一个抽象类 //父类 abstract class Check { //8.抽象类中可以定义成员变量,为了给子类提供 String name; int age; //2.在抽象类中使用abstract关键字修饰的方法被称为抽象方法 //抽象方法的特点:只有声明,没有实现 abstract public void show(); //6.如果一个抽象类中有多个抽象方法,但是在子类中只重写了部分抽象方法,那么子类仍然是一个抽象类,无法实例化对象 //错误: SubCheck不是抽象的, 并且未覆盖Check中的抽象方法show22() abstract public static void show11(); abstract public void show22(); //5.抽象类中也可以定义普通方法 public void display() { } //7.抽象类有构造方法,存在的作用:为了被子类的构造方法调用 public Check() {} public Check(String name,int age) { this.name = name; this.age = age; } } //子类 class SubCheck extends Check { //4.如果一个子类对象要调用抽象类【父类】中的抽象方法,则必须在子类中重写这个抽象方法 @Override public void show() { System.out.println("hsugh"); } @Override public void show11() { System.out.println("hsugh"); } @Override public void show22() { System.out.println("hsugh"); } //构造方法 public SubCheck() {} public SubCheck(String name,int age) { super(name,age); } }
3.总结
1>抽象类的特点
a.使用关键字abstract修饰的类
b.不可以使用new关键字实例化对象
c.可以定义抽象方法,也可以定义普通方法
d.抽象类中方法如果想要被调用,只能子类中重写这个方法,然后创建子类对象进行调用
e.子类必须重写父类中所有的抽象方法,否则,子类仍然是一个抽象类
f.抽象类就是为了继承而生,所以一般情况下,抽象类在程序中扮演者父类的角色
g.抽象类是由自己的构造方法【成员变量】的,但是这些构造方法的作用主要为了提供给子类的构造方法调用
2>抽象方法的特点
a.抽象方法只能存在于抽象类中
b.在抽象类中,被abstract修饰的方法
c.只能声明,没有实现
3>抽象类和普通类的区别【面试题】
a.相同点:都是用来描述事物的,都可以定义成员变量和构造方法,普通方法
b.抽象类中除了普通方法之外,还可以定义、抽象方法
c.普通类可以继承也可以不被继承,但是抽象类一定要被继承,否则其中的抽象方法将永远无法实现
d.普通类可以使用new实例化对象,但是抽象类不行
扩展:abstract和哪些修饰符不能共存?
a.final 原因:final修饰类意味着这个类不能被继承,但是抽象类存在的意义就是为了被继承【final修饰的方法不能被重写,但是抽象方法只能被重写之后子类对象调用】
b.private 原因:private修饰方法意味着这个方法只能在当前类中能被调用,但是抽象方法不能实现的就要靠子类来实现
c.static 原因:使用static修饰的方法可以使用对象. 和类名. 的方式调用【对象.直接排除】,调用一个方法的目的为了实现相应的方法体,但是抽象方法没有方法体,抽象类直接使用类名调用静态抽象方法没有任何意义