这周末的作业是关于多态和继承的,做的发现自己对多态和继承的细节还是有些掌握的不是非常好。
习题如下:
public class Test {
public static void main(String[] args) {
Integer[] list1 = {12, 24, 55, 1};
Double[] list2 = {12.4, 24.0, 55.2, 1.0};
int[] list3 = {1, 2, 3};
printArray(list1);
printArray(list2);
// Integer 和 Double 是继承了 Object 的两个类, 而 int 是 java 基本类型, 和 Object 没有继承关系
// printArray(list3);
}
//这里要求传入的参数必须是 Object类型的数组
//根据java的自动转型可知, 这里除了 Object类型 , 还可以使用继承了 Object的子类
public static void printArray(Object[] list) {
for (Object o: list) {
System.out.println(o + " ");
}
System.out.println();
}
}
public class Test1 {
public static void main(String[] args) {
new Person().printPerson();
//由于Student没有printPerson()方法, 所以自动向上转型为Person类
//从而调用Person类中的printPerson()方法
//Person类中的getInfo()方法由于子类完成了重写, 所以使用的是子类的getInfo()
// ==> ((Person)new Student()).printPerson();
new Student().printPerson();
}
}
//子类
class Student extends Person{
//此处重写了父类的getInfo()方法
@Override
public String getInfo() {
return "Student";
}
}
//父类
class Person {
public String getInfo() {
return "Person";
}
public void printPerson() {
System.out.println(getInfo());
}
}
public class Test2 {
public static void main(String[] args) {
new Person().printPerson();
new Student().printPerson();
}
}
class Student extends Person {
//private修饰的方法不能重写
//所以并不会调用Student的getInfo()方法
private String getInfo() {
return "Student";
}
}
class Person {
private String getInfo() {
return "Person";
}
//由于是转型后调用, 运行类型已经是Person, 所以可以访问Person的私有属性和方法
public void printPerson() {
System.out.println(getInfo());
}
}
public class Test {
public static void main(String[] args) {
A a = new A(5); //调用 A的构造器
}
}
class A extends B {
public A(int t) { //
//由于继承了B类, 必须完成B的构造方法,
//而B的构造方法是无参构造, 所以等于这里隐式的调用了B的构造方法
//super();
System.out.println("A's constructor is invoked");
}
}
class B {
public B(){
//B是默认继承Object的,所以也调用了Object的无参构造器
System.out.println("B's constructor is invoked");
}
}
对于多态和继承的细节掌握的还不够好,注释不够好的地方等之后学习更多了再做修改。