面向对象的三大特征
脱掉衣服的第六天
封装
1.什么是封装
从广义的角度来说,将经常使用的代码片段,定义到方法,是封装,将多个方法定义到类中也是封装。
从狭义角度来说,将类中的属性私有化,再通过共有方法进行修改访问。
2.为什么封装
数据保护,只暴露必要的接口,保护对象的内部状态不被外部直接修改
实现细节隔离。将变化隔离在类内部,外部代码不受影响。
3.如何封装
为了不让外界直接访问某些属性,用关键字private修饰这些属性。
提供公有的getter/setter的方法,用来操作这个被私有化的属性。
继承
1.什么是继承
继承是从有的类,派生出新的类,新的类中吸收已有的数据和行为,并能扩展新能力。
2.继承特点
只支持单继承,但支持多重继承,一个类只能有一个父类,但可以有多个子类,子类不会继承父类的构造方法和访问不了私有方法,并且至少有一个子类构造器调用父类的构造器。
3.继承中的构造器
在子类的构造方法中,使用super(有参传参)调用父类中存在的构造方法,而且super(有参传参)必须放在首行首句的位置上。因此可知,super(有参传参)和this(有参传参)不能在一个构造器中共存。
4.继承中的方法重写
什么是重写
对父类继承到的方法,进行重新实现,子类方法会覆盖调继承父类中的方法。
重写的特点
重写时,子类访问权限大于父类,返回值,方法名,参数要相同
@Override
用于判断是否是重写方法。
5.为什么单继承?
多继承会产生菱形问题,当一个类有两个父类,那么两个父类若有同名方法,那么子类就不知道继承哪个。
一个类继承了多个父类,可能会继承大量的属性和方法,导致类的接口变得庞大、难以理解和维护。此外,在修改一个父类时,可能会影响到多个子类,增加了代码的耦合度。
多态
1,什么是多态
多态的就是是指同一个行为具有多个不同表现形式或形态的能力。具体来说,一个父类引用变量可以指向一个子类对象,而这个引用变量可以调用在子类中重写的方法。
向上转型
父类引用变量指向子类对象
向上转型后的对象,将只能够访问父类中的成员(编译期间,看变量)如果调用的是重写过的方法,那么调用的一定是重写方法(运行期间,看对象)
向下转型(强转)
子类引用变量指向父类对象
可能会失败,失败的话,会报类造型异常ClassCastException可用instanceof做判断。
2.instanceof
可以用来测试一个对象是否为一个类的实例。
Object类型
Object是根类,所有的类都直接或间接继承Object类。
1.Object类中有什么方法?
toString方法
作用是将对象的信息变成字符串。 Object里返回的是 “类名@16进制” 。
equals方法
一般用来比较值是否相等,但是默认比的是地址,一般使用时要重写,
hashcode方法
调用hashcode方法会返回一个随机整型一般用于,哈希查找。
getClass方法
final修饰,获取一个指定的对象的类型。 这个方法,不能被重写。
finalize 方法
finalize()
允许对象在被垃圾回收前执行清理操作,执行时机不确定,不保证完成(异常回收也会继续),发现对象不可达时,首先会检查是否实现该方法,实现了和该方法就会加入Finalizer一个
队列,jvm会异步调用该方法,执行后才能被回收。wait 方法
配合 synchronized 使用,wait 方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥 有者,也就是具有该对象的锁。wait() 方法一直等待,直到获得锁或者被中断。wait(long timeout) 设定一个超时间隔,如果在规定时间内没有获得锁就返回。 调用该方法后当前线程进入睡眠状态,直到以下事件发生。
其他线程调用了该对象的 notify 方法;
其他线程调用了该对象的 notifyAll 方法;
其他线程调用了 interrupt 中断该线程;
时间间隔到了。
此时该线程就可以被调度了,如果是被中断的话就抛出一个 InterruptedException 异常。
notify 方法
配合 synchronized 使用,该方法唤醒在该对象上等待队列中的某个线程(同步队列中的线程是给 抢占 CPU 的线程,等待队列中的线程指的是等待唤醒的线程)。
notifyAll 方法
配合 synchronized 使用,该方法唤醒在该对象上等待队列中的所有线程
final修饰词
final可以用来修饰类,属性,方法,局部变量。
修饰类:不能被继承
修饰方法:不能被重写
修饰属性:不能二次赋值,即要么直接初始化,要么在构造器初始化
修饰成员变量:不能二次赋值
static修饰词
static修饰的内容,都是属于公有资源,不属于对象,而是属于类的,因此都是类名调用
修饰属性
使用时用类名点调用,常与final一使用用来定义常量。
修饰代码快
在类加载期间执行,只执行一次,适用于加载一些静态资源,比如图片,音频,视频等
修饰方法
类名调用,不能被重写
静态方法中,只能直接访问本类中的静态成员。不能访问非静态成员 非静态方法中,可以访问本类中的非静态成员和静态成员
static修饰类
static可以修饰类,但必须是内部类,(类体中可以再定义类结构)
所有静态的执行顺序
代码块
1.代码块
只要构造器调用一次,构造代码块就执行一次,利用每次创建对象的时候都会提前调用一次构造代码块特性,可以利用其做统计创建对象的次数,也可以为成员变量初始化。
2.静态代码块
用于在类加载时执行静态初始化操作。类首次被使用时;例如new对象。
练习题
5.1 面向对象有哪些特征,请展开说一说(面试题)
封装,继承,多态封装广义上说是将重复代码封装成方法,将方法封装成类,狭义角度上说,将属性封装成私有用公共方法进行数据操作。继承是子类可以继承父类的方法和属性,子类可以重写,也可以扩展新功能,一个子类只有一个父类,不能有多个父类因为会菱形问题,一个父类可以有多个子类,也可以多重继承。多态是指同一行为,会有多种不同行态或形势。
5.2 this()与super()的区别(面试题)
this()代表子类的构造方法 super()代表父类的构造方法
5.3 Overload与Override的区别(面试题)
Overload(重载)方法名相同,但参数列表不同 发生在同一个类中或父子类之间。 与返回值类型无关Override(重写)子类重新定义父类的方法,方法名、参数列表、返回值类型必须完全相同发生在继承关系中(子类覆盖父类方法)。
5.4 构造器是否可以被override? (面试题)
不可以
5.5 是否可以继承String类型(面试题)
不可以,String被final修饰是不可变的。