Setter / getter方法继承

3

我在学习Java中的继承,但还不是很理解。假设我们有一个父类方法,其中包含一个私有变量和公共setter getter方法。子类继承了这些方法,但没有继承私有变量。这些方法是否总是与同时运行于子类的超类相连?我无法在子类中声明具有相同名称的变量,因此继承的方法将访问它。我知道这样做是行不通的。在继承情况下,setter/getter方法是否始终仅影响其声明对象中的值,即使通过继承从子类中调用也是如此?


2
你不能只继承方法而不继承变量。你从父类继承所有东西。私有仅意味着你无法直接访问它,但它仍然存在。 - flotothemoon
3
私有变量并不会消失,只是无法被子类实例访问。通过父类的getter方法仍然可以访问它。 - Kayaman
2
请继续阅读并尝试继承。通过阅读一些指南并打开Eclipse自己尝试,您可能已经回答了自己的问题。 - Qix - MONICA WAS MISTREATED
考虑像向类追加代码一样对子类进行编程,也许这会帮助你理解这个想法。 - Leo
4个回答

2
也许一个例子可以帮助您理解。
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

让我们看看发生了什么。

  • C1.x的值为1是显而易见的
  • C2.x的值为1,因为它与C1相同
  • C3.x的值为1,因为getX()只能访问在C1声明的"x"(对于一些人来说并不直观)
  • C4.x的值为4,因为在C4处重写了getX(),所以它可以访问在C4声明的"x"

2

假设你有一个类 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);
    }
}

0
也许这个例子也会有所帮助:
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());

        }


    }

-3

这简直不准确。方法和变量(字段)都有可见性限制。子类始终可以访问(查看)受保护的和公共的,并且如果在同一包中,则可以访问默认范围。 - Brett Okken
1
错误。子类继承一切。包括所有带有私有修饰符的内容,如私有方法和变量。私有方法和变量在子类中无法访问,但这并不意味着它们不存在。 - flotothemoon
@1337 这并不完全正确。子类不会继承构造函数。 - emory
@emory 当然,我指的是方法、变量等等 :) - flotothemoon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接