为什么我们转向访问超类成员虽然我们可以继承它们?

时间:2012-06-13 18:04:37

标签: java oop inheritance

如果我们有2级动物园& Moo如下:

public class zoo {
    String superString="super";
    private String coolMethod(){
        return "Zoo method";
    }
}

public class Moo extends zoo{
    public void useMyCoolMethod(){
        zoo z=new zoo();
        System.out.println(superString);//1
        System.out.println(z.superString);//2
    }
    public  static void main(String[]args){
        new Moo().useMyCoolMethod();
    }
}

1& 2我们通过继承和访问来打印超类中String的值,问题是,尽管我可以通过继承做同样的事情,但Access的好处是什么?知道如果两个类在diff包中,则不允许使用Access方法

7 个答案:

答案 0 :(得分:2)

关于你的例子,如果你真的想要两次打印“超级”,那么在“访问”该方法中根本没有任何好处。

但是通常OO程序包含两个以上的类,作者试图用定义的接口(也就是公共方法或API)模块化代码。仅使用继承创建模块非常困难并且创建笨拙的代码。因此,对象将需要其他实例,并通过“访问”调用方法。

答案 1 :(得分:2)

通过对象ref访问,您正在修改引用对象的状态,通过继承,您正在修改当前所在的对象(此引用)。因此除了在类级别和包级别通过访问修饰符进行封装之外实际上没有任何好处,你可以根据你想要的代码行为来使用它,或者在这种情况下,对它的限制如何根据上下文修改对象的状态。

但除此之外,我不确定是否还有其他事情。

答案 2 :(得分:1)

如果Moo位于同一个包中但未扩展Zoo,则访问权限(默认或包私有)会很有用。

答案 3 :(得分:1)

在第1行中,你正在使用继承,即你有一个类动物,并且你有方法move(),它使用他的四条腿移动动物。但是在Kangaroo的情况下,你想要使用动物类的大部分功能,但是想要根据它跳跃并使用它后腿移动的事实来改变它的运动方式。

在第2行中,您正在使用合成,即当您想要创建汽车时,您将需要不同的组件,并且它们将相互交互以使该汽车起作用。在这里,您不能从GearBox或Engine继承,但您必须将它们用作Car的一部分(或您正在调用的访问权限)。

最后,它与Zoo和Moo之间的关系将决定你想要使用什么方法

答案 4 :(得分:1)

do Not want to modify the content of the inherited memeber..

时,使用此访问权限和继承是相同的

例如:

public class A {

    String s = "Hello";

   }

public class B extends A{

    String s = "Hi;

   System.out.println(s);  // Will print the s in class B

   System.out.println(new A().s);  // Will print the s in class A

   }

现在因为String没有修饰符,所以它被认为是Default modifier,这意味着它可以被classes only with in its own package.访问

如果您使用受保护的访问修饰符,那么您需要扩展该类,然后使用继承的成员but you can Not use the protected member by creating an instance of the class that holds it and then use dot operator to access it, this will Not work..

例如:

package com.go;

public class A {

  protected String s= "Hi";

 }

 package com.fo;

 public class B extends A {

  System.out.println(s);  // This will work

  A a = new A();
  System.out.println(a.s); // This will NOT work

 }

答案 5 :(得分:1)

首先,我认为使用私有可见性维护类属性是一种很好的做法,并通过getter和setter访问它们。

第二,你没有通过继承访问属性,你正在创建一个Zoo实例,并且由于它的包可见性而访问superString属性,你也可以从另一个类中访问它们。甚至没有扩展Zoo类的包(这通常不是一件好事)

第三,你不需要创建超类的实例来访问他的public或default属性你可以这样做:

System.out.println(this.superString)

与绝对相同(如果不是使用相同名称声明的局部变量或参数):

System.out.println(superString)

总之,拥有默认或公共属性,让客户端类访问它们(读取和写入),而没有类可以对它做任何事情,这可能会给使用这些属性的类的方法带来副作用。

答案 6 :(得分:0)

示例2你有一个动物园对象的单独实例,这有点奇怪,但由于该方法将始终返回相同的东西,因此没有太大的区别。如果您将方法更改为基于构造函数输入或某些内容,则可以看到2中的差异。

public class zoo {
    public String superString;
    public zoo (String _superstring) {
        superString = _superstring;
    }
}

public class Moo extends zoo{
    public void useMyCoolMethod(){
        zoo z=new zoo("string1");
        System.out.println(superString);//1
        System.out.println(z.superString);//2
    }
    public Moo (String _superstring) {
        superString = _superstring;
    }
    public  static void main(String[]args){
        new Moo("string2").useMyCoolMethod();
    }
}

将返回

  

字符串2
  字符串1