oop中级
1.包
import java.util.Scanner //只导入util包中的Scanner类
import java.util.*//导入util中的所有类
//建议使用第一种
2. 访问修饰符
四种访问修饰符:
-
public:对外公开
-
protected:对子类和同一个包中的类公开
-
默认:没有修饰符符号,向同一个包的类公开
-
private:只有类本身可以访问,不对外公开
3. 封装
封装就是把抽象出的数据(属性)和对数据的操作(方法)封装在一起,通过特定的方法来调用
属性私有,get、set
可以用构造器与set方法结合(把set方法丢进构造器中)
两个类的属性和方法有很多是相同的,如何办?
答:通过继承extends
基本语法:
class 子类 extends 父类{ }
子类能继承父类的所有属性和方法
细节:
-
子类继承了所有的属性和方法(只是有些属性或方法不能直接调用),但是私有属性和方法不能在子类直接访问,要通过公共的方法去访问(getN4方法)(callTest400方法)
-
子类必须调用父类的构造器,完成父类的初始化 super(); 默认调用父类的构造器
-
当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器(父类有参构造器覆盖),则必须在子类的构造器中用 super 去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不会通过
-
如果希望指定去调用父类的某个构造器,则显示的定义一下:super(参数列表)
-
super在使用的时候,必须放在构造器第一行(符合继承关系);super只能在构造器中使用
-
super() 和 this() 都只能放在构造器第一行,因此这两个方法不能共存在一个构造器
-
java所有类都是object的子类
-
父类构造器的调用不限于直接父类!将一直往上追溯直到Object类(顶级父类)
-
子类最多只能继承一个父类(指直接继承),单继承机制
-
不能滥用继承,子类和父类之间必须满足 is-a 的逻辑关系
继承的本质分析!!!
按照查找关系来返回信息:
-
首先看子类是否该属性
-
如果子类有这个属性,并且可以访问,则返回信息
-
如果子类没有这个属性,就看上级父类有没有这个属性(如果上级父类有该属性,并且可以访问,就返回信息。。。)
-
如果上级父类没有,就按照3的规则,继续找上级父类,直到Object。。。
-
如果一直找不到,或者找到了但不能访问,则提示没有方法,或者报错
super关键字
super代表父类的引用,用于访问父类的属性、方法、构造器(不能访问私有 (super. ))
细节:
-
调用父类构造器的好处 (分工明确,父类属性由父类初始化,子类属性由子类初始化)
-
当子类中有和父类中的成员 (属性和方法) 重名时,为了访问父类的成员(成员变量,成员方法),必须通过super。 如果没有重名,使用super、this、直接访问 是一样的效果。 当想要访问某个方法时,和访问变量查找关系基本一致(cal(); n1)
-
super的访问不限于直接父类,如果爷爷类和本类中有同名的成员,也可以使用super去访问爷爷类的成员;如果多个上级类中都有同名的成员,使用super访问遵循就近原则。(查找关系)
super和this的比较
方法重写(override)
概念:
子类有一个方法,和父类(或上级类)的某个方法的名称、返回类型、参数一样,我们就说子类的这个方法覆盖了父类(或上级类)的方法
方法重写条件:
-
子类方法的形参列表,方法名称,要和父类方法的形参列表,方法名称完全一样
-
子类方法的返回类型和父类方法返回类型一样,或者是父类返回类型的子类;比如 父类 返回类型是 Object,子类方法返回类型是String
-
子类方法不能缩小父类方法的访问权限 public->protected->默认->private
方法重写与重载的比较
5.多态
方法和对象具有多种形态,是面向对象的第三大特征,建立在封装和继承基础上
-
方法的多态:重写,重载
-
对象的多态(核心!!!)
对象的多态(核心!!!)
-
一个对象的编译类型和运行类型可以不一致(父类引用指向子类对象**)
-
编译类型在定义对象时,就确定了,不能改变
-
运行类型是可以变化的!!!(实际) (可以通过getClass()来查看运行类型)
-
编译类型看 = 左边,运行类型看 = 右边
细节:
-
多态的前提:两个对象(类)存在继承关系
-
多态的向上转型:父类的引用指向了子类的对象
向上转型调用方法的规则如下:
-
可以调用父类中的所有成员(须遵守访问权限);但是不能调用子类特有的成员
-
因为在编译阶段,能调用哪些成员,是由编译类型来决定的
-
最终运行效果看子类(运行类型)的具体实现;即调用方法时,按照从子类(运行类型)开始查找方法,(方法同名)
-
然后调用,规则与前面的查找关系一致
向下转型
-
语法: 子类类型 引用名 = (子类类型) 父类引用
-
只能强转父类的引用,不能强转父类的对象
-
要求父类的引用必须指向的是当前目标类型(子类)的对象
-
当向下转型后,可以调用子类类型中所有的成员
原来只有父类的引用指向子类对象,当向下转型后,这里子类类型的这个引用名也指向子类对象
多态注意事项和细节讨论
-
属性没有重写之说!属性的值看编译类型(属性同名)
-
instanceOf比较操作符,用于判断对象的运行类型是否为XX类型或XX类型的子类型
对象的比较看地址
动态绑定机制!!!
-
当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定(getI();方法)
-
当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用
多态数组(可与instanceof结合,判断是否 子类)
数组的定义类型为父类类型,里面保存的实际元素类型为子类类型(类似数组声明)extendes4
多态参数
extendes5
Object类详解
-
== 是一个比较运算符
(1).既可以判断基本类型,又可以判断引用类型
(2).如果判断基本类型,判断的是值是否相等
(3).如果判断引用类型,判断的是地址是否相同,即判断是否是一个对象
-
equals:是Object类中的方法,只能判断引用类型(对象)(判断String类型,一个字符一个字符判断是否一样)
String类一定重写equals方法
hashCode方法
-
提高具有哈希结构的容器的效率
-
两个引用,如果指向的是同一个对象,则哈希值是一样的
-
哈希值主要根据地址号来的!不能完全将哈希值等价于地址
toString方法
-
默认返回:全类名(包名加类名) + @ + 哈希值的十六进制
子类往往重写toString方法,用于返回对象的属性信息
-
重写toString方法:打印对象或拼接对象时,都会自动调用该对象的toString方法
-
当直接输出一个对象时,toString方法会自动调用
finalize方法
-
当对象被回收时,系统自动调用该对象的finalize方法。子类可以重写该方法,做一些释放资源的操作
-
什么时候被回收:当某个对象没有任何引用时(null),则jvm就会认为这个对象是一个垃圾对象,就会使用垃圾回收机制来销毁该对象,在销毁该对象前,会先调用finalize方法
-
垃圾回收机制的调用,是由系统来决定的(GC算法),也可以通过System.gc() 主动触发垃圾回收机制
6. 断点调试(debug)
在断点调试过程中,是运行状态,是以对象的运行类型来执行的
F7:跳入方法内
F8:逐行执行代码
shift + F8:跳出方法
F9:执行到下一个断点
练习题
this也可以访问到父类可以访问的属性或方法
7.IDEA快捷键
ctrl +alt + L : 快速格式化代码
ctrl + H :查看类的继承关系
ctrl + B : 定位方法

浙公网安备 33010602011771号