Java基础知识总结(详细整理)——下篇

本文详细介绍了Java中的继承概念,包括IS-A关系、继承类型、关键字extends和implements的使用,以及super和this关键字。此外,文章还探讨了方法的重写(Override)和重载(Overload)的区别,并详细解释了Java多态的实现方式和优点。通过对多态的实例解析,展示了Java中虚方法调用的动态绑定特性。
摘要由CSDN通过智能技术生成

目录

Java 继承

继承的概念

类的继承格式

IS-A 关系

继承类型

继承关键字

extends关键字

implements关键字

super 与 this 关键字

final 关键字

构造器:

Java 重写(Override)与重载(Overload)

重写 (Override)

方法重写的规则

Super 关键字的使用

重载(Overload)

重写与重载之间的区别

Java 多态

多态的优点

多态存在的三个必要条件

虚方法

例子解析

多态的实现方式

方式一:重写

方式二:接口

方式三:抽象类和抽象方法


Java 继承

继承的概念

继承是面向对象的三大特征之一。继承和现实生活中的“继承”的相似之处是保留一些父辈的特性,也就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为,从而减少代码冗余,提高程序运行效率。

java中的继承就是在已经存在类的基础上进行扩展,从而产生新的类。已经存在的类称为父类、基类或超类,而新产生的类称为子类或派生类。在子类中,不仅包含父类的属性和方法,还可以增加新的属性和方法。

类的继承格式

Java 中子类继承父类的语法格式如下: 

修饰符 class class_name extends extend_class {
    // 类的主体
}

其中,class_name 表示子类(派生类)的名称;extend_class 表示父类(基类)的名称;extends 关键字直接跟在子类名之后,其后面是该类要继承的父类名称。

例如:

    public class Student extends Person{}

Java 的继承通过 extends 关键字来实现,extends 的英文意思是扩展,而不是继承。extends 很好的体现了子类和父类的关系,即子类是对父类的扩展,子类是一种特殊的父类。从这个角度看,使用继承来描述子类和父类的关系是错误的,用扩展更恰当。

当然,类的继承不改变类成员的访问权限,也就是说,如果父类的成员是公有的、被保护的或默认的,它的子类仍具有相应的这些特性,并且子类不能获得父类的构造方法。

如果类 A 是类 B 的父类,而类  B 是类 C 的父类,我们也称类 C 是 A 的子类,类 C 是从类 A 继承而来的。在 Java 中,类的继承是单一继承,也就是说,一个子类只能拥有一个父类。

继承中最常使用的两个关键字是 extends implements

这两个关键字的使用决定了一个对象和另一个对象是否是 IS-A (是一个)关系。

通过使用这两个关键字,我们能实现一个对象获取另一个对象的属性。

所有 Java 的类均是由 java.lang.Object 类继承而来的,所以 Object 是所有类的祖先类,而除了 Object 外,所有类必须有一个父类。

通过 extends 关键字可以申明一个类是继承另外一个类而来的,一般形式如下

// A.java
public class A {
    private int i;
    protected int j;
 
    public void func() {
 
    }
}
 
// B.java
public class B extends A {
    public int z;

    public void fund(){

    }
    
}

以上的代码片段说明,类 B 由类 A 继承而来的,类 B 是类 A 的子类。而类 A 是 Object 的子类,这里可以不显示地声明。

作为子类,类 B 的实例拥有类 A 所有的成员变量,但对于 private 类型的成员变量类 B 却没有访问权限,这保障了类 A 的封装性。

IS-A 关系

IS-A 就是说:一个对象是另一个对象的一个分类。

下面是使用关键字 extends 实现继承。

public class Animal{
}

public class Mammal extends Animal{
}

public class Reptile extends Animal{
}

public class Dog extends Mammal{
}

基于上面的例子,以下说法是正确的:

  • Animal 类是 Mammal 类的父类。
  • Animal 类是 Reptile 类的父类。
  • Mammal 类和 Reptile 类是 Animal 类的子类。
  • Dog 类既是 Mammal 类的子类又是 Animal 类的子类。

分析以上示例中的 IS-A 关系,如下:

  • Mammal IS-A Animal
  • Reptile IS-A Animal
  • Dog IS-A Mammal

因此 : Dog IS-A Animal

通过使用关键字 extends ,子类可以继承父类的除 private 属性外所有的属性。

我们通过使用 instanceof 操作符,能够确定 Mammal IS-A Animal

例如:

public class Dog extends Mammal{
   public static void main(String args[]){

      Animal a = new Animal();
      Mammal m = new Mammal();
      Dog d = new Dog();

      System.out.println(m instanceof Animal);
      System.out.println(d instanceof Mammal);
      System.out.println(d instanceof Animal);
   }
}


//运行结果:
true
true
true

介绍完 extends 关键字之后,我们再来看下 implements 关键字是怎样使用来表示 IS-A 关系。

Implements 关键字在类继承接口的情况下使用, 这种情况不能使用关键字 extends 

//例如:

public interface Animal {}

public class Mammal implements Animal{
}

public class Dog extends Mammal{
}

在举个实例:

教师和学生都属于人,他们具有共同的属性:姓名、年龄、性别和身份证号,而学生还具有学号和所学专业两个属性,教师还具有教龄和所教专业两个属性。下面编写 Java 程序代码,使教师(Teacher)类和学生(Student)类都继承于人(People)类,具体的实现步骤如下。

1.创建人类 People,并定义 name、age、sex、sn 属性,代码如下:

    public class People {
        public String name; // 姓名
        public int age; // 年龄
        public String sex; // 性别
        public String sn; // 身份证号
        public People(String name, int age, String sex, String sn) {
            this.name = name;
            this.age = age;
            this.sex = sex;
            this.sn = sn;
        }
        public String toString() {
            return "姓名:" + name + "\n年龄:" + age + "\n性别:" + sex + "\n身份证号:" + sn;
        }
    }

如上述代码,在 People 类中包含 4 个公有属性、一个构造方法和一个 toString() 方法。

2.创建 People 类的子类 Student 类,并定义 stuNo 和 department 属性,代码如下:

    public class Student extends People {
        private String stuNo; // 学号
        private String department; // 所学专业
        public Student(String name, int age, String sex, String sn, String stuno, String department) {
            super(name, age, sex, sn); // 调用父类中的构造方法
            this.stuNo = stuno;
            this.department = department;
        }
        public String toString() {
            return "姓名:" + name + "\n年龄:" + age + "\n性别:" + sex + "\n身份证号:" + sn + "\n学号:" + stuNo + "\n所学专业:" + department;
        }
    }

由于 Student 类继承自 People 类,因此,在 Student 类中同样具有 People 类的属性和方法,这里重写了父类中的 toString() 方法。

注意:如果在父类中存在有参的构造方法而并没有重载无参的构造方法,那么在子类中必须含有有参的构造方法,因为如果在子类中不含有构造方法,默认会调用父类中无参的构造方法,而在父类中并没有无参的构造方法,因此会出错。

3.创建 People 类的另一个子类 Teacher,并定义 tYear 和 tDept 属性,代码如下:

    public class Teacher extends People {
        private int tYear; // 教龄
        private String tDept; // 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值