JAVA父类子类转化问题

1、可以用父类去声明子类对象

2、可以将父类对象强转为子类对象,前提是只有父类对象本身就是用子类new出来的时候, 才可以在将来被强制转换为子类对象

实例如下:

package hrx;

public class TestExtends {
	static class A {
		private int x = 1;
		private int y = 2;
	}
	static class B extends A{
		private int x = 2;
		private int y = 4;
	}
	public static void main(String[] args) {
		A a = new A();
		B b = new B();
		b = (B) a;
		System.out.println(b.x);
	}
}

会出现如下报错:

正确做法:

package hrx;

public class TestExtends {
	static class A {
		private int x = 1;
		private int y = 2;
	}
	static class B extends A{
		private int x = 2;
		private int y = 4;
	}
	public static void main(String[] args) {
		A a = new B();
		B b = new B();
		b = (B) a;
		System.out.println(b.x);
	}
}

结果如下:

那么再来考虑一下,用父类声明的子类对象,到底是父类还是子类,看下边实例:

package hrx;

public class TestExtends {
	static class A {
		private int x = 1;
		private int y = 2;
		public void print(){
			System.out.println("I am A");
		}
	}
	static class B extends A{
		private int x = 2;
		private int y = 4;
		public void print(){
			System.out.println("I am B");
		}
	}
	public static void main(String[] args) {
		A a = new B();
		System.out.println(a.x);
		a.print();
	}
}

结果如下:

到这里相比大家已经明白,用父类声明的子类,变量不会被覆盖,而方法会被覆盖,这是因为,基本数据类型采用的是值传递,因而不会将父类的变量的值覆盖,而方法采用的是引用传递,因此会覆盖,java的参数传递详见:java参数传递详解 

猜你喜欢

转载自blog.csdn.net/qq_39429962/article/details/83472661