一、简介

描述:

  • 现实世界中的继承无处不在。比如:动物细分有哺乳动物、爬行动物等,哺乳动物细分有灵长目、鲸目等。
  • 继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模。
  • 继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等。
  • 继承关系的俩个类,一个为子类(派生类),一个为父类(基类)。
  • 子类和父类之间,从意义上讲应该具有'子类 is a 父类'的关系。
  • 继承使用'extends'关键字,意思为'扩展',子类是父类的扩展。

作用:

  • 继承的本质在于抽象。类是对对象的抽象,继承是对某一批类的抽象。
  • 提高代码的复用性。

注意:

  • 父类中的属性方法可以被子类继承
  • 子类中继承了父类中的属性和方法后,在子类中能不能直接使用这些属性和方法,是和这些属性和方法原有的权限修饰符(public/protected/default/private)相关的。
  • 父类中的构造器是不能被子类继承的,但是子类的构造器中,会隐式地调用父类中的无参构造器(默认使用'super'关键字)。
  • Java中类只有单继承,没有多继承! 接口可以'多继承'!
  • 一个子类只能直接继承一个父类,一个父类可以被多个子类继承。

示例:

public class Son extends Father{ }

二、Object类

描述:

  • Java中的每一个类都是直接或间接地继承了Object类。所以每一个类都和Object类有’is a‘的关系。

注意:

  • 若一个类定义时没有显式地声明继承,那么在编译成class文件后,默认会加上继承Object类
  • 在Object类中,提供了一些方法被子类继承,那么就意味着,Java中任何一个对象都可以调用这些方法。例如:toString方法、equals方法、getClass方法等。

三、'Super'关键字


Ⅰ、简介

描述:

  • 在子类中可以使用'this'关键字来表示访问或调用子类中的属性或方法。
  • 子类继承父类之后,使用'super'关键字就表示访问或调用父类中的属性和方法
  • 'super'关键字代表对父类对象的引用。

注意:

  • 用'super'调用父类构造方法,必须是构造方法中的第一个语句
  • 'super'和'this'不能够同时调用构造方法,因为'this'也是在构造方法的第一个语句。
  • 'super'只能出现在子类的方法或者构造方法中。

Ⅱ、使用

  1. 访问父类中的属性

    public class Test {
    public static void main(String[] args) {
    new Student().say("王五");
    }
    } class Person {
    protected String name = "张三";
    } class Student extends Person {
    private String name = "李四"; public void say(String name) {
    System.out.println(name);//王五
    System.out.println(this.name);//李四
    /* 访问父类中的属性 */
    System.out.println(super.name);//张三
    }
    }
  2. 调用父类中的方法

    public class Test {
    public static void main(String[] args) {
    new Student().test();
    }
    } class Person {
    public void print() {
    System.out.println("Person");
    }
    } class Student extends Person {
    public void print() {
    System.out.println("Student");
    } public void test() {
    print();//Student
    this.print();//Student
    /* 调用父类中的方法 */
    super.print();//Person
    }
    }
  3. 调用父类中的构造器

    public class Test {
    public static void main(String[] args) {
    System.out.println(new Student().name);//张三
    }
    } class Person {
    protected String name; public Person(String name) {
    this.name = name;
    }
    } class Student extends Person {
    public Student() {
    /*
    显式地调用父类的有参构造器。
    若没有显式调用,默认会调用父类的无参构造器。
    注意:
    不管是显式还是隐式地调用父类的构造器,super语句一定要出现在子类构造器中第一行代码。
    所以this和super不可能同时使用它们调用构造器,因为它们都要出现在第一行代码的位置。
    */
    super("张三");
    }
    }

Ⅲ、'super'和'this'的区别

  1. 代表的事物

    • this:代表所属方法的调用者对象。
    • super:代表父类对象的引用空间。
  2. 使用前提
    • this:在非继承的条件下也可以使用。
    • super:只能在继承的条件下才能使用。
  3. 调用构造方法
    • this:调用本类的构造方法。
    • super:调用的父类的构造方法 。

