一、什麼是抽象類?
Java中的抽象類是一種特殊的類,它不能被實例化,只能被繼承。它的存在主要是為了給其他類提供一個通用的模板或介面,讓這些子類實現父類中定義的抽象方法。
抽象類可以包含抽象方法、非抽象方法、靜態方法和成員變數。其中抽象方法只有聲明,沒有方法體,必須在子類中實現。
public abstract class Animal {
// 非抽象方法
public void eat(String food) {
System.out.println("Animal is eating " + food);
}
// 抽象方法,沒有方法體
public abstract void makeSound();
}
二、抽象類的作用
使用抽象類可以達到以下的效果:
1. 抽象類能夠約束子類的行為
由於抽象類不能被實例化,因此它主要是作為父類來被繼承和實現。通過定義抽象方法和非抽象方法,可以對子類的行為進行約束,讓子類必須實現某些方法,從而保證了程序的正確性。
public class Dog extends Animal {
// 重寫抽象方法
@Override
public void makeSound() {
System.out.println("Dog is barking");
}
}
public class Cat extends Animal {
// 重寫抽象方法
@Override
public void makeSound() {
System.out.println("Cat is meowing");
}
}
public class Test {
public static void main(String[] args) {
Animal dog = new Dog();
Animal cat = new Cat();
dog.makeSound(); // Dog is barking
cat.makeSound(); // Cat is meowing
}
}
2. 抽象類可以提高代碼的復用性
通過抽象類,可以將子類中公共的屬性和方法放在抽象父類中,從而避免了重複編寫代碼。這樣,可以提高代碼的復用性,減少代碼的量。
public abstract class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public abstract void doSomething();
}
public class Student extends Person {
public Student(String name, int age) {
super(name, age);
}
@Override
public void doSomething() {
System.out.println("I am a student.");
}
}
public class Teacher extends Person {
public Teacher(String name, int age) {
super(name, age);
}
@Override
public void doSomething() {
System.out.println("I am a teacher.");
}
}
public class Test {
public static void main(String[] args) {
Person s = new Student("Tom", 18);
Person t = new Teacher("Jerry", 30);
System.out.println(s.getName() + " is " + s.getAge() + " years old and ");
s.doSomething(); // I am a student.
System.out.println(t.getName() + " is " + t.getAge() + " years old and ");
t.doSomething(); // I am a teacher.
}
}
三、抽象類為什麼不能被實例化?
抽象類不能被實例化是Java語言設計的一個重要特點。這是由於抽象類本身存在著不完整的方法,即抽象方法,這些方法需要延遲到其子類去實現。如果允許抽象類被實例化,那麼就會存在沒有實現抽象方法的實例對象,這是不合法的,也是不安全的。
另外,抽象類也存在一定的抽象性和不確定性,這使得其本質上無法具體化為一個實例對象。抽象類作為一個概念,其主要存在的目的是作為其他類的父類,而不是作為單獨的實體。因此,抽象類的實例化是無意義的。
四、抽象類的子類能否實例化?
抽象類不能被實例化,但是抽象類的子類可以被實例化。由於子類繼承了抽象類中的方法和屬性,因此子類是可以作為具體的實體存在的。
public abstract class Animal {
public abstract void makeSound();
}
public class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Dog is barking");
}
}
public class Test {
public static void main(String[] args) {
Animal animal = new Dog();
animal.makeSound(); // Dog is barking
}
}
五、小結
抽象類是Java中的一個重要特性,它主要用於約束子類的行為和提高代碼的復用性。抽象類不能被實例化,但是抽象類的子類可以被實例化。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/253872.html
微信掃一掃
支付寶掃一掃