写在前面
-
抽象类不能被实例化,如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
-
抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类(如果一个类包含抽象方法,那么该类必须是抽象类)。
-
抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。
-
构造方法、类方法(用 static 修饰的方法)不能声明为抽象方法。
-
继承抽象类的子类必须给出抽象类中抽象方法的具体实现,除非该子类也是抽象类(任何子类必须重写父类的抽象方法,或者声明自身为抽象类)。
-
抽象类的静态方法,可以直接调用,与普通函数调用相同。
一、什么是抽象类?
如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。
父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。
在 Java 中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。
二、编写抽象类
在 Java 语言中使用 abstract class
来定义抽象类。
public abstract class Parent {
private String id;
private String name;
public Parent(String id, String name) {
System.out.println("抽象类的构造函数");
this.id = id;
this.name = name;
}
public static void print(){
System.out.println("抽象类的静态方法print");
}
public void test(){
System.out.println("抽象类的普通方法test: " + getId() + ", "+getName());
}
//抽象函数
public abstract String display();
public String getId() { return id;}
public void setId(String id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String toString() {
return "Parent{id='" + id + "', name='" + name + "'}'";
}
}
抽象类和普通类没啥区别,都可以定义成员变量、成员函数、静态函数、构造函数。
如果在main函数中进行实例化是会报错的,编译都不通过:
那么我们如何使用抽象类的东西呢?使用继承:
public class Child extends Parent{
private String age;
// 子类必须实现构造方法,并且 必须先 super()
public Child(String id, String name, String age) {
super(id, name);
setAge(age);
}
public static void print(){
System.out.println("子类的静态方法print");
}
public void test(){
System.out.println("子类的普通方法test");
}
@Override
public void display() {
System.out.println("子类继承父类的抽象方法display");
}
public String getAge() {return age;}
public void setAge(String age) {this.age = age;}
}
然后使用实例化Child的方式进行使用抽象类Parent:
public class AbstractTest {
public static void main(String [] args) {
/* 以下是不允许的,会引发错误 */
// Parent parent = new Parent("1","baba");
// parent.test();
Child c = new Child("123","child", "18");
c.test();
c.display();
Child.print();
System.out.println();
Parent p = new Child("321", "parent", "81");
p.test();
p.display();
Parent.print();// 调用抽象类的静态方法
}
}
运行结果:
抽象类的构造函数
子类的普通方法test: 123, child, 18
子类继承父类的抽象方法display:123, child, 18
子类的静态方法print
抽象类的构造函数
子类的普通方法test: 321, parent, 81
子类继承父类的抽象方法display:321, parent, 81
抽象类的静态方法print
若有不正之处,请谅解和批评指正,谢谢~
喜欢欢迎一件三连~
转载请标明:
https://blog.csdn.net/vihem/article/details/120786114