Father father = new Son();
时间: 2023-12-10 12:02:48 浏览: 45
这段代码中,Father是一个类,Son是继承自Father的子类,这行代码创建了一个名为father的Father类型的变量,但是它实际上指向一个Son类型的实例。这种多态性的实现是Java中的一种特性,被称为向上转型。通过这种方式,我们可以灵活地使用不同的子类实例来代替父类实例,从而简化代码并增加可扩展性。
相关问题
读下面程序,写出程序运行结果。 class Father { int num1=0; public Father(){ System.out.println("num1:"+num1);} public Father(int num1){ this.num1=num1; System.out.println("num1:"+num1); } } class Son extends Father{ int num2=10; public Son(){System.out.println("num2:"+num2);} public Son(int i,int j){ super(i); num2=j; System.out.println( "num1:"+num1+",num2:"+num2); } } public class Demo{ public static void main(String []args){ Father father=new Father(); Son son=new Son(); Son son1=new Son(20,30); } }
程序运行结果如下:
```
num1:0
num1:0
num1:20
num2:10
num1:20,num2:30
```
解析:
1. 首先执行 `Father` 类的无参构造方法,输出 `num1:0`。
2. 接着执行 `Son` 类的无参构造方法,先隐式调用 `super()` 方法调用 `Father` 类的无参构造方法,输出 `num1:0`,然后输出 `num2:10`。
3. 最后执行 `Son` 类的有参构造方法,显式调用 `super(i)` 方法调用 `Father` 类的有参构造方法,输出 `num1:20`,然后输出 `num1:20,num2:30`。
List<? extends Father> list2 = new ArrayList<>(); 要怎么赋值
List<? extends Father> list2 = new ArrayList<>();
这里的通配符表示这个 List 中的元素可以是 Father 或 Father 的子类,但具体哪个子类是不确定的。
要赋值,可以通过以下方式:
1. 直接将一个已经存在的 List 赋值给 list2:
```
List<Son> sonList = new ArrayList<>();
list2 = sonList; // 此时 list2 中的元素类型将被确定为 Son,因为 sonList 中的元素类型是 Son
```
2. 创建一个新的 List,并将其赋值给 list2:
```
List<Son> sonList = new ArrayList<>();
List<? extends Father> newList = new ArrayList<>(sonList);
list2 = newList; // 此时 list2 中的元素类型将被确定为 Son,因为 newList 中的元素类型是 Son
```
需要注意的是,由于 list2 中的元素类型是不确定的,因此不能直接向其中添加元素,否则会出现编译错误。如果需要添加元素,可以使用 List<? super Son>,这样可以保证 List 中的元素类型是 Son 或者 Son 的父类。
阅读全文