继承成员变量和继承方法在继承过程中存在一些区别。
- 继承成员变量:
- 子类可以继承父类的成员变量,包括实例变量和静态变量。
继承实例变量的例子:
- 子类可以继承父类的成员变量,包括实例变量和静态变量。
class Animal {
String name; // 父类的实例变量
public Animal(String name) {
this.name = name;
}
public void display() {
System.out.println("Animal name: " + name);
}
}
class Dog extends Animal {
int age; // 子类的实例变量
public Dog(String name, int age) {
super(name); // 调用父类的构造方法
this.age = age;
}
public void display() {
System.out.println("Dog name: " + name);
System.out.println("Dog age: " + age);
}
}
public class InheritanceExample {
public static void main(String[] args) {
Dog dog = new Dog("Buddy", 3);
dog.display(); // 输出:Dog name: Buddy, Dog age: 3
}
}
在上面的例子中,子类Dog
继承了父类Animal
的实例变量name
,并添加了自己的实例变量age
。子类通过继承父类的实例变量,可以在自己的方法中访问和操作父类的实例变量,并且还可以扩展自己的功能。
- 继承静态变量的例子:
class Parent {
static int count = 10; // 父类的静态变量
}
class Child extends Parent {
static int number = 20; // 子类的静态变量
}
public class InheritanceExample {
public static void main(String[] args) {
System.out.println(Child.count); // 输出:10,访问父类的静态变量
System.out.println(Child.number); // 输出:20,访问子类的静态变量
}
}
在上面的例子中,子类Child
继承了父类Parent
的静态变量count
,并添加了自己的静态变量number
。子类可以直接访问父类的静态变量,并且在子类中可以定义自己的静态变量。通过继承父类的静态变量,子类可以共享相同的静态变量,并且可以在子类中添加新的静态变量来扩展功能。
- 继承后的子类可以直接访问继承得到的成员变量。
当子类继承父类时,子类可以直接访问继承得到的成员变量。以下是一个例子:
class Vehicle {
String brand; // 继承得到的实例变量
public void displayBrand() {
System.out.println("Brand: " + brand);
}
}
class Car extends Vehicle {
int maxSpeed; // 子类自己定义的实例变量
public void displayMaxSpeed() {
System.out.println("Max Speed: " + maxSpeed + " km/h");
}
}
public class InheritanceExample {
public static void main(String[] args) {
Car car = new Car();
car.brand = "Toyota"; // 直接访问继承得到的成员变量
car.displayBrand(); // 输出:Brand: Toyota
car.maxSpeed = 200; // 子类自己的实例变量
car.displayMaxSpeed(); // 输出:Max Speed: 200 km/h
}
}
在上面的例子中,子类Car
继承了父类Vehicle
的实例变量brand
,并且在子类中定义了自己的实例变量maxSpeed
。通过继承,子类可以直接访问继承得到的成员变量brand
,并且还可以在子类中添加自己的实例变量。在子类的对象中,可以直接操作继承得到的成员变量和子类自己定义的成员变量。
- 子类可以在继承的基础上添加自己的成员变量。
- 子类无法访问父类的私有成员变量。
- 若子类和父类具有同名的成员变量,子类的成员变量会隐藏父类的同名成员变量,可以使用
super
关键字访问父类的成员变量。 - 示例:
class Parent { int x = 10; // 父类成员变量 } class Child extends Parent { int x = 20; // 子类成员变量,隐藏了父类同名成员变量 int y = 30; // 子类独有的成员变量 public void display() { System.out.println(x); // 访问子类成员变量,输出20 System.out.println(super.x); // 访问父类成员变量,输出10 System.out.println(y); // 访问子类独有的成员变量,输出30 } }
- 继承方法:
- 子类可以继承父类的方法,包括实例方法和静态方法(但静态方法不具有多态性)。
- 继承后的子类可以直接调用继承得到的方法。
- 子类可以在继承的基础上重写(覆盖)父类的方法,以实现自己的特定行为。
- 子类可以通过
super
关键字调用父类的方法,以便在子类方法中使用父类的逻辑。 - 示例:
class Parent { void display() { System.out.println("Parent's display method"); } } class Child extends Parent { void display() { System.out.println("Child's display method"); super.display(); // 调用父类的display方法 } }
继承成员变量和继承方法的区别在于继承成员变量是通过隐藏和添加成员变量来实现的,而继承方法则是通过重写和调用父类方法来实现的。继承成员变量可以让子类直接访问和使用父类的成员变量,而继承方法则是让子类可以继承父类的行为,并在需要时可以重写和调用父类的方法。
考察
class Base {
int count = 10;
public void display() {
System.out.println(this.count);
}
}
class Sub extends Base {
int count = 20;
public void display() {
System.out.println(this.count);
}
}
public class FieldMethodTest {
public static void main(String[] args){
Sub s = new Sub();
System.out.println(s.count); //20
s.display();//20
Base b = s;
System.out.println(b == s);//true
System.out.println(b.count);//10
b.display();//20
//多态
Base s1 = new Sub();
System.out.println(s1.count);//10 //编译看左边,运行看右边 成员变量的访问是基于引用变量的声明类型
s1.display();//20 运行方法看右边
}
}
在上面的代码中,定义了一个基类Base
和一个子类Sub
。Base
类中有一个成员变量count
和一个公共方法display()
,Sub
类中也有一个同名的成员变量count
和重写的display()
方法。
在FieldMethodTest
的main
方法中,首先创建了一个Sub
类的实例s
。当我们访问s.count
时,会输出20
,因为子类Sub
中的成员变量count
会隐藏父类Base
中的同名成员变量。
接下来,调用s.display()
方法,输出20
。由于方法调用是基于对象的实际类型,所以会调用子类Sub
中重写的display()
方法。
然后,将Sub
类的实例s
赋值给Base
类的引用变量b
。此时,b
和s
指向同一个对象。因此,b == s
会输出true
。
接着,访问b.count
时,输出10
。这是因为成员变量的访问是基于引用变量的声明类型,即Base
类,所以访问的是父类Base
中的成员变量count
。
最后,调用b.display()
方法,输出20
。虽然b
的声明类型是Base
,但实际指向的是子类Sub
的对象,所以会调用子类Sub
中重写的display()
方法。
总结:在继承中,成员变量的访问是基于声明类型,方法的访问是基于实际类型。成员变量可以被隐藏,而方法可以被重写。当子类和父类存在同名成员变量或方法时,通过对象引用的不同,可以访问到不同的成员变量或方法。