天天看點

3 java 繼承與編譯情況 | 方法重寫 | 通過反射改變private變量值

public class Test{
	public static void main(String[] arge) throws Exception{
		Parent p = new Child();
		p.output();
	 }

 }
class Parent{
	public void output() throws NullPointerException{
		System.out.println("parent");	
 	}
 }
class Child extends Parent
{
	public void output() throws Exception{
		System.out.println("child");
	 }
 }
           

1,程式是否能編譯通過?

2,如果能編譯通過,程式輸出什麼?

程式無法通過編譯。

關于java中的方法重寫 override?

1,子類的方法與父類的方法有相同的傳回類型,相同的方法名,相同的參數清單。

2,子類的方法的通路級别不能低于父類中該方法的通路級别。

3,子類中方法抛出的異常範圍不能大于父類中方法抛出的異常的範圍。

-----------------------

通過反射改變private變量值

public class PrivateTest{
	private String name = "hello";
	public String getName(){
		return name;
	 }
 }
           

以上程式可否改變 那麼值?

可以,通過反射。

擷取某個類的對應的Class對象的方式?

1,通過類的.class文法

2,通過類的對象的getClass()方法

3,通過Class對象的forName()方法

4,對于包裝類(8種基本資料類型的包裝類),可以通過.TYPE文法方式

實作

import java.lang.reflect.Field;
public class ReflectionTest{
	public static void main(String[] arge) throws Exception{
		PrivateTest pt = new PrivateTest();

		Class<?> class = PrivateTest.class;
		Field field = class.getDeclaredField("name");
		field.setAccessible(true);
		field.set(pt, "world");
		System.out.println(pt.getName());
	 }
 }