类的多态

由于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();这个是错误的写法,子类被上溯造型为父类后,
		//不可直接访问子类的成员方法,除非该成员方法覆盖重写了父类的方法
		
	}

}

总结

  • 访问成员方法:
    • 父类有,子类未重写,访问父类方法;
    • 子类有,父类没有,报错;
    • 父类有,子类重写,访问子类方法;
  • 访问属性
    • 父类有,访问父类;
    • 父类无,直接报错;
    • 总之,无法直接访问访问子类属性,可通过访问=重写方法去访问不子类的的属性