向上转型:将一个子类的对象赋值给父类变量。
格式:
Father f=new Son();
Father 是父类,Son是子类。
看代码:
package part01;
class Father{
int i=0;
public void method1()
{
System.out.println("father method");
}
}
class Son extends Father{
int i=1;
@Override
public void method1()
{
System.out.println("son method");
}
//定义一个父类没有的方法
public void newmethod()
{
System.out.println("子类的新方法");
}
}
public class Demo01 {
public static void main(String[] args) {
System.out.println("-----------------向上转型——————————————————");
//向上转型:
Father f=new Son();
System.out.println(f.i);
f.method1();
//f.newmethod(); 失去父类没有的方法 这个报错。
运行结果:
-----------------向上转型——————————————————
0
son method
发生向上转型之后,
成员变量是父类的,获得的方法是子类的。
因为对象变量,所以失去子类中独有的方法。(就是你调用的话会报错。)
向上转型的好处:
方法传值的时候,虽然形参是父类的参数,实际传入的却是子类的参数,大大简化了代码,不必在子类中一个个写相似度很高的代码。看以下例子。
class Father2
{
public void method()
{
System.out.println("Father method");
}
}
class Son1 extends Father2
{
public void method()
{
System.out.println("son1 method ");
}
}
class Son2 extends Father2
{
public void method()
{
System.out.println("son2 method");
}
}
public class Demo02 {
public static void main(String[] args) {
//传入的是子类的对象。
test(new Son1());
test(new Son2());
}
public static void test(Father2 f)
{
f.method();
}
}
运行结果:
son1 method
son2 method
向下转型:
就是在向上转型的基础上,再将父类变量赋给子类的变量,这样就可以调动所有子类的变量和方法了。
格式:
Father f=new Son();
Son s=(Son)f;
看一下代码:
package part01;
class Father{
int i=0;
public void method1()
{
System.out.println("father method");
}
}
class Son extends Father{
int i=1;
@Override
public void method1()
{
System.out.println("son method");
}
//定义一个父类没有的方法
public void newmethod()
{
System.out.println("子类的新方法");
}
}
public class Demo01 {
public static void main(String[] args) {
System.out.println("-----------向下转型----------------");
Father f2=new Son();
//子类对象变量指向子类的实例,所以全部都是子类了无论调用的是方法还是变量。
Son s2=(Son)f2;
System.out.println(s2.i);
s2.method1();
s2.newmethod();
}
}
运行结果:
-----------向下转型----------------
1
son method
子类的新方法