继承的概念
什么是继承,如图:
实现继承的格式
继承带来的好处
示例代码
public class Fu {public void show() {System.out.println("show方法被调用");}
}
public class Zi extends Fu {public void method() {System.out.println("method方法被调用");}
}
public class Demo {public static void main(String[] args) {//创建对象,调用方法Fu f = new Fu();f.show();Zi z = new Zi();z.method();z.show();}
}
继承好处
提高了代码的复用性(多个类相同的成员可以放到同一个类中)
提高了代码的维护性
(如果方法的代码需要修改/增加,修改一处即可,可直接修改/增加父类中的成员变量)
继承弊端
继承是侵入性的
降低了代码的灵活性
解释:继承关系,导致子类必须拥有父类非私有的成员,让子类多了很多约束
继承让类与类之间产生了关系,类的耦合性增强了,当父类发生变化时子类实现也不得不跟着变化,削弱了子类的独立性
继承的应用场景:
Java中继承的特点
Java中类只支持单继承,不支持多继承(一个子类不能有多个父类)
Java中类支持多层继承
相当于:现在又A、B、C三个类,想要C继承A、B的属性,可以通过多层继承来实现
多层继承示例代码:
public class Granddad {public void drink() {System.out.println("爷爷爱喝酒");}}public class Father extends Granddad {public void smoke() {System.out.println("爸爸爱抽烟");}}public class Mother {public void dance() {System.out.println("妈妈爱跳舞");}}
public class Son extends Father {// 此时,Son类中就同时拥有drink方法以及smoke方法
}
在子类方法中访问一个变量,采用的是就近原则。
由于想在子类中实现对父类成员的调用,此时可以使用super关键字
对于super关键字的应用场景可以参考这篇文章:
super关键字什么时候使用?super的适用场景是?_super关键字用在什么场合_❀༊烟花易冷ღ࿐❀的博客-CSDN博客
在类与对象中我们学习了this关键字,一以下是关于两者的区别:
-this&super关键字:
this:代表本类对象的引用
super:代表父类存储空间的标识(可以理解为父类对象引用)
this和super的使用分别
构造方法:
this(…) - 访问本类构造方法
super(…) - 访问父类构造方法
注意:子类中所有的构造方法默认都会访问父类中无参的构造方法
子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化
原因在于,每一个子类构造方法(有参无参构造方法都是)的第一条语句默认都是:super()
问题:如果父类中没有无参构造方法,只有带参构造方法,该怎么办呢?
//1. 通过使用super关键字去显示的调用父类的带参构造方法//2. 子类通过this去调用本类的其他构造方法,本类其他构造方法再通过super去手动调用父类的带参的构造方法
在继承中,子类可以继承父类的所有成员,包括私有和非私有;但是子类只能访问父类中非私有的成员。(父子类间继承和访问不是一个概念)
通过子类对象访问一个方法
1、方法重写概念
2、方法重写的应用场景
3、Override注解
方法重写: 在继承体系中,子类出现了和父类中一模一样的方法声明(方法名一样,参数列表也必须一样)
方法重载: 同一个类中,方法名相同,参数列表不同,跟返回值无关
私有方法不能被重写(父类私有成员子类是不能继承的)
子类方法访问权限不能更低(public > 默认 > 私有)
3.静态方法不能被重写(父类和子类任何一个方法被static修饰都构不成重写)
当我们在做子类共性功能抽取时,有些方法在父类中并没有具体的体现,这个时候就需要抽象类了!
抽象类和抽象方法必须使用 abstract 关键字修饰
//抽象类的定义 public abstract class 类名 {}
//抽象方法的定义 public abstract void eat();
抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
抽象类不能实例化
抽象类可以有构造方法
抽象类的子类(以下两者只能选一个)
要么重写抽象类中的所有抽象方法
要么是抽象类
案例需求
定义猫类(Cat)和狗类(Dog)
猫类成员方法:eat(猫吃鱼)drink(喝水…)
狗类成员方法:eat(狗吃肉)drink(喝水…)
实现步骤
代码实现
public abstract class Animal {//提取猫类和狗类的共性drink()public void drink(){System.out.println("喝水");}//无参构造方法public Animal(){}//将不完全共性的eat()方法定义为抽象方法,以供子类进行独立重写public abstract void eat();
}
public class Cat extends Animal {//方法重写@Overridepublic void eat() {System.out.println("猫吃鱼");}
}
public class Dog extends Animal {//方法重写@Overridepublic void eat() {System.out.println("狗吃肉");}
}
public static void main(String[] args) {Dog d = new Dog();d.eat();d.drink();Cat c = new Cat();c.drink();c.eat();//Animal a = new Animal();//a.eat();}
设计模式
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
设计模式的意义:使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
模板设计模式
模板设计模式的优势
模板已经定义了通用结构,使用者只需要关心自己需要实现的功能即可
示例代码
模板类
/*作文模板类*/
public abstract class CompositionTemplate {public final void write(){System.out.println("<<我的爸爸>>");body();System.out.println("啊~ 这就是我的爸爸");}public abstract void body();
}
实现类A
public class Tom extends CompositionTemplate {@Overridepublic void body() {System.out.println("那是一个秋天, 风儿那么缠绵,记忆中, " +"那天爸爸骑车接我放学回家,我的脚卡在了自行车链当中, 爸爸蹬不动,他就站起来蹬...");}
}
实现类B
public class Tony extends CompositionTemplate {@Overridepublic void body() {}/*public void write(){}*/
}
测试类
public class Test {public static void main(String[] args) {Tom t = new Tom();t.write();}
}
fianl关键字的作用
final修饰类、方法、变量的效果
fianl修饰类:该类不能被继承(不能有子类,但是可以有父类)
final修饰方法:该方法不能被重写
final修饰变量:表明该变量是一个常量,不能再次赋值
变量是基本类型,不能改变的是值
变量是引用类型,不能改变的是地址值(引用关系固定了),但地址里面的内容是可以改变的
举例
public static void main(String[] args){final Student s = new Student(23);s = new Student(24); // 错误s.setAge(24); // 正确
}
本文发布于:2024-01-28 21:04:34,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170644708210270.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |