JAVA面向对象高级部分—继承

1、static

static修饰成员变量

基本概念和定义

static修饰的称为类变量。
在这里插入图片描述

使用方法

1、类变量的用法

如下图红框中
1)类名.类变量,通过类名直接调用
2)对象.类变量
在这里插入图片描述

2、实例变量的用法

实例化之后才能调用:对象.实例变量,不能通过类名访问
在这里插入图片描述

执行原理

类变量执行原理:因为只有一份,所以初始化无数次,都会输出最后初始化的结果。
在这里插入图片描述
实例变量执行原理:
最后输出首次初始化的结果
在这里插入图片描述

总结

在这里插入图片描述

static修饰成员变量的应用场景

在这里插入图片描述

案例的实现步骤

建立构造器,通过调用构造器,构造器内部调用
访问内部类变量number,可以省略类名。
在这里插入图片描述

总结

在这里插入图片描述

static修饰成员方法

成员方法分类

类方法和实例方法
在这里插入图片描述

代码示例
类方法调用示例:
在这里插入图片描述
实例方法调用的定义:
在这里插入图片描述

实例方法与类方法的区别

https://www.jianshu.com/p/35133302e485
1、实现方式区别:类方法用static关键字修饰;实例方法无需。 调用的方式不一样:实例方法—创建对象,对象名.实例方法;类方法—类名.类方法
2、内存方式不一样:静态类方法内存是连续的,在程序开始时就生成;实例方法是离散的空间,在程序运行中生成内存。
3、存储位置区别:类方法在堆上分配内存,实例方法在堆栈上。
4、使用场景区别:实例方法中的成员变量可访问修改;类方法中的成员变量无需外部访问或修改。(类方法一般用于实现一些工具方法,比如对某个对象进行扩展,或者实现单例。)

执行原理

在这里插入图片描述

总结

在这里插入图片描述

补充知识,main方法

在这里插入图片描述

在这里插入图片描述

static修饰成员方法的应用场景

最常见的应用场景是做工具类
在这里插入图片描述

示例:
在这里插入图片描述

工具类不需要创建对象(因为工具类是类变量,直接通过类名即可调用,故不需要创建对象来调用),节约内存,在工具类中私有化。
在这里插入图片描述

在这里插入图片描述

总结

在这里插入图片描述

static的注意事项

在这里插入图片描述
1、类方法可以直接访问类的成员,类方法中不可以直接访问实例成员
实例成员 = 实例变量
在这里插入图片描述

2、实例方法中既可以直接访问类成员,也可以直接访问实例成员,实例方法还能直接访问类中其它实例方法。
在这里插入图片描述
实例方法访问其它实例方法,this可加上也可以省略。
在这里插入图片描述
3、实例方法中可以出现this关键字,类方法中不可以出现this关键字
在这里插入图片描述

static的应用知识:代码块

代码块概述和分类

这两种代码块日常使用不多,在socket公司的源码中使用较多。
在这里插入图片描述

静态代码块

1)先输出静态代码块的 结果
在这里插入图片描述
2)静态代码块仅执行一次
在这里插入图片描述
3)在静态代码块中为类变量赋值
在这里插入图片描述

实例代码块

1)创建对象时,先执行实例代码块,后执行构造器
在这里插入图片描述
在这里插入图片描述
this表示当前对象的地址
写代码过程中会遇到一些代码重复的情况,减少重复代码的,且实例代码在构造器之前执行,可将下面的重复代码放置实例代码中
在这里插入图片描述
删除重复代码后
在这里插入图片描述

static的应用知识:单例设计模式

确保一个类只有一个对象,不能在类外创建对象
在这里插入图片描述
饿汉式单例设计模式例子:
在这里插入图片描述

单例设计模式的应用场景和好处

Runtime

在这里插入图片描述

单例设计模式的实现方法

在这里插入图片描述

总结

在这里插入图片描述

懒汉式单例设计模式

在这里插入图片描述

例子

在这里插入图片描述

懒汉式单例和饿汉式单例选择

若需要频繁使用的,则采用饿汉式,把单例模式提前设计出来
若使用没这么频繁,则采用懒汉式,节约内存。

面向对象的三大特征之二:继承

继承的快速入门

什么是继承

在这里插入图片描述

例子

1、子类如何调用父类的成员变量和方法
不能使用父类的私有成员方法,公有成员可以通过变量名/成员方法名,直接调用。
在这里插入图片描述
2、如何在父类和子类外创建对象调用调用父类的成员方法/变量
子类名 对象 = new 子类名();

在这里插入图片描述

继承的执行原理

在这里插入图片描述

总结

在这里插入图片描述

继承的好处

减少重复代码的编写
在这里插入图片描述
改进后
在这里插入图片描述

继承相关注意事项

权限修饰符

