Java由浅入深带你精通继承super

目录
  • 什么是继承
    • 背景
    • super关键字
    • protected 关键字
    • final 关键字

什么是继承

面向对象的特征:

封装:不必要公开的数据成员和方法,使用private关键字进行修饰。意义:安全性。

背景

代码中创建的类, 主要是为了抽象现实中的一些事物(包含属性和方法).

有的时候客观事物之间就存在一些关联关系, 那么在表示成类和对象的时候也会存在一定的关联

例如, 设计一个类表示动物

注意,:我们可以给每个类创建一个单独的 java 文件. 类名必须和 .java 文件名匹配(大小写敏感).

class Dag {
    public String name;
    public int age;

    public void eat(){
        System.out.println("eat()");
    }

}
class Bird{
    public String name;
    public int age;
    public String wing;

    public void eat(){
        System.out.println("eat()");
    }

    public void fly(){
        System.out.println("fly");

    }

定义了两个类,一个是Dag类,一个是Bird类

对比一下上述的两个类:

我们会发现它们之间有一些共性,我们就可以把他们相同的地方抽象出来重新定义一个类:

class Animal{
    public String name;
    public int age;

    public void eat(){
        System.out.println("eat()");
    }
}
class Dag {
    public String name;
    public int age;

    public void eat(){
        System.out.println("eat()");
    }

}
class Bird{
    public String name;
    public int age;
    public String wing;

    public void eat(){
        System.out.println("eat()");
    }

    public void fly(){
        System.out.println("fly");

    }

}

 这三个类都具备一个相同的 eat 方法, 而且行为是完全一样的.

这三个类都具备一个相同的 name 属性, 而且意义是完全一样的.

从逻辑上讲, Dag 和 Bird 都是一种 Animal.

此时我们就可以让 Dag 和 Bird 分别继承 Animal 类, 来达到代码重用的效果

此时, Animal 这样被继承的类, 我们称为 父类 , 基类 或 超类, 对于像Dag 和 Bird 这样的类, 我们称为 子类, 派生类 和现实中的儿子继承父亲的财产类似, 子类也会继承父类的字段和方法, 以达到代码重用的效果.

语法规则

基本语法:

class 子类 extends 父类 {

}

使用 extends 指定父类

Java 中一个子类只能继承一个父类 (而C++/Python等语言支持多继承)

子类会继承父类的所有 public 的字段和方法

对于父类的 private 的字段和方法, 子类中是无法访问的

子类的实例中, 也包含着父类的实例. 可以使用 super 关键字得到父类实例的引用

对于上面的代码, 可以使用继承进行改进. 此时我们让 Dag 和 Bird 继承自 Animal 类, 那么 Dag 在定义的时候就不必再 写 name 字段和 eat 方法. 

class Animal{
    public String name;
    public int age;

    public void eat(){
        System.out.println("eat()");
    }
}
class Dag extends Animal {

}
class Bird extends Animal{

    public String wing;

