如何使用修饰符控制继承?

Posted

技术标签:

【中文标题】如何使用修饰符控制继承?【英文标题】:How do I control Inheritance with modifiers? 【发布时间】:2016-04-29 06:36:40 【问题描述】:

我基本上是在寻找一种方法来修改以下源代码,在方法体中使用修饰符和一些额外的行,所以它在我的控制台中打印出以下内容:

1g
1hb
2f
1g
2hb
1hb

这是我大学课程的一项练习,我似乎无法理解它。我只允许更改 println 行以外的方法体以及更改方法的修饰符。我应该如何做到这一点以及修饰符在这里与继承有何关系?如何重载方法以获得所需的结果?

这是我的主要方法:

public class Poly 
     public static void main( String args[] ) 
        Poly1 a = new Poly1();
        a.g();

        Poly2 b = new Poly2();
        b.f();    
    

这是我的第一堂课:

public class Poly1 

public void f() 
    System.out.println( "1f" );
    g();


private void g() 
    System.out.println( "1g" );
    h( 10 );


protected void h( int i ) 
    System.out.println( "1hi" );


void h( byte b ) 
    System.out.println( "1hb" );


以下是我的第二堂课:

public class Poly2 extends Poly1 

protected void f() 
    System.out.println( "2f" );
    Poly1 c=new Poly1();
    g();
    h();


public void g() 
    System.out.println( "2g" );
    h( 18 );


public void h( int i) 
    System.out.println( "2hi" );


public void h( byte b ) 
    System.out.println( "2hb" );


【问题讨论】:

【参考方案1】:
public class Poly1 
    public void f() 
        System.out.println("1f");
        g();
    

    public void g() 
        System.out.println("1g");
        h((byte) 10); // cast to byte to invoke the overloaded method void
                      // h(byte b)
    

    protected void h(int i) 
        System.out.println("1hi");
    

    void h(byte b) 
        System.out.println("1hb");
    



public class Poly2 extends Poly1 

     public void f()  //change from protected  to public since the visibility of an overidden method Cannot be reduced
        System.out.println("2f");
        Poly1 c = new Poly1();
        c.g(); // invoke the methode g of Poly1
        h((byte) 10);
    

    public void g() 
        System.out.println("2g");
        h(18);
    

    protected void h(int i) 
        System.out.println("2hi");


    public void h(byte b) 
        System.out.println("2hb");
    

【讨论】:

是的,这基本上也是我的解决方案。我只是无法让第 5 行的 2hb 工作。它必须以某种方式介于两者之间,但我只是不知道如何? super.g(); super.h((byte) 10); 非常感谢!我终于明白了超级......干杯!

以上是关于如何使用修饰符控制继承?的主要内容,如果未能解决你的问题,请参考以下文章

java修饰符归类

java中的类修饰符成员变量修饰符方法修饰符。

package,继承,访问修饰符

java中的类修饰符成员变量修饰符方法修饰符

06-JAVA类及成员的修饰符

Android的java基本知识总结入门篇