我试图理解继承,并有一些问题需要理解。
public class SiteTemplate extends SiteTemplateMethods
public SiteTemplate(String country, String language, HttpServletRequest request){
super();
}
public class SiteTemplateMethods extends Resources
public class Resources extends PropertyFiles1) PropertyFiles类--所有方法都可以从类Resources、SiteTemplateMethods和SiteTemplate访问。是那么回事吗?
2) super();在SiteTemplate构造函数中将所有参数传递给SiteTemplateMethods,但是在SiteTemplateMethods类中不需要这些参数,如何将SiteTemplate类的参数传递给二级超类Resource类?
诚挚的问候
发布于 2017-01-06 17:37:02
1)
PropertyFiles类--所有方法都可以从类Resources、SiteTemplateMethods和SiteTemplate访问。是那么回事吗?
不,这不对。所有public和protected成员的PropertyFiles都可以被子类访问,包括Resources、SiteTemplateMethods和SiteTemplate,但是子类不能访问PropertyFiles的private方法。包-只有当子类与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类的方式直接应用参数,例如调用属性设置器方法。
发布于 2017-01-06 18:06:32
让我们声明一些方法。
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实例,那么您就不能调用Resources的a()方法。然而,b()方法在SiteTemplateMethods中调用超类方法,并在之后执行额外的代码。
2)在构造函数调用中,您只能访问类直接扩展的类声明的构造函数。在给定的示例中,您不能在super(String country,String language)中调用SiteTemplate,除非SiteTemplateMethods声明如下:
public SiteTemplateMethods(String country,String language){
super(country,language);
//...
}还请注意,具有不同参数的方法被视为两种不同的方法。因此,a(String str)不覆盖a()。但是,如果重写方法完全适用于前一个方法的参数,则这是不正确的。所以a(Object o)确实覆盖了a(String str)。
https://stackoverflow.com/questions/41510873
复制相似问题