博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java进阶之面向对象(一)——继承
阅读量:4249 次
发布时间:2019-05-26

本文共 2673 字,大约阅读时间需要 8 分钟。

Java进阶之面向对象(一)——继承

1. 继承

1.1 继承概述

  • 继承是面向对象三大特征之一;
  • 继承的关键字是extends;
  • 父类更通用,子类更具体
  • 子类继承了父类,就可以具有父类的属性和方法,还可以在子类中定义自己特有的属性和方法;
  • 子类只能继承一个父类;
  • 继承不能形成闭合(父类不能继承直接子类或隔代子类)

格式:

public class 子类名 extends 父类名 {}

1.2 继承的优点和弊端

优点:

1.提高了代码的复用性(多个类相同的成员可以放到同一个类中)2.提高了代码的维护性(如果共有成员的代码需要修改,只需要修改父类中的代码)

弊端:

继承让类与类之间产生了关系,增强了类之间的耦合性;当父类发生变化时,子类也不得不跟着变化,削弱了类的独立性。

不用滥用继承,只有满足A类是B类的一种,AB类明确存在继承关系,如猫和动物,苹果和水果时,才需要考虑继承。

1.3 super关键字

super:代表父类存储空间的标识(可以理解为父类对象引用)

作用:

  • 访问父类构造函数
  • 访问父类成员变量
  • 访问父类成员方法

子类中所有的构造方法默认都会访问父类中无参的构造方法

  • 1.子类会继承父类中的数据,可能还会使用父类中的数据,所以子类初始化之前,一定要先完成父类数据的初始化
  • 2.每一个子类构造方法的第一条语句默认都是super()

this和super的区别:

在这里插入图片描述

1.4 父子类属性和构造方法的执行过程

继承中变量的访问特点:

在子类方法中访问一个变量→子类局部范围找→子类成员方法找→父类成员范围找→都没有就报错(不考虑父类的父类)

继承关系下代码的执行顺序:

父类的变量 --> 父类构造方法 --> 子类变量 --> 子类构造方法

在这里插入图片描述

1.5 继承在内存中执行原理

子类实例化时,先调用子类构造函数进栈,然后在子类构造函数中通过super语句调用父类构造函数,执行完父类构造函数再执行子类构造函数;

子类创建对象时,只会创建一个对象,但是会在子类对象中开辟空间,存放父类成员变量。在这里插入图片描述

1.6 访问权限修饰符

Java中有4种访问权限修饰符

  • private:私有
  • (什么都不写):默认
  • protected:受保护
  • public:公有

访问权限修饰符的作用:控制一个类、类成员是否被其他类访问。

权限范围:
在这里插入图片描述

1.7 方法重写

方法重写:子类中出现了和父类相同的方法签名(方法名、参数列表、返回值类型)

应用方法重写的目的:沿袭父类的功能,又可以定义子类特有的内容。

@Override是一个注解,可以帮助我们检查重写方法声明的正确性。

注意事项:

  • 1.父类私有方法不能被重写(父类私有成员子类不能被继承)
  • 2.子类访问权限不能比父类低(public > protect > 默认 > private)

方法重载与方法重写的区别:

在这里插入图片描述

2. 抽象类

当一个类缺乏足够多的具体信息来对应对象时,如单纯的人和动物(无法具体道某个特定的人和动物),我们就可以把这样的类称为抽象类。

抽象类的特点:

  • 抽象类和抽象方法必须使用abstract关键字来修饰
  • 抽象类中不一定有抽象方法,但有抽象方法的一定是抽象类
  • 抽象类不能实例化,但抽象类可以有构造方法,构造方法给子类调用
  • 抽象类的子类要么重写抽象类中的所有抽象方法,要么本身就是抽象类

抽象类成员特点:

  • 成员变量 可以是变量,也可以是常量
  • 构造方法 有构造方法,但不能实例化,作用是给子类调用
  • 成员方法 可以有抽象方法(限定子类必须完成某些动作),也可以是非抽象方法(提高代码复用性)
public abstract class Person {
private String name; private int age; public Person(String name, int age) {
this.name = name; this.age = age; } public String getName() {
return name; } public int getAge() {
return age; } public abstract void show();}//创建学生类,继承Person父类public class Student extends Person {
String number; //学号 public Student(String name, int age, String number) {
super(name, age); this.number = number; } //重写父类方法 public void show(){
//super.show(); System.out.println("姓名:" + super.getName() + ",年龄:" + super.getAge() +", 学号:"+number); }}//创建老师类,继承Person父类public class Teacher extends Person {
double salary; //薪资 public Teacher(String name, int age, double salary) {
super(name, age); this.salary = salary; } public void show(){
//super.show(); System.out.println("姓名:" + super.getName() + ",年龄:" + super.getAge() +", 年薪:"+salary); }}

3. final关键字

final关键字是状态修饰符

  • 修饰方法 表明该方法是最终方法,不能被重写(可以被继承)
  • 修饰变量 表明该变量是常量,不能被再次赋值
  • 修饰类 表明该类是最终类,不能被继承

final修饰局部变量:

  • 变量是基本类型 基本类型的数值不能发生改变
  • 变量是引用类型 引用类型的地址值不能改变,但是地址里面的内容是可以改变的

转载地址:http://ndwei.baihongyu.com/

你可能感兴趣的文章
踩坑记 | Flink 天级别窗口中存在的时区问题
查看>>
用了 History Server,妈妈再也不用担心我的 Flink 作业半夜挂了
查看>>
强烈推荐三本 Spark 新书籍
查看>>
ClickHouse 知识讲解
查看>>
ClickHouse 如何玩转时序数据
查看>>
Flink 在腾讯视频的应用实践
查看>>
Flink SQL 1.11 on Zeppelin 平台化实践
查看>>
通过项目逐步深入了解Mybatis<三>
查看>>
奇怪的Java题:为什么128 == 128返回为False,而127 == 127会返回为True?
查看>>
通过项目逐步深入了解Spring MVC(一)
查看>>
java读取文件
查看>>
【二叉树】二叉树打印
查看>>
【字符串】字符串逆序
查看>>
【字符串】判断两字符串是否互为旋转词?
查看>>
【排序】时间复杂度为O(N^2)的排序——冒泡、选择和插入排序
查看>>
Typora Markdown 语法
查看>>
【IO】程序访问文件的几种方式
查看>>
Java NIO 系列教程
查看>>
fork() || fork()和fork() && fork()笔试题
查看>>
Qt:事件处理
查看>>