文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java继承的知识点有哪些

2023-06-29 08:52

关注

今天小编给大家分享一下Java继承的知识点有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

继承

继承的介绍

继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。描述的是事物之间的所属关系,这种关系是:is-a 的关系。

继承:就是子类继承父类的属性和行为,使得子类对象(实例)可以直接具有与父类相同的属性、相同的行为。子类可以直接访问父类中的非私有的属性和行为。

生活中的继承

Java继承的知识点有哪些

兔子和长颈鹿属于食草动物类,老虎和狮子属于食肉动物类。而食草动物和食肉动物又是属于动物类。

那是不是兔子、长颈鹿、老虎、狮子都属于动物类呢?答案是没错滴!虽然食草动物和食肉动物都是属于动物,但是两者的属性和行为上有差别,所以子类会具有父类的一般特性也会具有自身的特性。我们就可以再多个类中存在相同属性和行为时,我们可以将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那一个类即可。

继承的好处

继承的格式

在Java当中会通过extends关键字可以申明一个类是从另外一个类继承而来的,一般形式如下:

class 父类 {
}

class 子类 extends 父类 {
}

需要注意一点: Java 不支持多继承,但支持多重继承。就如下:

class A {
}

class B extends A { (对的)
}

class C extends A, B { (错的)
}

class C extends B { (对的)
}

Java继承的知识点有哪些

顶层父类是Object类。所有的类默认继承Object,作为父类。

继承的demo

编写一个父类极其对应的子类信息

结构如下:

Java继承的知识点有哪些

代码如下:

父类Person:

package com.nz.pojo;public class Person {    private String name ;    private int age ;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }}

子类Student没有额外的属性和方法:

package com.nz.pojo;public class Student extends Person{}

子类Teacher多了一个工资的属性和独有的教书方法:

package com.nz.pojo;public class Teacher extends Person{    // 工资    private double salary ;    // 特有方法    public void teach(){        System.out.println("老师在认真教书!");    }    public double getSalary() {        return salary;    }    public void setSalary(double salary) {        this.salary = salary;    }}

编写测试代码:

package com.nz;import com.nz.pojo.Student;import com.nz.pojo.Teacher;public class InheritDemo {    public static void main(String[] args) {        Teacher teacher = new Teacher();        teacher.setName("最爱吃鱼罐头");        teacher.setAge(18);        teacher.setSalary(1999.99);        System.out.println(teacher.getName());        System.out.println(teacher.getAge());        System.out.println(teacher.getSalary());        teacher.teach();        Student student = new Student();        student.setName("罐头");        student.setAge(12);        //student.setSalary(1999.99); // student没有工资属性,报错!        System.out.println(student.getName());        System.out.println(student.getAge());    }}

结果如下:

最爱吃鱼罐头
18
1999.99
老师在认真教书!
罐头
12

从结果来看,子类继承父类,就可以直接得到父类的成员变量和方法。而子类可以编写一些特有的属性和方法,但是是否可以继承所有成分呢?

子类不能继承的内容

并不是父类的所有内容都可以给子类继承的:

super 与 this 关键字

这里先将这两个关键字,super和this在继承关系中,运用比较频繁。

super和this完整的用法如下:

this.成员变量 -- 本类的
super.成员变量 -- 父类的

this.成员方法名() -- 本类的
super.成员方法名() -- 父类的

package com.nz;public class InheritDemo2 {    public static void main(String[] args) {        Animal a = new Animal();        a.eat();        Cat cat = new Cat();        cat.eatFish();    }}class Animal {    void eat() {        System.out.println("animal : eat");    }}class Cat extends Animal {    void eat() {        System.out.println("cat : eat");    }    void eatFish() {        this.eat();   // this 调用自己的方法        super.eat();  // super 调用父类方法    }}

调用结果如下:

animal : eat
cat : eat
animal : eat

子类的每个构造方法中均有默认的super(),调用父类的空参构造。手动调用父类构造会覆盖默认的super()。

super() 和 this() 都必须是在构造方法的第一行,所以不能同时出现。

构造器不能被继承

package com.nz;public class InheritDemo3  {    public static void main(String[] args) {        System.out.println("------Teacher 类继承------");        Teacher teacher = new Teacher();        Teacher teacher2 = new Teacher("张三");        System.out.println("------Student 类继承------");        Student student = new Student();        Student student2 = new Student("张三三");    }}// 父类class Person {    private String name;    Person(){        System.out.println("调用了父类的无参构造器: Person()");    }    Person(String name) {        System.out.println("调用了父类的带参构造器: Person(String name)");        this.name = name;    }}// Teacher子类继承Personclass Teacher extends Person{    private String name;    Teacher(){        // 自动调用父类的无参数构造器 因为会有默认super();        System.out.println("Teacher");    }    public Teacher(String name){        super("最爱吃鱼罐头");  // 调用父类中带有参数的构造器        System.out.println("Teacher(String name):"+name);        this.name = name;    }}// Student子类继承Personclass Student extends Person{    private String name;    Student(){        super("heihei");  // 调用父类中带有参数的构造器        System.out.println("SubClass2");    }    public Student(String name){ // 自动调用父类的无参数构造器        System.out.println("Student(String name):"+name);        this.name = name;    }}

结果如下:

------Teacher 类继承------
调用了父类的无参构造器: Person()
Teacher
调用了父类的带参构造器: Person(String name)
Teacher(String name):张三
------Student 类继承------
调用了父类的带参构造器: Person(String name)
SubClass2
调用了父类的无参构造器: Person()
Student(String name):张三三

final修饰的类不能被继承

final 关键字主要用在三个地方:变量、方法、类。

final 的特点:

我们测试下修饰类后到底能不能继承:

package com.nz;public class InheritDemo4 {}// 父类final class Fu {    private String name;}//class Zi extends Fu{ // Cannot inherit from final 'com.nz.Fu' 会显示没办法继承Fu//}

结果:可以看出来在被final修饰的Fu类没办法继承,而且在编译期间就会报错了,没办法通过运行。

方法重写

介绍

子类中出现与父类一模一样的方法时(返回值类型,方法名和参数列表都相同),会出现覆盖效果,也称为重写或者复写。声明不变,重新实现。

使用场景与案例

发生在子父类之间的关系。 子类继承了父类的方法,但是子类觉得父类的这方法不足以满足自己的需求,子类重新写了一个与父类同名的方法,以便覆盖父类的该方法。

写个测试案例:

package com.nz;public class InheritDemo5 {    public static void main(String[] args) {        // 创建子类对象        Cat lanMao = new Cat();        // 调用父类继承而来的方法        lanMao.run();        // 调用子类重写的方法        lanMao.sing();    }}class Animal{    public void sing(){        System.out.println("动物都可以唱歌!");    }    public void run(){        System.out.println("动物都可以跑!");    }}class Cat extends Animal {    public void sing(){        System.out.println("我们一起学猫叫,一起喵喵喵!让我们一起撒个娇");    }}

运行结果:

动物都可以跑!
我们一起学猫叫,一起喵喵喵!让我们一起撒个娇

可以看出,蓝猫调用了重写后的sing方法。

@Override重写注解

加上后的子类代码形式如下:

class Cat extends Animal {    // 声明不变,重新实现    // 方法名称与父类全部一样,只是方法体中的功能重写了!    @Override    public void sing(){        System.out.println("我们一起学猫叫,一起喵喵喵!让我们一起撒个娇");    }}

注意事项

以上就是“Java继承的知识点有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