四、方法的重写


Ⅰ、简介

描述:

  • 子类继承父类,继承了父类中的方法,但是父类中的方法并不一定能满足子类中的功能需要,所以子类中需要把方法进行重写
  • 方法重写只存在于子类和父类(包括直接父类和间接父类)之间。
  • 在同一个类中方法只能被重载,不能被重写。

注意:

  • 方法重写的时候,必须存在继承关系。
  • 父类的静态方法不能被子类重写为非静态方法 。
  • 父类的非静态方法不能被子类重写为静态方法。
  • 子类可以定义与父类的静态方法同名的静态方法,但这不是重写,因为静态(static)方法是属于类的,而不是属于实例的。
  • 被'final'修饰的父类方法无法被子类重写。
  • 父类的私有(private)方法不能被子类重写,子类继承父类后,是不能直接访问父类中的私有方法的,那么就更谈不上重写了。
  • 'protected'修饰的父类方法可以被子类见到,也可以被子类重写,但是它是无法被外部所引用的,所以没有多态性

Ⅱ、语法

规则:

  1. 重写时,子类中方法的方法名和参数列表,必须与要重写的父类的方法相同
  2. 重写时,子类方法的权限修饰符可以在父类方法的基础上扩大,但是不能缩小
  3. 重写时,子类方法的抛出异常类型的范围可以可以在父类方法的基础上缩小,但是不能扩大
  4. 重写时,返回类型可以相同,也可以不同。如果不同的话,子类的方法返回类型必须是父类方法返回类型的子类型
  5. 一般情况下,重写的方法会和父类中的方法的声明完全保持一致,只有方法的实现不同。

示例:

public class Test {
public static void main(String[] args) {
Student student = new Student();
student.run();
System.out.println(student.test());
}
} class Person {
public void run() {
System.out.println("personRun");
} protected Object test() throws Exception {
return "personTest";
}
} class Student extends Person {
/* 常见的方法重写示例 */
public void run() {
System.out.println("studentRun");
} /* 特殊的方法重写示例 */
public String test() throws RuntimeException {
return "studentTest";
}
}

