Test.java
package mcc;
class Father
{
String name = "父类name";
void function()
{
System.out.println("father的function");
}
//以上两个成员 父类子类 都用
String faStr = "父类字符串";
void faFun()
{
System.out.println("faFun:hello");
}
void callfunction()
{
this.function();
}
//以上三个成员 父类独有
}
class Son extends Father
{
String name = "子类name";
void function()
{
System.out.println("son的function");
}
//以上两个成员 父类子类 都用
String soStr = "子类字符串";
void soFun()
{
System.out.println("soFun:hello");
}
void PrintFaMember()
{
System.out.println("fatherName = " + super.name);
System.out.println("fatherString = " + super.faStr);
}
//以上三个成员 子类独有
}
//上面父类和子类 都有name ,function(); 即同名成员
public class Test
{
public static void main(String[] args)
{
//父类引用 指向 子类对象(向上转型)
Father f = new Son();
//父类引用 调用 父类独有成员 和 独有函数
System.out.println("--1--");
System.out.println(f.faStr);
f.faFun();
System.out.println("--2--");
System.out.println(f.name);
//f.name 调用的 是父类中name
f.function();
//f.function(); 调用的是子类的function 因为被重写
//父类引用 不能调用 子类成员和子类非重写函数 和父类 被重写函数
//f.soStr f.soFun();是错误的
//父类引用 可以 调用子类重写的函数
//父类引用 不能调用 被重写函数 即使在父类独有函数中 调用它 也会指向子类重写函数
System.out.println("--3--");
f.callfunction();
//父类引用 强转 子类引用 (向下转型)
Son s = (Son) f;
//子类引用 调用 子类独有成员 和独有函数
System.out.println("--4--");
System.out.println(s.soStr);
s.soFun();
//子类引用 调用 同名成员 和同名函数(重写函数)
System.out.println("--5--");
System.out.println(s.name );
s.function();
//子类引用 不用调用 父类的同名成员 和同名函数
//可以在子类中用super.同名成员 实现调用, 再用子类引用 调用子类的实现
System.out.println("--6--");
s.PrintFaMember();
}
}