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

时间:2017-01-06 17:21:13

标签: java inheritance

我试图理解遗传并且有一些问题需要理解。

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的参数{1}}类到二级超类Resource类?

祝你好运

2 个答案:

答案 0 :(得分:0)

  

1)课程PropertyFiles所有方法都可以从课程ResourcesSiteTemplateMethodsSiteTemplate访问。是吗?

不,这是不对的。 public的所有protectedPropertyFiles成员都可以访问后代类,包括ResourcesSiteTemplateMethodsSiteTemplate,但{private 1}}子类无法访问PropertyFiles的方法。仅当子类与Resources位于同一个包中时,才能访问包私有方法。请参阅https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

访问已被覆盖的方法还有其他限制(正如@Gergely首先提到的那样)。

  

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

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

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

  

但是类SiteTemplateMethods中不需要这些参数如何将SiteTemplate类的参数提取到第二级超类Resource类?

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

答案 1 :(得分:0)

让我们宣布一些方法。

id     select_type     table     type    possible_keys     rows      Extra
1      SIMPLE          posts     eq_ref  PRIMARY,type_     1         Using 
                                         status_date                 Where 

1      SIMPLE          elements  ALL     NULL              67774   Using     
                                                                    where; 
                                                                    Using 
                                                                    join 
                                                                    buffer 
                                                       (Block Nested Loop)

1)在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 //... } } 中,您可以SiteTemplatec()Resources访问a(),因为b()会覆盖SiteTemplateMethods 。致电a()会调用a()中的SiteTemplateMethods方法。如果您的实例为SiteTemplate,则无法调用a()的{​​{1}}方法。但Resources中的b()方法调用超类方法,并在其后执行其他代码。

2)在构造函数调用中,您只能访问类直接扩展的类声明的构造函数。在给定示例中,除SiteTemplateMethods声明以下内容外,您无法在super(String country,String language)中致电SiteTemplate

SiteTemplateMethods

另请注意,具有不同参数的方法被视为两种不同的方法。因此public SiteTemplateMethods(String country,String language){ super(country,language); //... } 不会覆盖a(String str)。但是,如果覆盖方法完全适用于前一个方法的参数,则情况并非如此。因此a()会覆盖a(Object o)