类的多态
由于java类之间存在着单继承关系,当一个子类对象被当作一个父类对象来使用的时候,就体现出了多态性。
此时不可以直接访问子类的独有方法(非重写覆盖方法)或者子类的属性,在这里子类的独有方法(非重写覆盖方法)和属性对于该对象来说是”不可见的“;
要访问子类的方法可以通过重写的方式,而子类的属性则可以通过重写覆盖了父类的方法去访问到。
第一种情况:子类没有重写覆盖父类的方法,当调用方法时,先在父类中看是否有该方法,有则执行,没有则报错。
class Father{
String name="父类属性";
public void method(){
System.out.println("父类方法");
}
}
class Child extends Father{
String childName="子类属性";
/* 第一种情况:不重写覆盖父类的方法 */
public void methodChild(){
System.out.println("子类独有方法");
}
}
public class Test{
public static void main (String args[]){
Father f=new Child();
f.method();//输出结果:"父类方法"
/* f.methodChild();这个是错误的写法, 子类被上溯造型为父类后,不可直接访问子类的成员方法, 除非该成员方法覆盖重写了父类的方法。 */
/*System.out.println(f.childName);错误写法!不可直接访问子类的属性, 但是可以使用其他方法(该方法同时也需要是覆盖重写了父类的方法)去访问到子类的属性 */
}
}
第二种情况:子类重写覆盖了父类的方法,因此可以使用该重写覆盖的方法,而其余未重写覆盖的方法仍旧不可直接访问
class Father{
String name="父类属性";
public void method(){
System.out.println("父类方法");
}
}
class Child extends Father{
String childName="子类属性";
/* 第二种情况:重写覆盖父类的方法 */
@Override
public void method(){
System.out.println("子类方法");
System.out.println(childName);//通过此方法访问到子类的属性
}
public void methodChild(){
//无法直接访问
System.out.println("子类独有方法");
}
}
public class Test{
public static void main (String args[]){
Father f=new Child();
f.method();
//输出结果:"子类方法"
// "子类属性"
//f.methodChild();这个是错误的写法,子类被上溯造型为父类后,
//不可直接访问子类的成员方法,除非该成员方法覆盖重写了父类的方法
}
}
总结:
- 访问成员方法:
- 父类有,子类未重写,访问父类方法;
- 子类有,父类没有,报错;
- 父类有,子类重写,访问子类方法;
- 访问属性
- 父类有,访问父类;
- 父类无,直接报错;
- 总之,无法直接访问访问子类属性,可通过访问=重写方法去访问不子类的的属性