继承

继承

把相同的内容给定义到一个独立的类中。 然后,让这多个类和这个独立的类产生一个关系,有了这个关系后, 这多个类就可以具备这个独立的类的功能。 为了实现这个效果,java就提供了一个技术:继承。

继承概述:

把多个类中相同的内容给提取出来定义到一个类中。

继承是面向对象的三大特征之一。

继承是类与类关系的一种。

从类与类关系的设计角度来,子类必须是父类的一种才可以使用继承。

如何实现继承呢?

Java提供了关键字:extends

格式:

class 子类名 extends 父类名 {}

好处: A:提高了代码的复用性 B:提高了代码的维护性 C:让类与类之间产生了关系,是多态的前提

类与类产生了关系,其实也是继承的一个弊端: 类的耦合性增强了。

开发的原则:低耦合,高内聚。 耦合:类与类的关系 内聚:就是自己完成某件事情的能力

Java中继承的特点:

A:Java只支持单继承,不支持多继承。一个类可以有多个子类,但只能有一个父类

B:Java支持多层继承(继承体系) ,不能循环继承。

继承后子父类成员的特点:

  • 子类可以拥有父类(除了构造方法以外)的所有成员:成员变量和成员方法

  • 子类可以直接访问父类非private修饰的成员:成员变量和成员方法

  • 子类可以定义自己特有的成员:成员变量和成员方法

  • 子类可以使用自己的方式实现父类的方法,即方法重写

  • 构造方法不能被子类继承,但是子类可以间接调用父类的构造方法。

继承的注意事项:

A:子类只能继承父类所有非私有的成员(成员方法和成员变量)

B:子类不能继承父类的构造方法,但是可以通过super关键字去访问父类构造方法。

C:不要为了部分功能而去继承

继承中成员变量的关系:

A:子类中的成员变量和父类中的成员变量名称不一样,这个太简单。

B:子类中的成员变量和父类中的成员变量名称一样,这个怎么玩呢?

在子类方法中访问一个变量的查找顺序:

​ a:在子类方法的局部范围找,有就使用

b:在子类的成员范围找,有就使用

c:在父类的成员范围找,有就使用

d:如果还找不到,就报错。

继承中成员方法的关系:

A:子类中的方法和父类中的方法声明不一样,这个太简单。

B:子类中的方法和父类中的方法声明一样,这个该怎么玩呢?

通过子类对象调用方法:

​ a:先找子类中,看有没有这个方法,有就使用

b:再看父类中,有没有这个方法,有就使用

c:如果没有就报错。

定义一个学生类:Student类(子类)
    // 成员变量:name,age
    // 成员方法:eat(),sleep()
    
    成员变量:score
    成员方法:study();
    
定义一个老师类:Teacher类(子类)
    // 成员变量:name,age
    // 成员方法:eat(),sleep();
    成员变量:salary
    成员成员:teach();

定义一个工人类:Worker类(子类)
    // 成员变量:name,age
    // 成员方法:eat(),sleep();

定义一个人类:Person类(父类或超类或基类)
    成员变量:name,age
    成员方法:eat(),sleep(),drink();
/**
 * 人类:父类
 */
public class Person {
    // 成员变量
    public String name;
    public int age;
    
    // 成员方法
    public void eat() {
        System.out.println("吃饭");
    }
    public void sleep() {
        System.out.println("睡觉");
    }
}

/**
 * 学生类:继承Person类,是Person类的子类
 */
public class Student extends Person{
    // 定义子类特有的成员变量和成员方法
    public double score;
    public void study() {
        System.out.println("好好学习,迎娶白富美");
    }
}

/**
 * 老师类:继承Person类  是Person类的子类
 *
 *
 */
public class Teacher extends Person {
    // 定义子类特有的成员变量和成员方法
    public double salary;
    public void teach() {
        System.out.println("好好上课");
    }
}

public class Demo01 {
    public static void main(String[] args) {
        // 创建学生对象
        Student stu = new Student();
        // 给成员变量赋值
        stu.name = "张三";
        stu.age = 23;
        stu.score = 100;
        System.out.println(stu.name+"="+stu.age);
        // 调用成员方法
        stu.eat();
        stu.sleep();
        // 调用子类特有方法
        stu.study();
        
        // 创建老师对象
        Teacher t = new Teacher();
        t.name = "小泽";
        t.age = 18;
        t.salary = 20000;
        System.out.println(t.name+"="+t.age);
        // 调用t的eat和sleep方法
        t.eat();
        t.sleep();
        // 调用子类特有方法
        t.teach();
    }
}

如果父类没有无参构造方法,那么子类的构造方法会出现什么现象呢?

报错。 如何解决呢?

A:在父类中加一个无参构造方法

B:通过使用super关键字去显示的调用父类的带参构造方法

C:子类通过this去调用本类的其他构造方法 子类中一定要有一个去访问了父类的构造方法,否则父类数据就没有初始化。

注意:如果类用 public 修饰,则类名必须与文件名相同。一个文件中只能有一个public 修饰的类。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值