- 面向对象知识链接汇总,知识点体系(思维导图)
- Java面向对象(第一天)类,对象,方法的重载,练习题
- Java面向对象(第二天)构造方法,this关键字,内存结构初识,null,NullPointerException,引用类型数组(上),拓展,练习题
- Java面向对象(第三天)引用类型数组(下),继承,super,向上造型(上),拓展,练习题
- Java面向对象(第四天)向上造型(下),重写,访问控制修饰符,static关键字,拓展,练习题
- Java面向对象(第五天)final,static final,abstract关键字(抽象方法,抽象类)
- Java面向对象(第六天)成员内部类(不经常使用),匿名内部类(经常使用)
- Java面向对象(第五天)接口,拓展(类与接口的关系,抽象类与接口的区别),练习题
- Java面向对象(第八天)多态(对象的多态,行为的多态),拓展(面向对象)
- Java面向对象(第九天)简单的内存结构,面向对象三大特征
- Java新手小白入门篇系列持续更新中…
文章目录
一、引用类型数组(下)
1. 知识点概括
二、继承
1. 概念
继承是一种利用已有的类快速创建新的类的一种机制,新的类能够吸收已有类的属性和行为,并进行新的扩展
2. 特点
- 作用:代码复用
- 使用 extends 关键字来表示继承关系
- 概念
- 超类/父类:共有的属性和行为
- 代码复用
- 为所有派生类提供了统一的类型(向上造型)
- 派生类/子类:特有的属性和行为
- 超类/父类:共有的属性和行为
- 一个父类可以有多个子类,但是一个子类只能有一个父类
- Java只支持单一继承(类与类之间)
- 继承具有传递性(爷爷、儿子、孙子这样的关系)
- 继承多用于功能上的修改,子类可以在拥有父类功能的同时,进行功能拓展
- 继承是 is a 的关系
- 子类构造方法会自动调用父类的无参构造方法,相当于子类构造方法中默认有一个super()【下面会说super】
- 子类不能继承父类私有的属性(成员变量)和行为(方法)【没学到,暂时不需要掌握】
3. 继承入门案例
public class ExtendsDemo {
public static void main(String[] args) {
// 父类只能调用父类的属性和方法
Person p = new Person();
p.name = "zs";
p.age = 20;
p.address = "沈阳";
p.eat();
// 子类不只是能调用父类的属性和方法,还能调用子类本身特有的属性和方法 (如 stuId 和 study)
Student s = new Student();
s.stuId = "JSD2207080101";
s.name = "zs";
s.age = 20;
s.address = "沈阳";
s.study();
}
}
/**
* 1) 一个父类只能有一个子类 Person 有两个子类 (Student/Teacher,除此之外还能被其他的类所继承)
*/
public class Person {
String name;
int age;
String address;
void eat() {
System.out.println("干饭人干饭魂,干饭都是人上人");
}
}
/**
* 1) 我们通过extends简历了子类与父类的继承关系 格式:(子类 extends 父类)
* 2) Java单一继承,只能有一个父类 ( Student extends Person 不能再继承其他的类了 )
*/
public class Student extends Person{
String stuId;
void study() {
System.out.println("学编程好前程,好好撸代码");
}
}
public class Teacher extends Person{
double salary;
void teach() {
System.out.println("编程的真谛:Ctrl+C/Ctrl+V");
}
}
三、super 关键字
这里我们可以将 super 当做父类的对象
Father super = new Father();
1. super 的用法
- super.成员变量
- 当父类的成员变量与子类的成员变量同名时,可以通过super指定父类的成员变量(不常用)
- super.方法名()
- super()
- 调用父类的构造方法
2. super() 的用法
- super()
- 调用父类的无参构造
- super(参数)
- 调用父类的有参构造 – 对应参数的构造方法
注意:在构造方法里,必须放在子类构造方法的第一行
public class SuperDemo {
public static void main(String[] args) {
Student s = new Student();
}
}
public class Person {
String name;
int age;
String address;
Person() {
System.out.println("父类的构造方法");
}
void eat() {
System.out.println("干饭人干饭魂,干饭都是人上人");
}
}
public class Student extends Person{
String stuId;
Student() {
// super(); 相当于Student构造方法的这个位置调用了一个隐式的父类无参构造
System.out.println("子类的构造方法");
}
void study() {
System.out.println("学编程好前程,好好撸代码");
}
}
那么问题就随之而来了,如果我们父类中没有无参构造了,子类怎么办???
public class Person {
String name;
int age;
String address;
Person(String name,int age,String address) {
this.name = name;
this.age = age;
this.address =address;
}
void eat() {
System.out.println("干饭人干饭魂,干饭都是人上人");
}
}
public class Student extends Person{
String stuId;
Student(String name,int age,String address,String stuId) {
// super(name,age,address); // 编译报错,取消注释既可解决问题
this.stuId = stuId;
}
void study() {
System.out.println("学编程好前程,好好撸代码");
}
}
四、向上造型(上)
父类的引用指向子类的对象
规定:向上造型后,能点出来谁看引用的类型
例子如下图所示:
public class Demo {
public static void main(String[] args) {
// 向上造型
//父类的 引用 指向 子类的对象
Person ps = new Student();
// 向上造型能 . 出来谁看引用(ps)的类型
// ps的类型为Person,ps能 . 出来的就是Person的属性和方法
ps.name = "zs";
ps.age = 20;
ps.address = "沈阳";
ps.eat();
System.out.println("==========================");
// 声明了一个Person类型的引用p指向Person对象
// 只能调用自己的属性和方法
Person p = new Person();
p.name = "zs";
p.age = 20;
p.address = "沈阳";
p.eat();
System.out.println("==========================");
// 子类既能调用父类共有的属性和方法,也能调用自己独有的属性和方法
Student s = new Student();
s.name = "zs";
s.age = 20;
s.address = "沈阳";
s.eat();
s.stuId = "JSD2207080101";
s.study();
}
}
public class Person {
String name;
int age;
String address;
void eat() {
System.out.println("干饭人干饭魂,干饭都是人上人");
}
}
public class Student extends Person{
String stuId;
void study() {
System.out.println("学编程好前程,好好撸代码");
}
}
多种角色能干的事都一样的时候,可以将多种角色统一造型到超类数组中,实现代码复用
例子如下图所示:
public class Demo {
public static void main(String[] args) {
Person[] ps = new Person[3];
ps[0] = new Student("JSD2207080101","zs",18,"沈阳");
ps[1] = new Student("JSD2207080102","ls",20,"大连");
ps[2] = new Teacher("ww",20,"大连",8800);
for (int i = 0; i < ps.length; i++) {
Person p = ps[i];
p.eat();
}
}
}
public class Person {
String name;
int age;
String address;
public Person(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
void eat() {
System.out.println(name + "都" + age + "岁了,天天" + address + "家里蹲,就是干饭,就是炫");
}
}
public class Student extends Person{
String stuId;
public Student(String stuId,String name, int age, String address) {
super(name, age, address);
this.stuId = stuId;
}
void study() {
System.out.println("学编程好前程,好好撸代码");
}
}
public class Teacher extends Person{
double salary;
public Teacher(String name, int age, String address,double salary) {
super(name, age, address);
this.salary = salary;
}
void teach() {
System.out.println("编程的真谛:Ctrl+C/Ctrl+V");
}
}
五、拓展
1. this 和 super的区别
六、练习题
1. 习题
1.1 继承练习题
应用知识点:
- 创建类
- 构造方法(有参/无参)
- 继承,super的使用
- 引用类型数组
- 向上造型
注意:重要事情说三遍 – 多些注释,多思考!!! 多些注释,多思考!!! 多些注释,多思考!!!
1. 练习题1:
- 创建一个Person类
- 成员变量 : name,age,address
- 方法 : eat (吃)
- xxx都xx岁了,天天xx家里蹲,就是干饭就是炫
- 创建一个Student类,继承Person类
- 成员变量 : 学号stuId
- 方法 : study (学习)
- 学编程好前程,好好撸代码
- 创建一个Teacher类,继承Person类
- 成员变量 : 工资salary
- 方法 : teach (教学)
- 编程的真谛:Ctrl+C/Ctrl+V
- 创建一个测试类: ExtendsDemo
- 创建一个人类数组对象,包含3个元素
- 为人类数组中每个元素赋值:分别为2个学生,1个老师
- 打印出对象中各个属性的值,和所有能调用的方法
可能纠结的地方,可能出错的地方
- 构造方法怎么写
- 写有参构造方法还是写无参构造方法(皆可)
- 里面做赋值操作还是不做赋值操作
- 赋值操作
- 如何赋值
- 写死
- 写活
- 如何赋值
- 赋值操作
- 测试类中为什么写东西报错
- 查看是否写了main方法
- 思考为什么有些可以写在类里方法外,有些只能写在类里
- super如何使用
- 为什么报错(super如何写)
- 写super报错
- 不写super也报错
- 为什么报错(super如何写)
2. 答案
2.1 继承练习题
1. 练习题1:
- 创建一个Person类
- 成员变量 : name,age,address
- 方法 : eat (吃)
- xxx都xx岁了,天天xx家里蹲,就是干饭就是炫
- 创建一个Student类,继承Person类
- 成员变量 : 学号stuId
- 方法 : study (学习)
- 学编程好前程,好好撸代码
- 创建一个Teacher类,继承Person类
- 成员变量 : 工资salary
- 方法 : teach (教学)
- 编程的真谛:Ctrl+C/Ctrl+V
- 创建一个测试类: ExtendsDemo
- 创建一个人类数组对象,包含3个元素
- 为人类数组中每个元素赋值:分别为2个学生,1个老师
- 打印出对象中各个属性的值,和所有能调用的方法
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/107640.html