文章目录
- 297. super基本语法
- 297.1 基本介绍
- 297.2 基本语法
- 298. super使用细节1
- 299. super使用细节2
- 300. super使用细节3
- 301. 方法重写介绍
- 302. 方法重写细节
- 303. 重写课堂练习1
- 304. 重写课堂练习2
- 输出结果: 姓名:田所浩二 年龄:24
- 305. 养宠物引出多态
- 306. 方法的多态
- 307. 对象的多态
- 308. 多态快速入门
- 309. 向上转型
- 310. 向下转型
- 311. 属性重写问题
- 312. 多态课堂练习1
- 313. 多态课堂练习2
297. super基本语法
297.1 基本介绍
super 代表父类的引用,用于访问父类的属性、方法、构造器
297.2 基本语法
298. super使用细节1
- 调用父类的构造器的好处(分工明确,父类属性由父类初始化,子类的属性由子类初始化)
- 当子类中有和父类中的成员(属性和方法)重名时,为了访问父类的成员,必须通过super. 如果没有重名,使用super、this、直接访问是一样的效果。
子类父类成员和方法不重名,则直接调用:
属性也是遵循上述规则
299. super使用细节2
也就是说父类没有但是父类的父类有的成员,在这个子类中也能用super关键字访问。
300. super使用细节3
- super和this的比较
this和super放在首行只能二选一
301. 方法重写介绍
【注】这里的子类和父类不一定是“一层”的关系,有可能是A<-B<-C
JVM会就近调用子类的cry()方法
302. 方法重写细节
方法重写也叫方法覆盖,需要满足下面的条件
303. 重写课堂练习1
请对方法的重写和重载做一个比较
304. 重写课堂练习2
- 编写一个 Person 类,包括属性/private(name、age),构造器、方法 say(返回自我介绍的字符串)。
- 编写一个 Student 类,继承 Person 类,增加 id、score 属性/private,以及构造器,定义 say 方法(返回自我介绍的信息)。
- 在 main 中,分别创建 Person 和 Student 对象,调用 say 方法输出自我介绍
Person.java
package com.Marisa.overrideexe;
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//say输出个人信息
public void say(){
System.out.println("姓名:" + name);
System.out.println("年龄:" + age);
}
}
Student.java
package com.Marisa.overrideexe;
public class Student extends Person{
private int id;
private double score;
public Student(String name, int age, int id, double score) {
super(name, age);
this.id = id;
this.score = score;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
//say输出信息
public void say(){
super.say();
System.out.println("id:" + id);
System.out.println("分数:" + score);
}
}
OverrideExercise.java
package com.Marisa.overrideexe;
import com.Marisa.overrideexe.Student;
public class OverrideExercise {
public static void main(String[] args) {
Person person = new Person("田所浩二", 24);
Student student = new Student("德川", 26, 114514, 114514.1919);
person.say();
System.out.println("==============");
student.say();
}
}
输出结果:
姓名:田所浩二
年龄:24
姓名:德川
年龄:26
id:114514
分数:114514.1919
305. 养宠物引出多态
传统方法写7个类:
如果再写猫喂鱼,又要重载一个方法,feed的类型越来越多,一直写重载,很繁琐,多态可以提高代码的复用性。
306. 方法的多态
方法或对象具有多种形态。是面向对象的第三大特征,多态是建立在封装和继承基础之上的。
307. 对象的多态
【注】也就是说,能够用一个父类的引用指向子类的对象。
Animal.java
package com.Marisa.objectpoly_;
public class Animal {
public void cry(){
System.out.println("动物在叫");
}
}
Cat.java
package com.Marisa.objectpoly_;
public class Cat extends Animal{
public void cry() {
System.out.println("Cat cry() ");
}
}
Dog.java
package com.Marisa.objectpoly_;
public class Dog extends Animal{
public void cry() {
System.out.println("Dog cry()");
}
}
PolyObject.java
package com.Marisa.objectpoly_;
public class PolyObject {
public static void main(String[] args) {
//多态的特点
Animal animal = new Dog();
animal.cry();//因为运行时,animal运行类型是Dog,所以cry就是Dog的cry
animal = new Cat();
animal.cry();
}
}
运行结果:
Dog cry()
Cat cry()
308. 多态快速入门
利用多态的机制,父类的引用可以指向子类
309. 向上转型
多态的前提是:两个对象(类)存在继承关系
多态的向上转型
310. 向下转型
311. 属性重写问题
312. 多态课堂练习1
313. 多态课堂练习2
s和b都是引用,都指向同一个地址
this是先就近查找,如果没用再查父类