这里写自定义目录标题
- 第12章 继承(二)
- 04 多态
- 05 final修饰符
- 06 子类对象实例化过程
第12章 继承(二)
04 多态
多态是指:执行同一个方法却产生不同的行为。
- 例一
package com.day101;
class Animal {
public String say() {
return "不知道";
}
}
class Cat extends Animal {
public String say() {
return "喵喵喵";
}
}
public class Day107 {
public static void main(String[] args) {
//父类型的变量可以引用子类型的对象
Animal a = new Cat();
Animal[] animals = {new Cat(),new Animal()};
for (int i = 0; i < animals.length; i++) {
System.out.println(animals[i].say());
}
//喵喵喵
//不知道
}
}
2. 例二
package com.day101;
class Animal {
public String say() {
return "不知道";
}
}
class Cat extends Animal {
public String say() {
return "喵喵喵";
}
}
class Dog extends Animal {
public String say(){
return "汪汪汪";
}
}
public class Day107 {
public static void main(String[] args) {
//父类型的变量可以引用子类型的对象
Animal a = new Cat();
Animal[] animals = {new Cat(),new Dog(), new Animal()};
for (int i = 0; i < animals.length; i++) {
System.out.println(animals[i].say());
}
//喵喵喵
//汪汪汪
//不知道
}
}
- 例三:
package com.day1073;
class Animal{
public String say(){
return "不知道";
}
}
class Ca extends Animal{
public String say(){
return "喵喵喵";
}
}
class Dog extends Animal {
public String say() {
return "汪汪汪";
}
public void f() {
System.out.println("f()");
}
}
public class Day1073 {
public static void main(String[] args) {
//调有实际引有的对象的方法
Animal a1 = new Animal();
System.out.println(a1.say());//不知道
Animal a2 = new Dog();
//调有实际引有的对象的方法
System.out.println(a2.say());//汪汪汪
// //a2的变量类型是Animal,所以它只能看到Animal类的方法。
// a2.f();//编译错误,编译时看变量的类型
//向下类型转换(大转小)
Dog dd = (Dog)a2;
dd.f();
}
}
tips:
4) 例4
运地时错误
05 final修饰符
- 被final修饰的类不能被继承
例:
Ctrl+Shift +T
查看源码,可见String是被final修饰的。
- 被final修饰的方法不能被重写。
class Animal {
public final String say() {
return "不知道";
}
}
class Cat extends Animal {
public String say() { //编译错误
return "喵喵喵";
}
}
3 .被final修饰的变量不能被修改
- 被final修饰的参数不能被修改。
public class Day108 {
public void f(final int a) {
a = 10;//编译错误,被 final修饰的参数不能被修改。
}
}
另:
调用实例方法,必须要有对象
如下:
那么,修改一下,如:
06 子类对象实例化过程
- 例一
(1)
tips:
创建构造器
Shift+Alt+s ->Generate Constructors from Superclass…
(2)再给一个getter和setter
(3)创建一个Dog类,继承于Animal类,并给个getter和setter,然后给个构造器。
运行:
- 小结:
(1)在Java类中使用super来调用父类的指定操作:super可以用于访问父类中定义的非私有属性。
(2)子类可以声明和超类同名的字段,这将导致隐藏其超类的字段,可以使用super关键字来访问超类的字段。
例如:
class Animal {
public String name;
public Animal() {
super(); //写不写都一样,不写也会调用父类的默认构造器
this.name = "defaultName";
System.out.println("Animal()");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class Dog extends Animal {
private String voice;
public String name;
public String getVoice() {
return voice;
}
public void setVoice(String voice) {
this.voice = voice;
}
public Dog() {
super();//super();写不写都一样,不写也会调用父类的默认构造器
this.voice= "汪汪汪";
System.out.println("Dog()");
System.out.println(name);//这里的name等同于this.name,是一样的。
System.out.println(super.name);
}
}
public class Day111 {
public static void main(String[] args){
Dog d = new Dog();//创建两个对象
}
}
(3)super可以用于调用父类中定义的非私有成员方法,super可以在子类中调用父类的非私有的构造器。
(4)当子类父类出同名成员(变量和方法),可以使用super进行区分。
(5)this代表当前对象,super代表父类的对象。
***练习
- 编写一个Person类,包括属(name,age),构造器,方法say(返回自我介绍的字符串)。
编写一个student类,继承Person类,增加id,score属性,以衣构造器,并覆盖say方法。
编写Test类,创建Peron和Student对象,调用say方法输出自我介绍。