我试图理解遗传并且有一些问题需要理解。
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
所有方法都可以从课程Resources
,SiteTemplateMethods
和SiteTemplate
访问。是吗?
2)super();
构造函数中的SiteTemplate
会将所有参数传递给SiteTemplateMethods
,但在SiteTemplateMethods
类中不需要这些参数如何获取SiteTemplate
的参数{1}}类到二级超类Resource
类?
祝你好运
答案 0 :(得分:0)
1)课程
PropertyFiles
所有方法都可以从课程Resources
,SiteTemplateMethods
和SiteTemplate
访问。是吗?
不,这是不对的。 public
的所有protected
和PropertyFiles
成员都可以访问后代类,包括Resources
,SiteTemplateMethods
和SiteTemplate
,但{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
//...
}
}
中,您可以SiteTemplate
但c()
和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)
。