提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
一、今日回顾
1.《高等数学》:一节网课
2.阅读:《费马大定理》300页
3.英语:120个单词
二、编程的那些事
1.继承的描述
继承是面向对象三大特征之一。可以使得子类具有父类的属性和方法。还可以再子类中重新定义,追加属性和方法。继承是java程序设计的一项核心技术。
继承的模板(格式)
- public class 子类名extends父类名{}
注: extends是java中的一个关键字
public class Fu {
public void method(){
System.out.println("Fu method");
}
}
public class Zi extends Fu {
public void show(){
System.out.println("你好");
}
}
public class Demo {
public static void main(String[] args) {
//Fu f=new Fu();
Zi z=new Zi();
z.show();
z.method();
}
}
2.继承的优缺点
继承优点:
●提高了代码的复用性(多个类相同的成员可以放到同一个类中)
●提高了代码的维护性(如果方法的代码需要修改, 修改-处即可)
继承缺点:
●继承让类与类之间产生了关系,类的耦合性增强了,当父类发生变化时子类实现也不得不跟着变化,削弱了子类的独立性
什么时候使用继承?
●继承体现的关系: isa
●假设法:我有两个类A和B,如果他们满足A是B的一种,或者B是A的一种,就说明他们存在继承关系,这个时候就可以考虑
使用继承来体现,否则就不能滥用继承
● 举例:苹果和水果,猫和动物,猫和狗
3.继承的访问特点
先看例子:
public class Fu {
// 父类只定义一个age 成员变量
public int age=40;
}
//子类继承父类,定义一个变量,一个方法,方法里输出两个变量的值
//age是父类的成员变量,height是子类中的成员变量
public class Zi extends Fu {
public int height=175;
public void show(){
System.out.println(age);
System.out.println(height);
}
}
public class Demo {
public static void main(String[] args) {
//Fu f=new Fu();
Zi z=new Zi();
z.show();
}
}
之后,改一下子类中的代码,Fu类和Demo类保持不变。
public class Zi extends Fu {
public int height=175;
//子类加多了一个公有的成员变量age
public int age=20;
public void show(){
System.out.println(age);
System.out.println(height);
}
}
age的输出值变为了20,不再是40。再改动一下,改动如下:
public class Zi extends Fu {
public int height=175;
public int age=20;
public void show(){
//show方法里加了一个名为age局部成员变量
int age=30;
System.out.println(age);
System.out.println(height);
}
}
由此,可以得出继承中变量的访问特点
子类局部范围>子类成员范围>父类成员范围
注:如果在这些范围找不到,就会报错。
4.super关键字在继承中的使用
public class Fu {
// 父类只定义一个age 成员变量
public int age=40;
}
public class Zi extends Fu {
public int age=20;
public void show(){
int age=30;
System.out.println(age);
// 加入this.age输出的即是本类的成员变量
System.out.println(this.age);
// 加入super.age输出的即是本类的成员变量
System.out.println(super.age);
}
}
public class Demo {
public static void main(String[] args) {
Zi z=new Zi();
z.show();
}
}
小结:
- this:代表本类的引用(this关键字指向调用该方法的对象,一般我们是在当前类中使用this关键字,所以常说this代表本类的引用)
- super:代表父类存储空间的标识
注:有些人认为super与this引用是类似的概念,实际上,这样比较并不太恰当。这是因为super不是一个对象的引用,不能将super赋给另一个对象变量,它只是一个指示编译器调用超类方法的特殊关键字。
5.继承中构造方法的访问特点
public class Fu {
public Fu(){
System.out.println("Fu中无参构造方法被调用");
}
public Fu(int age){
System.out.println("Fu中带参构造方法被调用");
}
}
public class Zi extends Fu {
public Zi(){
System.out.println("Zi中无参构造方法被调用");
}
public Zi(int age){
System.out.println("Zi中带参构造方法被调用");
}
}
public class Demo {
public static void main(String[] args) {
Zi z=new Zi();
// Zi z2=new Zi(20);
}
}
问题1:为何创建Zi类对象调用Zi类无参构造的前面调用了Fu类的无参构造方法?(Fu类的无参构造方法为什么会被调用,且在Zi类无参构造的前面调用)
把代码中的注释取消,运行得到
继承中构造方法的访问特点
子类中所有的构造方法默认都会访问父类中无参的构造方法
为什么呢?
●因为子类会继承父类中的数据, 可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化
每一个子类构造方法的第一条语句默认都是: super()
如果父类中没有无参构造方法,只有带参构造方法,怎么办呢?
- 通过使用super关键字显示的调用父类的带参构造方法
- 在父类中自己提供一个无参构造方法
推荐:自己给出无参构造方法
67.继承中成员方法的访问特点
public class Fu {
public void show () {
//super.show();
System.out.println("Fu中show方法被调用");
}
}
public class Zi extends Fu {
public void method(){
System.out.println("Zi中method()方法被调用");
}
// public void show(){
// System.out.println("Zi中show()方法被调用");
// }
}
public class Demo {
public static void main(String[] args) {
Zi z=new Zi();
z.method();
z.show();
}
}
将Zi类中show方法中注释的代码取消掉,运行得
//在Zi类的show方法中加一个方法
super.show();
小结:继承中构造方法的访问特点
通过子类对象访问一个方法
子类成员范围>父类成员范围
注:如果没有,就会报错
7.方法重写
概述:子类中出现了和父类一模一样的方法声明
应用:
- 当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样既沿袭了父类的功能,有定义了子类特有的内容。
public class Phone {
public void call(String name){
System.out.println(name);
}
}
public class NewPhone extends Phone{ @Override public void call(String name) { super.call(name); System.out.println("重写方法,加入新的功能"); } }
public class PhoneDemo { public static void main(String[] args) { Phone p=new Phone(); p.call("book"); NewPhone newPhone=new NewPhone(); newPhone.call("glass"); } }
方法重写注意事项:
- 私有方法不能被重写(父类私有成员子类是不能被继承的)
- 子类方法访问权限不能更低(public>默认>私有)
总结
以上就是对于继承的理解,书写是为了更好的思考。