Java基本概念:继承的更多相关文章

  1. JAVA封装、继承

    封装 1.概念: 将类的某些信息隐藏在类的内部,不允许外部程序访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问. 2.好处: a.只能通过规定的方法访问数据 b.隐藏类的实例细节,方便修改和实 ...

  2. java类的继承

    继承就是在一个现有类型的基础上,通过增加新的方法或者重定义已有方法(重写)的方式,产生一个新的类型.继承是面向对 象的三个基本特征--封装.继承.多态的其中之一,我们在使用java时编写的每一个类都是 ...

  3. 【JAVA零基础入门系列】Day13 Java类的继承与多态

    继承是类的一个很重要的特性,什么?你连继承都不知道?你是想气死爸爸好继承爸爸的遗产吗?(滑稽) 开个玩笑,这里的继承跟我们现实生活的中继承还是有很大区别的,一个类可以继承另一个类,继承的内容包括属性跟 ...

  4. Java多线程概念简介 多线程中篇(一)

    Java的线程与操作系统的线程   在线程的相关介绍中,有讲到“线程的实现”分为三种:内核支持,用户级以及两者混合.(这只是一种简要的分类) Java线程在JDK1.2之前,是用户线程实现的 而在JD ...

  5. -1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方法都定义在Object类中

     本文关键词: java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁  sleep()和wait()方法的区别 为什么wait( ...

  6. java基础之继承(一)

    虽然说java中的面向对象的概念不多,但是具体的细节还是值得大家学习研究,java中的继承实际上就是子类拥有父类所有的内容(除私有信息外),并对其进行扩展.下面是我的笔记,主要包含以下一些内容点: 构 ...

  7. JAVA 构造器, extends[继承], implements[实现], Interface[接口], reflect[反射], clone[克隆], final, static, abstrac

    记录一下: 构造器[构造函数]: 在java中如果用户编写类的时候没有提供构造函数,那么编译器会自动提供一个默认构造函数.它会把所有的实例字段设置为默认值:所有的数字变量初始化为0;所有的布尔变量设置 ...

  8. java 中的继承

    继承的概念 继承就是子类继承父类的特征和行为,使得子类具有父类得属性和方法. 继承得关键字:extends 语法格式:<modifier> class <name> [exte ...

  9. Java面向对象之继承extends 入门实例

    一.基础概念 (一)继承的好处: 1.继承:提高了代码的复用性. 2.让类与类之间产生了关系,给多态这个特征提供了前提. (二)继承的种类: 1.单继承:一个类只能有一个父类. 2.多继承:一个类可以 ...

  10. Java中类的继承深入剖析

    在Java开发中,我们常常用到继承这一概念,可以说继承是Java这类面向对象编程语言的基石.正是有了继承这个概念,使得我们可以创建分等级层次的类.今天小编就和大家一起来深入聊聊Java语言的继承. 在 ...

随机推荐

  1. Animator动画状态机的简单使用

    一.动画状态机的使用 1.动画状态机说明 2.动画切换箭头的Inspector面板 3.动画的Inspector面板 二.动画状态机的使用和脚本控制 1.动画状态机的使用  2.动画状态机的控制脚本 ...

  2. 南阳ccpc C题 The Battle of Chibi && hdu5542 The Battle of Chibi (树状数组优化+dp)

    题意: 给你一个长度为n的数组,你需要从中找一个长度为m的严格上升子序列 问你最多能找到多少个 题解: 我们先对原序列从小到大排序,排序之后的序列就是一个上升序列 这里如果两个数相等的话,那么因为题目 ...

  3. hdu1541 Stars

    Problem Description Astronomers often examine star maps where stars are represented by points on a p ...

  4. Educational Codeforces Round 69 (Rated for Div. 2) C. Array Splitting (思维)

    题意:给你一个长度为\(n\)的升序序列,将这个序列分成\(k\)段,每一段的值为最大值和最小值的差,求\(k\)段值的最小和. 题解:其实每一段的最大值和最小值的差,其实就是这段元素的差分和,因为是 ...

  5. hdu2126 Buy the souvenirs

    Problem Description When the winter holiday comes, a lot of people will have a trip. Generally, ther ...

  6. Codeforces Round #672 (Div. 2) C1. Pokémon Army (easy version) (DP)

    题意:给你一组数\(a\),构造一个它的子序列\(b\),然后再求\(b_1-b2+b3-b4...\),问构造后的结果最大是多少. 题解:线性DP.我们用\(dp1[i]\)来表示在\(i\)位置, ...

  7. 通过修改etcd来设置或修改节点flannel子网信息

    在首次启动flannel服务的时候可以手动指定subnet.env文件,配置所在节点的flannel子网网段,如果不指定配置文件,flannel将自动分配一个子网网段并生成配置文件 /var/run/ ...

  8. System.Windows.Forms.Help

    在开发过程中,基本都需要实现帮助功能,而一般帮助功能就是打开一个帮助文档,System.Windows.Forms提供了Help类用于打开帮助文档,挺方便的. Help类提供的方法如下:   Name ...

  9. 超详细 DNS 协议解析

    尽人事,听天命.博主东南大学研究生在读,热爱健身和篮球,正在为两年后的秋招准备中,乐于分享技术相关的所见所得,关注公众号 @ 飞天小牛肉,第一时间获取文章更新,成长的路上我们一起进步 本文已收录于 C ...

  10. python to exe

    使用pyinstaller 打包 文件结构如下 命令行cd 进入 project文件夹 ,然后 命令 pyinstaller -F main.py 即可打包文件为一个完整的exe.(不含DLL等)