子类是否在java中继承其父类的私有属性?

时间:2015-11-10 18:18:23

标签: java inheritance

我正在阅读的这本书说我不能,但我的计划证明不是这样。例如,下面的代码编译得很好,即使我尝试访问父类的私有属性。然后我可以自由地打印它们。任何人都可以告诉我这本书是错的,还是我做错了什么?

class Asset
{
    private int Id;
    private String type;

    public int getId()
    {
        return Id;
    }
    public String getType()
    {
        return type;
    }

    public void setId(int Id)
    {
        this.Id=Id;
    }
    public void setType(String type)
    {
        this.type=type;
    }
    public void printDescription()
    {
        System.out.println("Asset Id: "+Id);
        System.out.println("Asst type: "+ type);
    } 
}

class BankAccount extends Asset
{
    private String bankName;
    private int accountNumber;
    private float balance;
    public String getBankName()
    {
        return bankName;
    }
    public int getAccountNumber()
    {
        return accountNumber;
    }

    public float getBalance()
    {
        return balance;
    }

    public void setBankName(String bankName)
    {
        this.bankName=bankName;
    }
    public void setAccountNumber(int accountNumber)
    {
        this.accountNumber=accountNumber;
    }
    public void setBalance(float balance)
    {
        this.balance=balance;
    }


    public void printDescriptionnn()
    {
        System.out.println("The Bank name is: "+ bankName);
        System.out.println("Account number: "+ accountNumber);
        System.out.println("Your balance is: "+ balance);
    }
}

public class AssetTest
{
    public static void main(String[] args)
    {
        BankAccount llogari= new BankAccount();
        Scanner input = new Scanner(System.in);
        Scanner sinput= new Scanner(System.in);
        System.out.print("Type the ID of your asset: ");
        llogari.setId(input.nextInt());
        System.out.print("Type the type of your asset: ");
        llogari.setType(sinput.nextLine());
        System.out.print("Give the bank name: ");
        llogari.setBankName(sinput.nextLine());
        System.out.print("Type the Account Number: ");
        llogari.setAccountNumber(input.nextInt());
        System.out.print("Type your balance: ");
        llogari.setBalance(input.nextFloat());
        llogari.printDescription();
        llogari.printDescriptionnn();
    }
}`

4 个答案:

答案 0 :(得分:3)

您可以通过publicprotected获取者访问它们,但无法直接访问private属性。在您的示例中,您使用public setter来修改属性。您可以通过public方法访问它们。

因此,为了回答您的问题,private成员继承子类。或者,您可以拥有由子类继承的protected个成员。

修改

来自Java Language Specificiation

  

声明为private的类的成员不会被该类的子类继承。

     

只有声明为protected或public的类的成员才会被声明在声明类之外的包中声明的子类继承。

答案 1 :(得分:2)

因为您没有直接修改父类的元素。您正在调用修改私有元素的公共函数,这完全有效。

答案 2 :(得分:1)

子类无法直接访问超类的private成员。它只能直接访问publicprotected成员。

在此上下文中,直接访问意味着:super.member

如果超类实现了protected或public accessor或mutator方法,那么您可以间接访问它们。间接访问看起来像:super.getMember()super.doSomething()

答案 3 :(得分:0)

任何子类都没有权限直接访问超类的私有成员。它可以访问公众和受保护的成员。