java 中的抽象类完全可以包含成员变量。这些成员变量可以是实例变量(非静态)或类变量(静态),并且可以拥有各种访问修饰符,如 public、private、protected 和默认访问权限。

抽象类中定义的实例变量如何被继承和使用?
抽象类中定义的实例变量会被其所有非抽象子类继承。子类可以直接访问受保护的(protected)或公共的(public)实例变量,或者通过父类提供的 getter/setter 方法访问私有(private)实例变量。在子类构造对象时,父类的实例变量会随着父类构造器的执行而被初始化。

abstract class Animal {
protected String name;
private int age;
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public int getAge() {
return age;
}
}
class Dog extends Animal {
public Dog(String name, int age) {
super(name, age);
}
public void bark() {
System.out.println(name + " is barking. Age: " + getAge());
}
}
public class Main {
public static void main(String[] args) {
Dog myDog = new Dog("Buddy", 3);
myDog.bark(); // 输出: Buddy is barking. Age: 3
}
}
抽象类中的静态变量有什么特点?
抽象类中的静态变量属于类本身,而不是类的任何特定实例。它们可以通过类名直接访问,也可以通过子类访问。静态变量通常在抽象类中用于定义常量或共享状态,例如一个计数器或配置信息。由于它们是静态的,因此在所有子类实例之间是共享的。

abstract class Shape {
public static int shapeCount = 0;
public Shape() {
shapeCount++;
}
}
class Circle extends Shape {
// ...
}
class Square extends Shape {
// ...
}
public class Main {
public static void main(String[] args) {
Circle c1 = new Circle();
Circle c2 = new Circle();
Square s1 = new Square();
System.out.println(Shape.shapeCount); // 输出: 3
}
}
如果子类没有调用父类的构造器,会发生什么?
如果子类没有显式调用父类的构造器,Java 编译器会自动插入对父类无参构造器的调用。如果父类没有无参构造器,这将导致编译错误。因此,在抽象类中定义了带参数的构造器时,子类必须在其构造器中显式调用父类的相应构造器,以确保父类的实例变量能够正确初始化。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











