JAVASE(十)面向对象:特性之多态性、Object类、代码块、关键字:static、final、父子类执行顺序
个人博客网:https://wushaopei.github.io/ (你想要这里多有)
1、面向对象的特性之:多态性
多态性的理解:事物的多种形态
1.1 广义上多态性的体现:
①方法的重写,重载。 ②子类对象的多态性
1.2 狭义上多态性的体现:
①子类对象多态性
1.3 何为子类对象多态性:
父类的引用指向子类的对象
1.4 多态性的应用:
虚拟方法调用:编译看左边,运行看右边
编译时:只能看到父类中的方法和属性
运行时:调用的是子类重写的父类的方法
1.5 多态性的说明:
思考?什么是多态性?
父类的引用指向子类的对象
思考?属性没多态性?
没
思考?如果需要调用子类中的特有的属性和方法怎么办?
向下转型
1.6 多态性使用的前提:
①必须继承关系 ②必须方法的重写
1.7 关于向上转型与向下转型:
向上转型: 多态
向下转型: 将父类的引用再强转成子类
图:
为什么要使用向下转型?
父类的引用指向子类的对象,编译看左边,运行看右边。在编译的时候只能看到父类中的属性和方法。当实际上在内存中也加载了子类中特的方法和属性。那我们需要调用子类中特有的方法和属性那么就需要向下转型。
说明:
①向下转型可能会出现: ClassCastException
②向下转型可以使用:强制类型转换符
③向下转型需要判断: instanceof
a instanceof A : a对象是否是A类的一个实例,如果是返回true,否则返回false
1.8 面试题:多态是编译时行为还是运行时行为?
运行时行为
2、Object
1.1 Object类的说明
- Object是所类的基类(父类
- 一个类如果没有显示的继承其它类,那么默认继承Object类
- Object类中11个方法(其中有3个是重载的方法)
- Object只一个空参的构造器
2.2 equals方法
一 Object中的equals方法
public boolean equals(Object obj) {
return (this == obj);
}
二 像系统中的String,Date等类,都重写了equals方法。
在自定义类中,如果没有重写equals方法那么比较的是对象的地址值。
往往我们调用equals方法时都是需要比较的是内容。所以自定义类中需要重写equals方法
2.3 toString方法
一 Object中的toString方法
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
二 像系统中的String,Date等类,都重写了toString方法。
在自定义类中,如果没有重写toString方法那么输出的是对象的地址值。
往往我们调用toString方法时都是需要输出对象中属性的内容。所以自定义类中需要重写toString方法
2.4 面试题?==和equals的区别?
== :基本数据类型 : 比较的是具体的数值
引用数据类型 : 比较的是对象的地址值。(两个地址是否指向同一块内存)
equals : 如果没重写equals方法那么调用的是Object中的equals方法比较的是地址值。一般我们都会重写equals方法进行内容的比较。
3、关键字static
3.1可以用来修饰的结构
属性,方法,内部类,代码块
3.2 static修饰属性
1.同一个类的多个对象各自拥有一份实例变量,多个对象共同拥有一份类变量。
2.当一个对象对类变量进行修改后,那么其它的对象看到的是修改后的类变量。
3.类变量是随着类的加载而加载,实例变量是随着对象的创建而加载。
4.类的加载只加载一次
5.类变量的调用 : 类名.类变量 对象名.类变量
3.3 static修饰方法
1.静态方法是随着类的加载而加载
2.静态方法的调用 : 类名.静态方法名 对象名.静态方法名
3.静态方法中不能调用非静态方法和实例变量,非静态方法中可以调用静态方法和实例变量。
4.类的加载优先于对象的创建
5.静态方法中不能使用this和super
3.4 内存解析
3.5 什么时候使用static修饰属性和方法
static修饰属性:
①当多个对象共同拥一份属性的时候 ②声明为常量时。Math.PI
static修饰方法:
①时需要调用类变量时,使用静态方法。 ②作为工具类中的方法时
4、 类的结构:代码块
4.1.代码块的作用:可以对类的属性、类的声明进行初始化操作
4.2.分类:静态代码块 vs 非静态代码块
格式:
静态代码块:static{}
非静态代码块: {}
注意:代码块只能被static修饰
4.3.说明
静态代码块:
- 是随着类的加载而加载,类的加载只加载一次(静态代码块只执行一次)
- 静态代码块的执行优先于非静态代码块
- 如果多个静态代码块,那么执行的顺序是从上到下依次执行
- 只能调用静态方法和类变量
非静态代码块:
- 随着对象的创建而加载,每创建一次对象就执行一次
- 非静态代码块的加载优先于构造器的调用。
- 如果多个非静态代码块,那么执行的顺序是从上到下依次执行
- 可以调用静态方法和类变量
5、属性的赋值顺序
属性赋值的方式 :1.默认值 2.显示赋值 3.构造器赋值 4.对象名.方法名,对象名.属性名 5.代码块
顺序 :1 -> 2/5(根据位置谁在上面谁先赋值) -> 3 -> 4
6、关键字final
Final修饰类 :不能被继承
Final修饰属性 :只能赋值一次,往往作为常量使用
Final修饰方法 :不能被重写
Final修饰的属性的赋值方式 :
1.显示赋值 2.代码块 3.构造器(每个构造器都要进行赋值
7、父类和子类的执行顺序
在父类、子类都有静态代码块、静态方法、构造方法情况下:具体的执行顺序如下:
- 执行父类的静态代码块
- 执行子类的静态代码块
- 执行父类的构造代码块
- 执行父类的构造方法
- 执行子类的构造代码块
- 执行子类的构造方法
JAVASE(十)面向对象:特性之多态性、Object类、代码块、关键字:static、final、父子类执行顺序的更多相关文章
- Java:面向对象(继承,方法的重写(overide),super,object类及object类中方法的重写,父子类代码块执行顺序)
继承: 1.继承是对某一匹类的抽象,从而实现对现实世界更好的建模. 2.提高代码的复用性. 3.extends(扩展),子类是父类的扩展. 4.子类继承父类可以得到父类的全部属性和方法.(除了父类的构 ...
- Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序
静态代码块:用staitc声明,jvm加载类时执行,仅执行一次构造代码块:类中直接用{}定义,每一次创建对象时执行.执行顺序优先级:静态块,main(),构造块,构造方法. 构造函数 public H ...
- C++ 不能在类体外指定关键字static
C++ static 函数的问题 近日读 C++ primer 中static 一章 , 有这么一句话, “静态成员函数的声明除了在类体中的函数声明前加上关键字static 以及不能声明为const ...
- JAVASE(九)面向对象特性之 : 继承性、方法重写、关键字super、
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 1.继承性 1.1 为什么要类的继承性?(继承性的好处) ①减少了代码的冗余,提高了代码的复用性:②更好 ...
- java的同步方法和同步代码块,对象锁,类锁区别
/** * @author admin * @date 2018/1/12 9:48 * 作用在同一个实例对象上讨论 * synchronized同步方法的测试 * 两个线程,一个线程调用synchr ...
- C#类、静态类、静态变量,初始化执行顺序
执行顺序: 类的静态变量 ↓ 类的静态构造函数 ↓ 类的普通变量 ↓ 基类的静态变量 ↓ 基类的静态构造函数 ↓ 基类的普通变量 ↓ 基类的构造函数 ↓ 类的构造函数
- Java类成员变量、普通成员变量、初始化块、构造方法的初始化和执行顺序
结论:执行的大致顺序如下, (1) 在一个不存在继承的类中:初始化static变量,执行static初始化块-->初始化普通成员变量(如果有赋值语句),执行普通初始化块-->构造方法 (2 ...
- 类加载器在加载类 的时候就已经对类的static代码块和static变量进行了初始化
类装载器ClassLoader 类装载器工作机制 类装载器就是寻找类的节码文件并构造出类在JVM内部表示对象的组件.在Java中,类装载器把一个类装入JVM中,要经过以下步骤: [1.]装载:查找和导 ...
- java 面向对象(二十):类的结构:代码块
类的成员之四:代码块(初始化块)(重要性较属性.方法.构造器差一些)1.代码块的作用:用来初始化类.对象的信息2.分类:代码块要是使用修饰符,只能使用static分类:静态代码块 vs 非静态代码块3 ...
随机推荐
- 【FreeRTOS学习01】CubeIDE快速整合FreeRTOS创建第一个任务
整个专栏主要是博主结合自身对FreeRTOS的实战学习以及源码分析,基于STM32F767 Nucleo-144平台,在CubeIDE下进行开发,结合官方的HAL库,将硬件环节的问题减少到最小,将精力 ...
- 201843 2019-2020-2 《Python程序设计》实验二报告
201843 2019-2020-2 <Python程序设计>实验二报告 课程:<Python程序设计> 班级: 1843 姓名: 李新锐 学号:20184302 实验教师:王 ...
- 反射,获取类的属性以及get方法
vo实体类: public class Result { /*** * 返回结果code * ok:10000 * error:20000 */ private String code; /*** * ...
- js 实时获取屏幕高度并赋值
var that = this; var h = 1344,w=750; var orderHight1 = document.body.clientHeight; var orderWidth1 = ...
- 这是一篇致力于解决Linux小白无法安装tunctl工具的文章
计算机网络——搭建Linux下的实验环境并成功安装tunctl 各位如果是来解决安装tunctl的问题的,请直接到2.2部分的内容. 这个学期终于迎来了计算机网络这门课程,也终于能够进一步了解让我无数 ...
- redis的哨兵集群,自动切换主从库
Redis-Sentinel是redis官方推荐的高可用性解决方案,当用redis作master-slave的高可用时,如果master本身宕机,redis本身或者客户端都没有实现主从切换的功能. 而 ...
- 利用Python科学计算处理物理问题(和物理告个别)
背景: 2019年初由于尚未学习量子力学相关知识,所以处于自学阶段.浅显的学习了曾谨言的量子力学一卷和格里菲斯编写的量子力学教材.注重将量子力学的一些基本概念了解并理解.同时老师向我们推荐了Quant ...
- element-ui的el-table和el-form嵌套使用表单校验
表格中嵌套使用表单验证 表格是el-table自动获取的后台数据,每行都有el-input的验证,这样一个rules的规则就不能匹配到每一行,所以要是用动态的prop和rules规则 需求如下,要对告 ...
- (数据科学学习手札84)基于geopandas的空间数据分析——空间计算篇(上)
本文示例代码.数据及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在本系列之前的文章中我们主要讨论了g ...
- 【网络安全】【02】Windows系统如何屏蔽自动更新
一.win键 + r ==> 输入 services.msc 二. win键 + r ==> 输入 gpedit.msc PS:我的电脑基本两年没有更新过了 -_-