抽象类
- 抽象类的定义与使用
定义:抽象类只是比普通类多了一些抽象方法
抽象方法:只声名而未实现的方法(没有方法体),抽象方法必须使用 abstract关键字类定义。并且抽象方法所在的类也一定要使用abstract来定义
abstract class Person{
private String name;
public String getName(){
return name;
}
public abstract void test();
}
- 抽象类的使用原则
a)所有抽象类必须有子类
abstrict和final不能同时使用(子类)
abstrict表示为抽象方法,只有方法名没有方法体,需要子类继承实现方法,而final修饰的方法不能被继承,相互矛盾
b)抽象类的子类必须覆写抽象类的所有抽象方法
抽象方法和private不能同时使用(子类覆写)
private修饰的方法为私有方法,子类不知道有此方法的存在,更不能继承
c)抽象类无法直接创建实例化对象,需要通过子类向上转型为其实例化
abstract class Person{
private String name;
public String getName(){
return name;
}
public abstract void test();
}
class Student extends Person{
public void test(){
System.out.println("子类覆写抽象方法");
}
}
public class Test {
public static void main(String[] args) {
Person person = new Student();
person.test();
}
}
- 抽象类的相关约定
a)抽象类一定存在构造方法,子类也一定遵循对象实例化流程。先调用父类构造,再调用子类构造
常见问题:
//以下程序输出什么内容
abstract class A{
public A(){ //2
this.print();//3
}
public abstract void print();
}
class B extends A{ //1
private int num = 100;
public B(int num){
this.num = num;
}
@Override
public void print() {//3
System.out.println(this.num);//4
}
}
public class Test1 {
public static void main(String[] args) {
new B(30);//1
}
}
//输出0
关于这个问题的详细解释可以参考:https://mp.csdn.net/postedit/103092302
b)抽象类可以没有任何抽象方法,但此时仍然不能直接创建实例化对象
c)final与abract,private与abract不能同时出现
- 关于内部抽象类
子类只需要覆写外部抽象类中的直接抽象方法即可,内部抽象类的抽象方法可以不覆写。
abstract class Person1{
public abstract void test1();
abstract class Inner{
public abstract void test2();
}
}
class Student1 extends Person1{
@Override
public void test1() {
System.out.println("外部类方法");
}
}