0

如果我们有 2 类 Zoo & 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 有什么好处?知道如果两个类位于差异包中,则不允许使用 Access 方法

4

7 回答 7

2

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

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

于 2012-06-13T18:11:32.370 回答
2

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

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

于 2012-06-13T18:12:12.073 回答
1

Moo如果在同一个包中并且没有扩展,则访问(默认或包私有)将很有用Zoo

于 2012-06-13T18:10:05.790 回答
1

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

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

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

于 2012-06-13T18:13:30.373 回答
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 s 没有修饰符,它被认为是有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

 }
于 2012-06-13T18:17:13.757 回答
1

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

其次,您不是通过继承访问属性,而是创建 Zoo 的实例,并访问 superString 属性,因为它是包可见性,您还可以从包的另一个类访问它们,甚至不扩展 Zoo类(这通常不是一件好事)

第三,您不需要创建超类的实例来访问他的公共或默认属性,您可以简单地执行以下操作:

System.out.println(this.superString)

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

System.out.println(superString)

总之,拥有默认或公共属性,让客户端类在没有类的情况下访问它们(读取和写入)对此无能为力,这可能会给使用这些属性的类的方法带来副作用。

于 2012-06-13T18:43:16.773 回答
0

示例 2 您有一个单独的 zoo 对象实例,这有点奇怪,但由于该方法总是返回相同的东西,所以没有太大区别。如果您将方法更改为基于构造函数输入或其他内容,您可能会看到 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

于 2012-06-13T18:14:07.003 回答