title: Java——基础知识(八)——类的继承、父类的重写、Object类、final关键字
author: SpringForest
date: 2021/05/09
updated: 2021/05/09
categories: Java基础知识


类的继承

概念

  • 类的继承是指在现有类的基础上构建一个新类
  • 继承主要描述类与类之间的关系,利用继承可以在不改变原有类的功能的前提下,对该类进行扩展,被继承的类称为父类,继承的类称为子类,父类和子类是一个相对的概念
  • 子类在继承父类时便拥有了父类中所有的成员变量和方法

实现

[修饰符] class 子类名 extends 父类名
{
	//子类代码
}
-----------------------------------------------
class A{}
class B extends A {}
class C extends B {} //C拥有A和B的所有内容
-----------------------------------------------
class A
{
    public void f()
    {
        System.out.print("A\n");
    }
}

class B extends A
{

}

public class Main
{
    public static void main(String [] args)
    {
        B b = new B();	//此处仅实例化对象B,注意B中并未声明任何方法

        b.f();
    }
}

输出

A

注意:

  1. Java中一个类只能继承于一个父类,不允许同时继承多个类
  2. 同一个父类可以被多个子类继承
  3. 可以千层饼多层继承

重写父类方法

重父类中方法的方法或成员变量

条件

重写方法/成员变量需要和父类被重写的方法名称/成员变量名称、参数列表和返回值类型均相同

实现

class A
{
    int c=1;
    public void a()
    {
        System.out.printf("%d\n",c);
    }
}

class B extends A
{
    int c=2;
    public void a()
    {
        System.out.printf("%d\n",c);
    }
}

public class Main
{
    public static void main(String [] args)
    {
        A test1 = new A();
        B test2 = new B();
        A test3 = new A();

        test1.a();
        test2.a();
        test3.a();
    }
}

输出

1
2
1

  • 从输出中可见虽然子类对父类的方法进行了重写,但是并不会改变原有父类中的方法

super关键字

在子类重写父类的方法后,子类就不能直接访问父类中原有的方法了,因此使用super关键字用来在子类中调用重写父类方法前父类的方法,构造方法也是同理

super.成员变量
super.成员方法()
super([参数列表])	//调用构造方法

注意:

  1. 通过super调用父类的构造方法的代码必须位于子类构造方法的第一行,并且只能出现一次

Object类

Object类时所有类的父类,所有类如果没有说明(extends)继承于某个类,默认继承Object类,如果说名明了,那Object类也是父类的父类

Object类中的常用方法

方法声明 功能描述
bolean equals(Object obj) 判断某个对象与此对象是否相等
final Class<?>getClass() 返回此 Object 的运行时类
int hashCode() 将对象的内存地址进行哈希运算并返回一个int类型的哈希码
String toString() 以字符串的形式返回对象的基本信息
void finalize() 清理没有被任何引用变量所引用的对象的资源(内存回收)

final关键字

作用

被final修饰的类、变量或方法具有以下特征

  1. 被修饰的类不能被继承
  2. 被修饰的方法不能被子类重写
  3. 被修饰的变量只能被赋值一次(变为常量),且在定义时必须初始化
 final class A
{
    final public int c = 0; //final和访问限制符都是修饰符
    public final int c = 0;
    
    public final void a()
    {

    }
}