java核心技术:继承

继承是一种类之间的关系,他描述了类之间一种“is a”的关系,继承也是面向对象编程的三大特性之一。

为什么要有继承,他有什么好处?提高代码的复用性,在不改变现有类的基础上不仅能够使用现有类的属性和功能,还能对现有类进行扩展。从上往下看,子类继承父类是子类对父类功能,属性的一种扩展,从下往上看,父类是对子类的进一步抽象,抽象出各个类之间的共同的属性和行为。

java继承

  java中用extends关键字来实现一个类继承一个类。

  举个栗子,有个学生类(Student)和老师类(Teacher):

/**
 * @author helloliu
 */
//老师类
public class Teacher {
    private String name;
    private String sex;private String subject;

    public void eat() {
        System.out.println("人是铁,饭是钢,一顿不吃饿的慌。。。。。");
    }
    public void sleep() {
        System.out.println("睡觉。。。。。");
    }

    public void teach () {
        System.out.println(subject + "老师上课。。。。。");
    }

}
//学生类
public class Student {

    private String name;
    private String sex;private int score;

    public void eat() {
        System.out.println("人是铁,饭是钢,一顿不吃饿的慌。。。。。");
    }
    public void sleep() {
        System.out.println("睡觉。。。。。");
    }

    public void test() {
        System.out.println("考试成绩 :" + score);
    }
}

通过写这两个类我们可以发现,Student和Teacher他们有个共同的特性,他们都是人,name,sex,age,address,eat(),sleep()是他们的公有的属性和行为,那么我们就可以再进一步抽象出一个Person类,然后通过继承的方式写student和teacher类。

/**
 * @author helloliu
 */

//Person类
public class Person {

    private String name;
    private String sex;public void eat() {
        System.out.println("人是铁,饭是钢,一顿不吃饿的慌。。。。。");
    }
    public void sleep() {
        System.out.println("睡觉。。。。。");
    }
}

//Student类
public class Student extends Person{
  
    private int score;
    public void test() {
        System.out.println("考试成绩 :" + score);
    }
}

//Teacher类
public class Teacher extends Person{

    private String subject;

    public void teach () {
        System.out.println(subject + "老师上课。。。。。");
    }

}

对比之前的写法,使用继承的方式定义Student和Teacher类,看起来简洁很多,我们只是在类中写了他们独特的属性和方法。

继承的属性和行为

子类能够从父类继承父类的实例域和方法,但是对于私有方法,静态方法,final方法在子类中是不可见的,私有实例域可通过在父类中提供public方法来间接访问。

方法覆盖

父类中的某些方法,对于子类可能并不适用,他们的实现方式可能不同,我们可以在子类中对父类中已有的public和protected方法进行覆盖重写(override)。比如我们重写Student类的sleep方法。

/**
 * @author helloliu
 */
public class Student extends Person{

    private int score;
    public void test() {
        System.out.println("考试成绩 :" + score);
    }

    @Override
    public void sleep() {
        System.out.println("student sleep");
    }
}

覆盖:子类重新实现父类方法,在子类中覆盖的方法可以用Override注解修饰。

super

在子类中可以用super关键字来访问父类中的实例域和方法,super和this不一样,他并不代表对象的引用,因为不能将他赋值给另一个对象变量。

    @Override
    public void sleep() {
        //通过super访问父类中的方法。
        super.eat();
        System.out.println("student sleep");
    }

子类构造器

在创建子类对象时,会调用子类构造器,在执行子类构造器的初始化操作之前会先调用父类构造器,当然我们也可以显示的调用父类构造器。

/**
 * @author helloliu
 */
public class Person {

    private String name;
    private String sex;
    //添加无参构造器和有参构造器
    public Person() {
        name = null;
        sex = null;
    }

    public Person(String name, String sex) {

        this.name = name;
        this.sex = sex;
    }

}

public class Student extends Person{

    private int score;
    public void test() {
        System.out.println("考试成绩 :" + score);
    }

    public Student() {
        //显示的调用父类的无参构造器
        super();
        //子类初始化操作
        score = 0;
    }

    public Student(String name, String sex, int score) {
        super(name, sex);
        this.score = score;

    }

}

可以直接使用super调用父类的构造器,如果要在子类中显示调用父类构造器,调用语句必须是子类构造器的第一条语句。如果没有显示的调用父类构造,编译器会默认调用父类的默认构造器(无参构造),如果父类中没有默认构造器,则会出现编译错误。

final类

如果我们不希望某个类被继承,那么我们可以将这个类定义成final类,final类不允许被扩展。java类库中String类就是一个final类,不能被继承。

public final class Person {
    //ToDo

}

final方法

如果只是不想类中的某个方法不能被子类覆盖,可以将这个方法定义成final方法,final类中的所有方法默认是final的,但是实例域不是final的。

原文地址:https://www.cnblogs.com/HelloLiu-Code/p/10887288.html

时间: 2024-08-12 13:43:25

java核心技术:继承的相关文章

JAVA核心技术--继承

1.继承:向上追溯,对同一批类的抽象,延续和扩展父类的一切信息! 1)关键字:extends      例如,父类是Animal,子类是Dog;   eg: public class Dog extends Animal 2)父类也称超类,可用super引用 3)子类也称派生类:必须继承父类,可以继承父类的属性和方法 重写:在子类中,方法名.形参.个数.类型.顺序相同!     关键字:@Override 重载:在同一个类中,名称相同的,  形参个数.类型.顺序不同!   注意:继承父类的方法时

