我在学习Java中的继承,但还不是很理解。假设我们有一个父类方法,其中包含一个私有变量和公共setter getter方法。子类继承了这些方法,但没有继承私有变量。这些方法是否总是与同时运行于子类的超类相连?我无法在子类中声明具有相同名称的变量,因此继承的方法将访问它。我知道这样做是行不通的。在继承情况下,setter/getter方法是否始终仅影响其声明对象中的值,即使通过继承从子类中调用也是如此?
我在学习Java中的继承,但还不是很理解。假设我们有一个父类方法,其中包含一个私有变量和公共setter getter方法。子类继承了这些方法,但没有继承私有变量。这些方法是否总是与同时运行于子类的超类相连?我无法在子类中声明具有相同名称的变量,因此继承的方法将访问它。我知道这样做是行不通的。在继承情况下,setter/getter方法是否始终仅影响其声明对象中的值,即使通过继承从子类中调用也是如此?
public class C1 {
protected int x = 1;
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public static void main(String[] args){
System.out.println(new C1().getX());
System.out.println(new C2().getX());
System.out.println(new C3().getX());
System.out.println(new C4().getX());
}
}
并且
public class C2 extends C1{
}
and
public class C3 extends C2{
protected int x = 3;
}
并且
public class C4 extends C3{
protected int x = 4;
@Override
public int getX() {
return x;
}
}
你将获得:
C1.x = 1
C2.x = 1
C3.x = 1
C4.x = 4
让我们看看发生了什么。
假设你有一个类 A
,其中包含一个私有的整型变量 a
,以及一个getter方法 getA()
和一个setter方法 setA(int)
:
最初的回答:
public class A {
private int a;
public int getA() {
return a;
}
public void setA(int value) {
a = value;
}
}
A
的类 B
,你可以确保 getter 和 setter 不能被 B
的子类重写:最初的回答。public class B extends A {
@Override
public final int getA() {
return super.getA();
}
@Override
public final void setA(int value) {
super.setA(value);
}
}
package testvehicle;
public class Car extends Vehicle
{
private int numDoors;
private int numWheels;
public Car(String manufacturer,String model,int maxSpeed,double price,int numWheels
,int numDoors)
{
super(manufacturer,model,maxSpeed,price);
this.numDoors=numDoors;
this.numWheels=numWheels;
}
public Car()
{
}
public int getNumDoors()
{
return numDoors;
}
public void setNumDoors(int numDoors)
{
this.numDoors = numDoors;
}
public int getNumWheels()
{
return numWheels;
}
public void setNumWheels(int numWheels)
{
this.numWheels = numWheels;
}
public String toString()
{
return ("Number of doors:"+numDoors+"\n"+"Number of wheels:"+numWheels+""
+ "\n"+
"Manufacturer:"+manufacturer+"\n"+
"Model:"+model+"\n"+"Maximum Speed:"+maxSpeed+"\n"+"Price in euros:"+price+
"\n");
}
}
package testvehicle;
public class MotorCycle extends Vehicle
{
private String seat;
public MotorCycle(String manufacturer,String model,int maxSpeed,double price
,String seat)
{
super( manufacturer, model, maxSpeed, price);
this.seat=seat;
}
public MotorCycle()
{
}
public String getSeat()
{
return seat;
}
public void setSeat(String seat)
{
this.seat = seat;
}
public String toString()
{
return ("Manufacturer:"+manufacturer+"\n"+
"Model:"+model+"\n"+"Maximum Speed:"+maxSpeed+"\n"+"Price in euros:"+price+
"\n"+"Seat type:"+seat+"\n");
}
}
package testvehicle;
public abstract class Vehicle//This class doesn't do something!
{
protected String manufacturer;
protected String model;
protected int maxSpeed;
protected double price;
public Vehicle(String manufacturer,String model,int maxSpeed,double price)
{
this.manufacturer=manufacturer;
this.model=model;
this.maxSpeed=maxSpeed;
this.price=price;
}
public Vehicle()
{
}
public String getManufacturer()
{
return manufacturer;
}
public void setManufacturer(String manufacturer)
{
this.manufacturer = manufacturer;
}
public String getModel()
{
return model;
}
public void setModel(String model)
{
this.model = model;
}
public int getMaxSpeed()
{
return maxSpeed;
}
public void setMaxSpeed(int maxSpeed)
{
this.maxSpeed = maxSpeed;
}
public double getPrice()
{
return price;
}
public void setPrice(double price)
{
this.price = price;
}
public String toString()
{
return ("Manufacturer:"+manufacturer+"\n"+
"Model:"+model+"\n"+"Maximum Speed:"+maxSpeed+"\n"+"Price in euros:"+price+
"\n");
}
}
package testvehicle;
public class Main
{
public static void main(String[] args)
{
Car C=new Car("Opel","Corsa",220,12000.0,4,5);
MotorCycle M=new MotorCycle("KTM","DUKE-690",250,9000.0,"Agressive");
System.out.println(C.toString());
System.out.println();
System.out.println(M.toString());
}
}
http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html