首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将参数传递给二级超类?

如何将参数传递给二级超类?
EN

Stack Overflow用户
提问于 2017-01-06 17:21:12
回答 2查看 2.1K关注 0票数 1

我试图理解继承,并有一些问题需要理解。

代码语言:javascript
复制
public class SiteTemplate extends SiteTemplateMethods

    public SiteTemplate(String country, String language, HttpServletRequest request){
        super();


    }   

public class SiteTemplateMethods extends Resources

public class Resources extends PropertyFiles

1) PropertyFiles类--所有方法都可以从类ResourcesSiteTemplateMethodsSiteTemplate访问。是那么回事吗?

2) super();SiteTemplate构造函数中将所有参数传递给SiteTemplateMethods,但是在SiteTemplateMethods类中不需要这些参数,如何将SiteTemplate类的参数传递给二级超类Resource类?

诚挚的问候

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-06 17:37:02

1) PropertyFiles类--所有方法都可以从类ResourcesSiteTemplateMethodsSiteTemplate访问。是那么回事吗?

不,这不对。所有publicprotected成员的PropertyFiles都可以被子类访问,包括ResourcesSiteTemplateMethodsSiteTemplate,但是子类不能访问PropertyFilesprivate方法。包-只有当子类与Resources在同一个包中时,它们才能被子类访问。见https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

在访问已被重写的方法方面还有其他限制(正如@Gergely首先指出的)。

2) super();在SiteTemplate构造函数中将所有参数传递给SiteTemplateMethods

不,它不会。没有参数的super()调用直接超类的非参数构造函数,不向它传递参数。如果直接超类没有可访问的no-arg构造函数,那么调用是无效的。

要调用不同的构造函数(即接受参数的构造函数),必须使用相应的参数列表调用super()

但是这些参数在SiteTemplateMethods类中并不是必需的,如何将SiteTemplate类的参数获得到二级超类Resource类呢?

如果SiteTemplateMethods有一个可访问的构造函数,将参数传递给Resource的可访问构造函数,那么您可以在SiteTemplate构造函数的开头使用相应的super()调用(带参数)。否则,SiteTemplate的构造函数将需要以适合Resource类的方式直接应用参数,例如调用属性设置器方法。

票数 0
EN

Stack Overflow用户

发布于 2017-01-06 18:06:32

让我们声明一些方法。

代码语言:javascript
复制
public class Resources extends PropertyFiles{
     public Resources(String country,String language){
          super();
          //...
     }
     public void a(){
          //...
     }
     public void b(){
          //...
     }
     public void c(){
          //...
     }
}
public class SiteTemplateMethods extends Resources{
     public SiteTemplateMethods(){
          super("foo","bar");
          //...
     }
     public void a(){
          //...
     }
     public void b(){
          super.b();//This will call the superclass's method
          //...
     }
}

1)在SiteTemplate中,您可以从Resources访问c(),但不能访问a()b(),因为它们被SiteTemplateMethods覆盖。调用a()将调用SiteTemplateMethods中的a()方法。如果您有一个SiteTemplate实例,那么您就不能调用Resourcesa()方法。然而,b()方法在SiteTemplateMethods中调用超类方法,并在之后执行额外的代码。

2)在构造函数调用中,您只能访问类直接扩展的类声明的构造函数。在给定的示例中,您不能在super(String country,String language)中调用SiteTemplate,除非SiteTemplateMethods声明如下:

代码语言:javascript
复制
public SiteTemplateMethods(String country,String language){
     super(country,language);
     //...
}

还请注意,具有不同参数的方法被视为两种不同的方法。因此,a(String str)不覆盖a()。但是,如果重写方法完全适用于前一个方法的参数,则这是不正确的。所以a(Object o)确实覆盖了a(String str)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41510873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档