在这里插入图片描述
代码示例
在一个类中写四个成员修饰符的方法
在这里插入图片描述
1)在本类中可通过方法名直接访问四种权限修饰符修饰的方法
在这里插入图片描述
2)同一个包中的其它方法访问成员修饰符修饰的方法
同一个包中的其它方法无法访问private修饰的方法,其余均可访问。
在这里插入图片描述
3)其它包下的任意子类(定义了四种修饰符的子类)
Fu是定义了四种修饰符的父类,Zi是其它包下Fu的子类,子类和父类不在同一个包下。
由其它private和缺省符修饰的方法,其它包下的任意子类无法使用。
在这里插入图片描述
4)任意包下的任意类
仅可访问public修饰的方法,任意包是指和创建了4种权限修饰符修饰的方法的类,没有继承等关系。
在这里插入图片描述

单继承、Object类

单继承概述

在这里插入图片描述
一个类不能同时继承多个类
在这里插入图片描述
支持单层继承
在这里插入图片描述

为何java中的类不支持多继承

继承多个类时,若两个父类中有重名的方法,则无法判断子类调用的是哪个父类中的方法
在这里插入图片描述

Object类

若没有指定任何父类,默认父类为Object类
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

总结

在这里插入图片描述

方法重写

在这里插入图片描述

什么是方法重写

输出结果是子类中的结果
在这里插入图片描述

方法重写的其它注意事项
1)Override注解

1、重写的时候,可加入Override注解校对重写的格式,若格式有错,Override注解出现下划线报错。
2、加上注解,可读性更好
示例如下:
在这里插入图片描述

2)子类重写父类时,访问权限必须大于或等于父类方法的实现,public>protected>缺省

下图即为错误的示例,父类访问权限为protected,子类为缺省。
在这里插入图片描述
正确示例
在这里插入图片描述

重写重点:声明不变,重新实现

方法重写在开发中的常见应用场景

重写前,输出对象s,默认调用Object类中的toString方法,也可省略,但结果一致。
在这里插入图片描述
若重写Object类中的toString方法,则就近优先调用重写的子类的toString方法,而非父类的toString方法
在这里插入图片描述

toString在IDEA中快捷操作

1、在需要重写的地方,直接点击右键
在这里插入图片描述2、选中toString
在这里插入图片描述
3、都选中即重写了
在这里插入图片描述

总结

在这里插入图片描述

子类访问其它成员的特点

在这里插入图片描述

在子类中访问其它成员变量,采用就近原则

若子类和父类中有相同的成员变量,子类中仅调用成员变量名,访问的是就近的成员变量。
在这里插入图片描述
若子类的方法中有局部变量,访问的是就近的变量。
在这里插入图片描述

指定访问子类成员变量

若局部变量与子类成员变量冲突,访问指定子类成员变量名:this.name
在这里插入图片描述

指定访问父类成员变量

若局部变量、父类成员、子类变量冲突,访问父类成员变量:使用super.成员变量名
在这里插入图片描述

子类中访问其它成员方法,采用就近原则

在这里插入图片描述

指定访问父类成员方法

super.方法名
在这里插入图片描述

子类构造器的特点

在这里插入图片描述

无参构造器特点

子类的无参构造器会先调用父类的无参构造器,再调用自己的无参构造器
在这里插入图片描述
在这里插入图片描述

有参构造器特点

父类时无参构造器,子类是有参构造器。
调用子类时,子类的有参构造器会先调用父类的无参构造器,再调用子类自己的有参构造器
子类的全部构造器优先调用父类的构造器
在这里插入图片描述

子类的全部构造器优先调用父类的构造器的原因

每个子类方法内部第一行代码都有一个默认的super(),且super()可省略,super()会直接默认访问父类的构造器
在这里插入图片描述

若父类中为有参构造器

如何去掉父类的无参构造器,构造有参构造器。
若父类中的没有无参构造器,子类的有参和无参构造器会报错
在这里插入图片描述
若父类中为有参构造器
可在子类的super()方法中加入参数
在这里插入图片描述

常见的应用场景

在这里插入图片描述

代码示例

1、父类的代码
在这里插入图片描述
2、创建子类时,同时为子类对象中的三个成员对象赋值
1)错误示例
因为name和age在父类中,在子类中不能直接访问父类中的成员变量,为当前对象的age和name赋值。
在这里插入图片描述

2)正确示例
在这里插入图片描述

子类构造器为什么要先调用父类构造器

创建子类对象的时候,同时为子类中的三个成员变量进行赋值,由于引入继承,一个类拆分为两个类,处理数据的构造器被迫拆除了两张设计图中。
为了完整处理数据,子类对象在处理自己构造器的时候,需要先去父类构造器中处理name和age,然后再处理自己的skill,这样才能完整的处理数据,这就是先调用父类构造器的原因。
在这里插入图片描述
在这里插入图片描述

执行原理

在这里插入图片描述

this(…)调用兄弟构造器

在这里插入图片描述
使用场景:复用兄弟构造器中的代码
代码要求:若没填学校,则默认输出黑马程序员

优化后代码
在这里插入图片描述
在这里插入图片描述
注意事项:
一个构造器中不能同时出现super和this(…),因为super()和this(…)都要在第一行。
只有保证this(…)在构造器的第一行才能保证兄弟构造器可以及时访问父类的构造器。
在这里插入图片描述

问题:
同一个类中,有参构造器可以多个么?
若可以有多个有参构造器,那每个构造器的第一行代码都有super()

总结

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值