在多态中成员函数的特点: 在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。 简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。
在多态中,成员变量的特点: 无论编译和运行,都参考左边(引用型变量所属的类)。
在多态中,静态成员函数的特点: 无论编译和运行,都参考做左边。
口诀:成员函数:编译看左,运行看右;成员变量,静态成员函数看左;
//多态中,成员函数编译看左,运行看右
class Fu
{
void method1()
{
System.out.println("fu method_1");
}
void method2()
{
System.out.println("fu method_2");
}
}
class Zi extends Fu
{
void method1()
{
System.out.println("zi method_1");
}
void method3()
{
System.out.println("zi method_3");
}
}
class DuoTaiDemo4
{
public static void main(String[] args)
{
Fu f = new Zi();
//Zi z = new Zi();
f.method1();
f.method2();//成员函数可能被继承,运行看右,看子类中是否覆写方法
//z.method3();编译失败,父类对象中没有method3方法
}
}
/*
编译看左是说,看左边父类中有没有调用的函数,若没有,则编译失败;
运行看右,看右边子类函数中有没有调用函数,
若有,则调用子类函数(覆写父类函数);若没有,则调用父类函数。
zi method_1
fu method_2
*/
/*
在多态中,成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类)。
成员变量看左边,表示看左边父类中是否有调用的成员变量,若没有,就会出错。
*/
class Fu
{
int num = 5;
void method1()
{
System.out.println("fu method_1");
}
void method2()
{
System.out.println("fu method_2");
}
}
class Zi extends Fu
{
int num = 8;
void method1()
{
System.out.println("zi method_1");
}
void method3()
{
System.out.println("zi method_3");
}
}
class DuoTaiDemo4
{
public static void main(String[] args)
{
Fu f = new Zi();
System.out.println(f.num);//在多态中,成员变量看左
Zi z = new Zi();
System.out.println(z.num);
}
}
/*
运行结果:
5
8
*/
//在多态中,静态成员变量,看左侧父类内变量
class Fu
{
static int num = 5;
void method1()
{
System.out.println("fu method_1");
}
void method2()
{
System.out.println("fu method_2");
}
}
class Zi extends Fu
{
int num = 8;
void method1()
{
System.out.println("zi method_1");
}
void method3()
{
System.out.println("zi method_3");
}
}
class TestDemo0
{
public static void main(String[] args)
{
Fu f = new Zi();
System.out.println(f.num);//在多态中,成员变量看左
System.out.println(Fu.num);
Zi z = new Zi();
System.out.println(z.num);
}
}
/*
5
5
8
*/
//在多态中,静态成员变量,看左侧父类内变量
class Fu
{
static int num = 5;
void method1()
{
System.out.println("fu method_1");
}
void method2()
{
System.out.println("fu method_2");
}
}
class Zi extends Fu
{
static int num = 8;
void method1()
{
System.out.println("zi method_1");
}
void method3()
{
System.out.println("zi method_3");
}
}
class TestDemo0
{
public static void main(String[] args)
{
Fu f = new Zi();
System.out.println(f.num);//在多态中,成员变量看左
System.out.println(Fu.num);
Zi z = new Zi();
System.out.println(z.num);
}
}
/*
5
5
8
*/
class Fu
{
int num = 5;
void method1()
{
System.out.println("fu method_1");
}
void method2()
{
System.out.println("fu method_2");
}
}
class Zi extends Fu
{
// int num = 8;
void method1()
{
System.out.println("zi method_1");
}
void method3()
{
System.out.println("zi method_3");
}
}
class TestDemo0
{
public static void main(String[] args)
{
Fu f = new Zi();
System.out.println(f.num);//在多态中,成员变量看左
Zi z = new Zi();
System.out.println(z.num);
}
}
/*
5
5
*/
class Fu
{
// int num = 5;
void method1()
{
System.out.println("fu method_1");
}
void method2()
{
System.out.println("fu method_2");
}
}
class Zi extends Fu
{
int num = 8;
void method1()
{
System.out.println("zi method_1");
}
void method3()
{
System.out.println("zi method_3");
}
}
class TestDemo0
{
public static void main(String[] args)
{
Fu f = new Zi();
System.out.println(f.num);//在多态中,成员变量看左
Zi z = new Zi();
System.out.println(z.num);
}
}
/*
Exception in thread "main" java.lang.Error: 无法解析的编译问题:
无法解析 num,或者它不是字段
*/
class Fu
{
private int num = 5;
void method1()
{
System.out.println("fu method_1");
}
void method2()
{
System.out.println("fu method_2");
}
}
class Zi extends Fu
{
int num = 8;
void method1()
{
System.out.println("zi method_1");
}
void method3()
{
System.out.println("zi method_3");
}
}
class TestDemo0
{
public static void main(String[] args)
{
Fu f = new Zi();
System.out.println(f.num);//在多态中,成员变量看左
Zi z = new Zi();
System.out.println(z.num);
}
}
/*
Exception in thread "main" java.lang.Error: 无法解析的编译问题:
字段 Fu.num 不可视
*/
/*
在多态中,静态成员函数的特点:
无论编译和运行,都参考做左边。
*/
class Fu
{
static int num = 5;
void method1()
{
System.out.println("fu method_1");
}
void method2()
{
System.out.println("fu method_2");
}
static void method4()
{
System.out.println("fu method_4");
}
}
class Zi extends Fu
{
static int num = 8;
void method1()
{
System.out.println("zi method_1");
}
void method3()
{
System.out.println("zi method_3");
}
static void method4()
{
System.out.println("zi method_4");
}
}
class DuoTaiDemo4
{
public static void main(String[] args)
{
Fu f = new Zi();
System.out.println(f.num);
f.method4(); //在多态中,静态成员函数看左
Zi z = new Zi();
z.method4();//非多态中,子类函数覆盖了父类函数
}
}
/*
运行结果:
5
fu method_4
zi method_4
*/
class Fu
{
static int num = 5;
void method1()
{
System.out.println("fu method_1");
}
void method2()
{
System.out.println("fu method_2");
}
// static void method4()
// {
// System.out.println("fu method_4");
// }
}
class Zi extends Fu
{
static int num = 8;
void method1()
{
System.out.println("zi method_1");
}
void method3()
{
System.out.println("zi method_3");
}
static void method4()
{
System.out.println("zi method_4");
}
}
class TestDemo0
{
public static void main(String[] args)
{
Fu f = new Zi();
System.out.println(f.num);
f.method4(); //在多态中,静态成员函数看左
Zi z = new Zi();
z.method4();//非多态中,子类函数覆盖了父类函数
}
}
/*
Exception in thread "main" java.lang.Error: 无法解析的编译问题:
没有为类型 Fu 定义方法 method4()
*/
class Fu
{
static int num = 5;
void method1()
{
System.out.println("fu method_1");
}
void method2()
{
System.out.println("fu method_2");
}
static void method4()
{
System.out.println("fu method_4");
}
}
class Zi extends Fu
{
static int num = 8;
void method1()
{
System.out.println("zi method_1");
}
void method3()
{
System.out.println("zi method_3");
}
// static void method4()
// {
// System.out.println("zi method_4");
// }
}
class TestDemo0
{
public static void main(String[] args)
{
Fu f = new Zi();
System.out.println(f.num);
f.method4(); //在多态中,静态成员函数看左
Zi z = new Zi();
z.method4();//非多态中,子类函数覆盖了父类函数
}
}
/*
5
fu method_4
fu method_4
*/