1.继承
1.什么是继承
继承就是子类继承父类的一些属性和方法,继承后在子类中可以调用父类的方法以及访问父类的属性
2.继承的语法格式
【修饰符列表】 class 类名 extends 父类名{
}
3.继承的作用
继承的基本作用是代码复用,但是继承最重要的作用是有了“继承”才有后面的方法覆盖与多态
4.继承的范围
- 除了私有属性不支持继承,构造函数不支持继承,其他所有数据都支持继承。
- 虽然Java中只支持单继承,但是一个类可以间接继承其他类【比如A继承B,B继承C,那么A直接继承B,间接继承C】
- Java所有类都默认继承JavaSE库中提供的java.lang.Object类
5.继承实例演示
比较下面两个代码的不同之处
代码1:
//父类
public class School2 {
static String name="春晖中学";
private String xiaozhang;
public int add(){
return 1;
}
}
//子类
class School2Text{
public static void main(String[] args) {
//创建一个School2Text对象
School2Text tea=new School2Text();
//调用School2的add()方法
System.out.println(tea.add());//显然这是不行的,因为School2Text没有这个方法
//访问School2Text的name属性
System.out.println(tea.name);//显然这也是不行的,因为School2Text没有这个属性
}
}
将School2Text继承School2
代码2:
//父类
public class School2 {
static String name="春晖中学";
private String xiaozhang;
public int add(){
return 1;
}
}
//子类
class School2Text extends School2{//继承School2
public static void main(String[] args) {
//创建一个School2Text对象
School2Text tea=new School2Text();
//调用School2的add()方法
System.out.println(tea.add());//1
//访问School2Text的name属性
System.out.println(tea.name);//春晖中学
}
}
6.注意:
继承严格上来说不能继承父类的私有属性,但是可以通过get与set访问访问父类的私有属性,简单的说就是如果你的子类属性和父类属性一致,那么不需要再子类中再定义属性,只需要调用父类的get与set方法就就可以使你的子类对象也拥有父类的属性,看看下面的例子
//父类(银行系统)
class InHeritText{
private int age;//开户时间
private String name ;//用户名字
private int num;//用户余额
private int test;//用户信誉额度
static String khh="中国农业银行";//开户行
//开户时间——>set、get
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//用户名字——>set、get
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//用户余额——>set、get
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
//用户信誉额度——>set、get
public int getTest() {
return test;
}
public void setTest(int test) {
this.test = test;
}
}
//子类(用户账户)
public class InHerit extends InHeritText{
public static void main(String[] args) {
//创建一个用户(子类)
InHerit user1=new InHerit();
//调用银行系统的setAge方法为user1用户注册开户时间
user1.setAge(2022);
//输出开户时间
System.out.println(user1.getAge());//可以看到我们的子类并没有age属性,但是也可以为其赋值
}
}
2.方法覆盖
1.什么是方法覆盖
当父类中的方法无法满足子类的需求时,子类可以在自己类中对该方法进行重写,这个重写的过程叫方法覆盖【简单的说方法覆盖就是对方法的重写,重写后的方法会覆盖父类的方法,所以子类对象在调用时候调用的是自己的方法】
2.方法覆盖的要求
在有继承的两个类中,方法覆盖要求重写的方法必须与原方法一模一样,{}里面的Java语句除外
3.方法覆盖与方法重写的区别
前面我们说过,方法重载是当在同一个类中定义多个同名的方法,但这些方法具有不同的参数类型或者参数个数不同,以满足多个方法功能相似时候,可以调用同一个方法满足所有的业务需求,而方法覆盖是在不同的类定义相同的方法,当父类的方法无法满足子类的业务需求时候进行的,我们来看看下面的代码更好的了解两者的不同
public class schol {
//这是方法重载
public static int add(int a,int b){
int A=a+b;
return A;
}
public static double add(double a,double b){
double A=a+b;
return A;
}
}
class ool extends schol{
//因为这个类继承了上面的类,所以这个类的对象可以调用上面的方法
//但是现在我们的需求发生变化,上面的add方法无法满足我们的减法需求,进行方法重写
public static int add(int a,int b){
int A=a-b;
return A;
}
}
//测试
class CeShi{
public static void main(String[] args) {
ool ool1=new ool();
System.out.println( ool1.add(12,10));//2
//可以看到重写后的方法就不再执行上面的加法操作
}
}
4.方法覆盖实例
通过上面的代码我们大体可以明白方法覆盖的大概用法,下面写一个更直观的实例加深大家的印象
//班级类
public class FuGai {
public void some(){
System.out.println("所有班级都在读书");
}
}
//101班继承班级类
class Fg101 extends FuGai{
}
//102继承班级类
class FG102 extends FuGai{
}
//测试类
class FuGai2{
public static void main(String[] args) {
FuGai Stu=new FuGai();
Stu.some();//所有班级都在读书
Fg101 Stu2=new Fg101();
Stu2.some();//所有班级都在读书
FG102 Stu3=new FG102();
Stu3.some();//所有班级都在读书
//可以看到所有的输出都是一样的,但是每个班的活动是不同的,那么就有必要进行方法重写
}
}
把代码更改为下面的代码:
//班级类
public class FuGai {
public void some(){
System.out.println("所有班级都在读书");
}
}
//101班继承班级类
class Fg101 extends FuGai{
//101班在唱歌,这里进行方法重写
public void some(){
System.out.println("101班在唱歌");
}
}
//102继承班级类
class FG102 extends FuGai{
//102班在跳舞,这里进行方法重写
public void some(){
System.out.println("102班在跳舞");
}
}
//测试类
class FuGai2{
public static void main(String[] args) {
FuGai Stu=new FuGai();
Stu.some();//所有班级都在读书
Fg101 Stu2=new Fg101();
Stu2.some();//101班在唱歌
FG102 Stu3=new FG102();
Stu3.some();//102班在跳舞
//此时不同的班级对象就有了各自的动作
}
}