    public void fly(){
        System.out.println("fly");

    }

}

因为子类继承了父类的字段和方法,所以我们在main函数里就这样写:

extends 英文原意指 "扩展". 而我们所写的类的继承, 也可以理解成基于父类进行代码上的 "扩展".

例如我们写的 Bird 类, 就是在 Animal 的基础上扩展出了 fly 方法.

如果我们把age 改成 private, 那么此时子类就不能访问了

因为现在age是私有的,不能在子类当中使用age

super关键字

子类构造的同时,要先帮助父类来进行构造

当我们这样写就不报错了,这是为什么呢?

super三种用法://不能出现在静态方法当中,因为super相当于父类对象的引用

1、super():调用父类的构造方法

2、super.function():调用父类的普通方法

3、super.data:调用父类的成员属性

protected 关键字

刚才我们发现, 如果把字段设为 private, 子类不能访问. 但是设成 public, 又违背了我们 "封装" 的初衷. 两全其美的办法就是 protected 关键字

对于类的调用者来说, protected 修饰的字段和方法是不能访问的

对于类的 子类 和 同一个包的其他类 来说, protected 修饰的字段和方法是可以访问的

// Animal.java
public class Animal {
 protected String name;
 public Animal(String name) {
        this.name = name;
 }
 public void eat(String food) {
 System.out.println(this.name + "正在吃" + food);
 }
}
// Bird.java
public class Bird extends Animal {
 public Bird(String name) {
 super(name);
 }
 public void fly() {
 // 对于父类的 protected 字段, 子类可以正确访问
 System.out.println(this.name + "正在飞 ︿( ̄︶ ̄)︿");
 }
}
// Test.java 和 Animal.java 不在同一个 包 之中了.
public class Test {
 public static void main(String[] args) {
 Animal animal = new Animal("小动物");
 System.out.println(animal.name); // 此时编译出错, 无法访问 name
 }
} 

Java 中对于字段和方法共有四种访问权限

private: 类内部能访问, 类外部不能访问

默认(也叫包访问权限): 类内部能访问, 同一个包中的类可以访问, 其他类不能访问.

protected: 类内部能访问, 子类和同一个包中的类可以访问, 其他类不能访问.

public : 类内部和类的调用者都能访问

final 关键字

曾经我们学习过 final 关键字, 修饰一个变量或者字段的时候, 表示 常量 (不能修改).

final int a = 10;

a = 20; // 编译出错 

final 关键字也能修饰类, 此时表示被修饰的类就不能被继承.

final public class Animal {
 ...
}
public class Bird extends Animal {
 ...
}
// 编译出错
Error:(3, 27) java: 无法从最终com.bit.Animal进行继承

final 关键字的功能是 限制 类被继承

"限制" 这件事情意味着 "不灵活". 在编程中, 灵活往往不见得是一件好事. 灵活可能意味着更容易出错. 是用 final 修饰的类被继承的时候, 就会编译报错, 此时就可以提示我们这样的继承是有悖这个类设计的初衷的

我们平时是用的 String 字符串类, 就是用 final 修饰的, 不能被继承

到此这篇关于Java由浅入深带你精通继承super的文章就介绍到这了,更多相关Java 继承内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java继承学习之super的用法解析

