Java学习笔记_11 final、super、向上造型
final
经典面试题1:final关键字的特点?
final修饰的变量:不能被更改。
final修饰的方法:不能被重写。
final修饰的类:不能被继承。
static final 配合修饰常量。
经典面试题2:String类能不能被继承?
不能。String类被final修饰的。
package day11_9;
public class FinalDemo {
final static int a = 1;// static final 配合修饰常量。
public static void main(String[] args) {
FinalDemo f = new FinalDemo();
System.out.println(a);
//f.a = 2;//不注释会报错,因为a为final类型,无法被更改。
}
}
运行 结果:
1
super
super指代父类的对象。
super方法,可以调用父类的构造方法,根据super方法的参数列表确定具体调用哪一个构造方法
经典面试题:
问:this()和super()可不可以同时出现?
不能。因为this()和super()都必须放在构造方法的第一行。有冲突,二者不能同时出现。
向上造型:父类声明子类对象。
子类的对象可以向上造型为父类的类型。即父类引用子类对象,这种方式被称为向上造型。
父类声明子类对象:ex:Father s = new Son();
该对象(S)拥有的属性和方法都是父类的。但是当调用子类重写父类的方法时,编译期间执行的是父类的方法,运行期间执行的是子类的方法。
这是因为:
向上造型后 ,子类将不再具备其自己定义的方法,只有父类的方法。但若重写了父类的方法,向上造型的对象的方法为重写后新的方法。
Father s = new Son();
注意:在new Son()的时候由于继承关系,new关键字调用Son的构造方法( Son() ),Son()先后分别打印了
这是父类的有参构造方法
这是子类的无参构造方法
下面:当调用子类重写父类的方法时(子类、父类中都有一个work方法),编译期间执行的是父类的方法,运行期间执行的是子类的方法:
Father s = new Son();
s.work();//重写了父类work(),s的方法就为重写后新的方法。
运行结果:
这是父类的有参构造方法
这是子类的无参构造方法
儿子的工作是快乐长大
下面加入:
Father d;
d = new Daughter();
输出多出:
这是父类的构造方法
下面加入:
Son s1 = new Son();
Son s2 = new Son();
Daughter d1 = new Daughter();
Daughter d2 = new Daughter();
输出多出:
这是父类的有参构造方法
这是子类的无参构造方法
这是父类的有参构造方法
这是子类的无参构造方法
这是父类的构造方法
这是父类的构造方法
向上造型的意义:
为了以后写代码时拓展方便,以后万一还有别的子类,我们需要改的地方就少了。
完整代码:
Father:
package day11_9;
public class Father {
String name;
int age;
public Father(){
System.out.println("这是父类的构造方法");
}
public Father(String name, int age) {
super();//调用Object中的构造方法
this.name = name;
this.age = age;
System.out.println("这是父类的有参构造方法");
}
public void work(){
System.out.println("父亲的工作是挣钱养家");
}
}
Son:
package day11_9;
public class Son extends Father {
char sex;
public Son(){
super("小明",8);//给父类赋值
//super();//隐藏的,默认存在
System.out.println("这是子类的无参构造方法");
}
public void work(){
super.age = 49;//只要调用了这个构造方法,Father的age就会被更改为49
System.out.println("儿子的工作是快乐长大");
}
}
Daughter:
package day11_9;
public class Daughter extends Father {
char sex;
String happy;
public void work(){
System.out.println("美美的长大");
}
public void interesting(){
System.out.println("喜欢跳舞、画画");
}
}
Test:
package day11_9;
public class Test {
public static void main(String[] args) {
//使用向上造型的方式创建对象
Father s = new Son();
//new关键字调用son的构造方法(创建对象、传值),创建son的对象。赋值给了Father。
s.work();
//s.age = 18;
System.out.println(s.age);//上面调用work()构造方法时,Son中的super.age = 49;改变了Father的age
Father d;
d = new Daughter();
Son s1 = new Son();
Son s2 = new Son();
Father d1 = new Daughter();
Daughter d2 = new Daughter();
Father [] fs = {s1,s2,d1,d2};
/**
* 飞机大战:
* 敌机(父类):小型敌机(子类)、奖励型敌机(子类)、Boss机(子类)
*
* 父类[] f;
* 对f的长度扩容1个单位。
* 把生成的子类敌机放在数组的最后一个元素的位置。
*/
}
}
输出结果:
这是父类的有参构造方法
这是子类的无参构造方法
儿子的工作是快乐长大
49
这是父类的构造方法
这是父类的有参构造方法
这是子类的无参构造方法
这是父类的有参构造方法
这是子类的无参构造方法
这是父类的构造方法
这是父类的构造方法
个人学习笔记,若有误还望不吝赐教。
本文地址:https://blog.csdn.net/qq_45909299/article/details/109633337
上一篇: 使用AngularJS2中的指令实现按钮的切换效果
下一篇: 特朗普推特账号被永久封停