Java核心技术学习笔记-继承

继承按照我们中文通俗的理解是不需要付出努力,就获得别人的能力或资产,比如继承父辈的家产,继承父辈的表达能力,继承父辈的外貌等等.在类里面的继承,可以理解不需要重新开发代码,就能复用父类的方法和域. 在继承关系里面,可以分为父类和子类,子类继承父类,那子类就有了跟父类一样对外的方法和属性,但是子类也可以拥有自己对外的方法和属性,就好比你继承了父辈的全部家产,但是还可以拥有属于自己的资产一样.所有继承是一个is-a的关系.java类继承用extends来表述继承关系.例如: class Manage

java核心技术学习笔记之一程序设计概述

Java 核心技术之一程序设计概述 一.   Java语言的特点 简单行 :取经于C++,排除了C++不常用的指针.结构等,增加垃圾回收. 面向对象:与C++不同是单继承,但是可以继承多接口.完全面向对象的语言: 网络技能:Socket,FTP,Http,URL编程简单: 健壮性:避免指针错误使用: 安全性:构建防病毒防篡改系统: 体系结构中立:字节码: 可移植性: 解释性:可以解释任何移植了的字节码: 高性能: 多线程 动态性: 二.   Internet 和 Java Applet 在网页中

Java核心技术-4-对象与类

4 对象与类 4.1 面向对象程序设计概述 1 类 封装(数据隐藏):将数据和行为组合在一个包中,并对对象使用者隐藏数据的实现方式. 对象中的数据成为实例域,操纵数据的过程称为方法. 2 对象 对象的三个主要特性:对象的行为behavior,对象的状态state,对象标识identity.3 识别类 4 类之间的关系 依赖uses-a,一个类的方法操纵另一个类的对象 聚合has-a,一个类的对象(其数据域)包含另一个类的对象 继承is-a,类A扩展类B. 4.2 使用预定义类 1 对象与对象变量

[基础] Java目录(摘自Java核心技术·卷1 基础知识)

Java核心技术·卷1 基础知识(原书第9版) 第1章 Java程序设计概述 1.1 Java程序设计平台 1.2 Java"白皮书"的关键术语 1.2.1 简单性 1.2.2 面向对象 1.2.3 网络技能 1.2.4 健壮性 1.2.5 安全性 1.2.6 体系结构中立 1.2.7 可移植性 1.2.8 解释型 1.2.9 高性能 1.2.10 多线程 1.2.11 动态性 1.3 Java applet与Internet 1.4 Java发展简史 1.5 关于Java的常见误解

Java核心技术-5-继承

5 继 承 5.1 类.超类和子类 用super访问父类. 由于子类无法直接访问超类的私有域,所以子类对超类私有域的初始化必须调用超类的构造器. 如果子类的构造器没有显式调用超类的构造器,则自动调用超类的无参构造器. this用途:一是引用隐式参数,二是调用该类的其他构造器. super用途:一是调用超类的方法,二是调用超类的构造器. 一个对象变量可以指示多种实际类型的对象被称为多态.在运行时能够自动选择调用哪个方法被称为动态绑定. 1 继承层次 由一个公共超类派生出来的所有类的集合被称为继承层

java核心技术卷一

java核心技术卷一 java基础类型 整型 数据类型 字节数 取值范围 int 4 +_2^4*8-1 short 2 +_2^2*8-1 long 8 +_2^8*8-1 byte 1 -128-127       浮点类型 数据类型 字节数 取值范围 小数位数 float 4 10^-38~10^38和-10^-38~-10^38 小数位数6-7 double 4 10^-308~10^308和-10^-308~-10^308 15位小数         boolean 类型和char 类

Java核心技术 第六章 接口和内部类

Java核心技术  第六章  接口与内部类 接口: 任何实现Comparable接口的类都需要包含compareTo方法,并且这个方法的参数必须是一个Object对象,返回一个整数数值. 在Java SE 5.0中,Comparable接口已经改进为泛型类型. 接口中所有的方法自动的属于public.因此,在接口中声明方法时,不必提供关键字public. 接口中决不能含有实例域,也不能在接口中实现方法. 要让一个类使用排序服务,必须让它实现compareTo方法,因此必须实现Comparable

《Java核心技术卷I》观赏指南

Tomxin7 如果你有想看书的计划,但是还在纠结哪些书值得看,可以简单看看"观赏指南"系列,本文会简单列出书中内容,给还没有买书的朋友提供一个参考. 前言 秋招过去很久了,虽然在学校的时候有恶补java基础,但是都是为了面试而准备的,有些技术并没有进行全面的了解,再加上java现在疯狂的更新版本,很多新东西没有了解过,所以就打算再过一遍.java的书籍很多,也不想重复的看,所以就买了两本写的比较系统的<java核心技术卷I II>,本篇文章主要是想分享一下卷I,如果你正打

读书_重读java核心技术

读书_重读java核心技术 新建模板小书匠 6.接口,lambda与内部类 接口 传统接口的特性 接口绝不能含有实例域 接口在1.8之前绝不能含有方法实现 方法不能引用实例域 接口中可以含有常量 更专用的接口可以继承更抽象的接口,提供更多抽象方法 接口中的类全部修饰为public ,接口中的常量全部修饰为public static final 1.8接口新特性 接口中可以包含静态方法 接口中可以包含默认方法 默认方法冲突(待学习) clone 拷贝(待学习) lambda 回调:是一种常见的设计