    继承supersuper关键字的用法和this关键字的用法相似this:代表本类对象的引用super:代表父类存储空间的标识(可以理解为父类对象引用) package com.ithema_20; /*   测试类   继承   super   super关键字的用法和this关键字的用法相似   this:代表本类对象的引用   super:代表父类存储空间的标识(可以理解为父类对象引用)  */ public class Demo {     public static void main(

  • Java十分钟精通类 封装 继承

    目录 什么是类成员 什么是实例变量 那么实例变量和类变量的区别呢? 那么类方法和实例方法的区别? static关键字 static成员方法: static用处: 封装: 封装的概念 封装的分类 封装的使用 继承: 什么是继承 继承的使用: 方法重写的规则: super关键字: 什么是类成员 使用static修饰的成员方法和成员变量称为类成员 使用static修饰的成员变量叫做类变量 使用static修饰的成员方法叫做类方法 什么是实例变量 未使用static修饰的成员方法和成员变量称为实例成员

  • 解析JavaSE的继承和多态

    目录 1.继承 1.子类继承了父类,获得父类的全部Field和方法. 2.子类继承了父类,额外增加新的Field和方法 3.子类继承了父类,重写父类中的方法 4.super限定,在子类调用父类中被覆盖的方法 2.多态 3.引用变量的强制类型转换 4.面试题 1.Java中实现多态的机制是什么? 2.谈谈你对多态的理解? 总结 1. 继承 1. 子类继承了父类,获得父类的全部Field和方法. 子类Student类继承父类,将可以获得父类的全部Field和方法 public class Perso

  • Java由浅入深刨析继承

    目录 继承 继承的介绍 生活中的继承 继承的好处 继承的格式 继承的demo 子类不能继承的内容 super与this关键字 构造器不能被继承 final修饰的类不能被继承 方法重写 介绍 使用场景与案例 @Override重写注解 注意事项 完结 茫茫人海千千万万,感谢这一秒你看到这里.希望我的面试题系列能对你的有所帮助!共勉! 愿你在未来的日子,保持热爱,奔赴山海! Java基础知识(继承) 继承 继承的介绍 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类.描述的是事

  • 一篇文章超详细的介绍Java继承

    目录 前言 继承 继承的优点 重写和隐藏父类方法 重写父类中的方法 隐藏父类中的方法 方法重写和隐藏后的修饰符 子类访问父类私有成员 使用super关键字 使用super调用父类的无参数构造方法/有参数构造方法 附:继承的使用和认识 总结 前言 继承是面向对象语法的三大特征之一.继承可以降低代码编写的冗余度,提高编程的效率.通过继承,子类获得了父类的成员变量和方法.一个子类如何继承父类的字段和方法,如何修改从父类继承过来的子类的方法呢.今天我们开始学习有关Java继承的知识. 继承 继承就是子类

  • 学生视角看Java 面向对象的继承本质

    1.什么是继承? (1)用来提高代码的复用性 (2)将相同的功能模块封装到方法中需要使用时调用方法达到代码复用的目的 (3)通过继承将多个类中的相同的类容摘取出来,变成一个新类,让其他类和当前的新类产生关系,达到代码复用性的目的 注意:Java是单继承与c++有区别 ,c++可以多继承. 2.继承的格式 关键字extends 3.继承的特性 *子类拥有父类非 private 的属性.方法. *子类可以拥有自己的属性和方法,即子类可以对父类进行扩展. *子类可以用自己的方式实现父类的方法. *Ja

  • JAVA面向对象之继承 super入门解析

    目录 1 继承 1.1概念 1.2 特点 1.3 练习:继承入门案例 2 super 3 继承的用法 3.1 练习:super之继承中成员变量使用 3.2 练习:super之继承中构造方法的使用 4 方法重写Override 4.1 练习:继承中成员方法的使用 5 拓展 5.1 继承的好处与坏处 5.2 this与super的区别 5.3 重载Overload与重写Override的区别 1 继承 1.1概念 继承是面向对象最显著的一个特征 继承是从已有的类中派生出新的类,新类能吸收已有类的数据

  • Java继承extends与super关键字详解

    函数也称为方法! 继承:在java中使用extends关键字来表示继承关系.super用来继承父类方法和参数. 继承就是子类继承父类的特征和行为,使得子类具有父类相同的行为. 注意事项: 1.当一个类没有继承任何一个类时,系统默认继承Object. 2.父类又被称为基类.超类.super类,子类又被称为派生类,这是由于翻译问题而导致的. 3.Java的继承是单一性的. 4.子类不能继承父类的构造方法,但是可以继承构造方法类的参数. 5.子类可以拥有自己的属性和方法,即子类可以对父类进行扩展.但子

  • Java由浅入深带你精通继承super

    目录 什么是继承 背景 super关键字 protected 关键字 final 关键字 什么是继承 面向对象的特征: 封装:不必要公开的数据成员和方法,使用private关键字进行修饰.意义:安全性. 背景 代码中创建的类, 主要是为了抽象现实中的一些事物(包含属性和方法). 有的时候客观事物之间就存在一些关联关系, 那么在表示成类和对象的时候也会存在一定的关联 例如, 设计一个类表示动物 注意,:我们可以给每个类创建一个单独的 java 文件. 类名必须和 .java 文件名匹配(大小写敏感

  • Java由浅入深带你了解什么是包package

    目录 什么是包 1.导入包中的类 2.静态导入 3.将类放到包中 4.包的访问权限控制 5.常见的系统包 什么是包 包 (package) 是组织类的一种方式. 使用包的主要目的是保证类的唯一性. 例如, 你在代码中写了一个 Test 类. 然后你的同事也可能写一个 Test 类. 如果出现两个同名的类, 就会冲突, 导致 代码不能编译通过 1.导入包中的类  Java 中已经提供了很多现成的类供我们使用 ①:例如打印数组: public class TestDemo{ public stati

  • Java 由浅入深带你掌握图的遍历

    目录 1.图的遍历 2.深度优先遍历 3.利用DFS判断有向图是否存在环 4.广度优先遍历 1.图的遍历 从图中某一顶点出发访问图中其余顶点,且每个顶点仅被访问一次 图的遍历有两种深度优先遍历DFS.广度优先遍历BFS 2.深度优先遍历 深度优先遍历以深度为优先进行遍历,简单来说就是每次走到底.类似于二叉树的前序遍历 思路: 1.以某一个顶点为起点进行深度优先遍历,并标记该顶点已访问 2.以该顶点为起点选取任意一条路径一直遍历到底,并标记访问过的顶点 3.第2步遍历到底后回退到上一个顶点,重复第

  • Java由浅入深讲解继承上

    目录 1.什么是继承 2.继承的细节 2.1super关键字 2.2子类的构造方法 2.3super和this区别 继承同样是面向对象程序的特点 1.什么是继承 所谓继承就是抽取类的共性,进而实现代码的复用 继承的关键字是extends 现在定义一个类Tree,里面有树的名字.来源和科属,方法是打印树的形态特征,如下: class Tree { String name; String source; String genu; public void trait() { } } 上面的类除了方法t

  • Java线程池由浅入深掌握到精通

    目录 1.为什么使用线程池? 2.线程池的好处: 3.线程池使用的场合 4.创建和停止线程 5.停止线程池的方法 6.暂停和恢复线程池 1.为什么使用线程池? 反复创建线程开销大,可以复用线程池 过多的线程会占用太多的内存 解决以上问题的方法: 用少量的线程,避免内存占用过多 让这部分线程都保持工作,且反复执行任务,避免生命周期的损耗 2.线程池的好处: 加快响应速度,提高用户体验 合理利用CPU内存 统一管理 3.线程池使用的场合 服务器接受大量请求时,使用线程池技术是非常合适的,它可以大大减

  • Java由浅入深讲解继承下

    目录 1.代码块初始化 2.protected关键字 3.final关键字 4.Java中允许的继承方式 本篇紧接上一篇内容继续,还是从继承里的细节开始 1.代码块初始化 关于代码块的定义和使用因为之前已经进行过介绍,所以这里就不再赘述,我们所关注的点是父类和子类中的代码块在运行时候的先后顺序是怎样的 首先还是在父类以及子类中添加代码块,如下: //父类 { System.out.println("父类实例代码块"); } static { System.out.println(&qu

  • JAVA中阻止类的继承(官方和非官方)

    官方办法 JAVA语言提供的一个关键字"FINAL"可以用来履行该任务.看看下面的源代码范例: 复制代码 代码如下: //FinalDemo.java public final class FinalDemo { } 下面让我们来制作另一个类,它将会继承上面声明的类.JAVA语言提供的"EXTENDS"关键字将能够使得一个类继承于一个现有的类. 复制代码 代码如下: //FinalDemo2.java public class FinalDemo2 extends

  • Java基础知识总结之继承

    一.继承的基本概念 什么是继承呢? 我们可以想一下,既然是"继承",那么它必须是在两个或多个类之间所发生的关系吧,这样我们就可以说:这个类继承自什么类,假如只有一个类的话,它既无法继承别的类,而且也没有别的类来继承它,这就构不成什么继承关系了哈,理清楚了这一层关系之后我们再来谈谈它继承了什么呢? 既然说什么什么类继承自什么什么类,那它肯定要从继承的那个类中继承点什么呀!我们把发生继承关系的这两个类称为父类和子类,子类可以继承父类的属性和方法,这个就是继承的基本概念,下面我们来系统的学习

随机推荐