Java——多态中,成员函数、成员变量和静态成员函数的特点

在多态中成员函数的特点: 在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。

在运行时期:参阅对象所属的类中是否有调用的方法。 简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。

在多态中,成员变量的特点: 无论编译和运行,都参考左边(引用型变量所属的类)。

在多态中,静态成员函数的特点: 无论编译和运行,都参考做左边。

口诀:成员函数:编译看左,运行看右;成员变量,静态成员函数看左;

//多态中,成员函数编译看左,运行看右
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
*/

猜你喜欢

转载自blog.csdn.net/caigen0001/article/details/89854329