一、基本功
1.面向对象的特征
面向对象四大特征:抽象、封装、继承、多态。
1.1 抽象
定义:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象,抽象只关注对象的属性和行为,并不关注这些行为具体的细节是干何事的。
抽象的过程:
(1) 研究事物的静态特征(属性)
(2) 研究事物的动态特性(行为)
(3) 形成结果(CLASS)
(4) 类和对象互相转变
eg:以学生为准:
学生有姓名,有年龄,有身份证号,这些都是静态特征,即属性
学生会吃饭,会睡觉,会学习,这些都是动态特征,即行为。
2.封装
定义:封装就是将一些可隐藏的东西都进行隐藏,通过自定义接口的方式进行访问。
2.1 提供构造方法
有个构造方法,才可通过new的方式去构建对象。
空参构造函数是默认存在,方法名称和类名称一样,不可具有返回结果。
当手动创建有参构造函数时,默认的构造函数就不存在了。
2.2 静态块
其初始化工作,在执行new之前。
2.3 控制访问权限
修饰符 | 同一类 | 同一包 | 子类 | 全局 |
private | √ | × | × | × |
default | √ | √ | × | × |
protected | √ | √ | √ | × |
public | √ | √ | √ | √ |
3.继承
关键词:extends
目的:对父类的方法进行复用
继承是从已有的类得到继承信息创建新类的过程。
继承子类中无需再重复定义属性和行为,直接继承父类,便有了父类的属性和行为。
访问修饰符可觉得是否可继承父类的属性和行为。
4.多态
多态(Polymorphism):是指具有表现多种形态的能力特征.更专业的说法是:同一个实现接口,使用不同的实例而执行不同的操作.
多态的三个条件:
(1)继承的存在(继承事多态的基础,没有继承就没有多态)
(2)子类重写父类的方法(多态下调用子类从写的方法)
(3)父类引用变量指向子类对象(子类到父类的类型转换)
多态是指允许相同或不同子类类型的对象对同一消息做出不同响应。
4.1重载:同一个动作作用在一个对象上拥有不同的解释 overload
重载又称静态多态,编译时多态
4.2重写:同一个动作作用在不同对象拥有不同的解释 override
从写又称动态多态,运行事多态
二、final、finally、finalize的区别
1.final
final可以用来修饰类、方法和变量(成员变量和局部变量)。
1.1修饰类
当final修饰类时,表名该类不可被其他类所继承,当我们需要一个类不被其他类继承时,此时可以用final来修饰。(final类中所有的成员方法都会隐式的定义为final方法)
1.2修饰方法
使用final修饰方法主要的原因:
(1).把方法锁住,已防止继承对其修改。
(2).效率,在早期的java版本中,会将final方法转为内嵌使用。
注意:若父类中的final方法访问权限为private,将导致子类中不能直接继承该方法。因此,此时可以在子类中定义相同方法名的函数,此时不会与重写的final的矛盾,而是在子类中重新的定了了新方法。
1.3修饰变量
final成员变量表示为常量,只能被赋值一次,赋值后其值不再改变。
当final修饰一个基本数据类型时,表示该基本数据类型的值一旦在 后便不能发送变化;如果final修饰的是一个引用类型时,则在对其初始化之后便不能再让其指向其他对象了,但该引用所指向对象的内容可以发送变化的。
final修饰一个成员变量(属性),必须要显示初始化。
在java中,String被设计成final类,那为什么平时使用时,String的值可以被改变呢?
字符串常量池是java堆内存中一个特殊的存储区域,当我们建立一个String对象时,假设常量池不存在该字符串,则创建一个,若存在则直接引用已经存在的字符串。当我们对String对象值改变的时候,例如 String a="A"; a="B" 。a是String对象的一个引用(我们这里所说的String对象其实是指字符串常量),当a=“B”执行时,并不是原本String对象("A")发生改变,而是创建一个新的对象("B"),令a引用它。
2.finally 异常的统一出口
2.1不管try块是否异常,也不管哪个catch执行,finally块都会执行
2.2 try块必须和catch块或和finally同在,不可单独存在,二者必须出现一个。
2.3不要在finally中使用return或throw语句,否则将会导致try、catch的return或throw失效。
3.finalize
finalize是java提供的垃圾回收释放内存使用的。
3.1 对象可以不被垃圾回收:java的垃圾回收遵循一个特点,就是能不回收就不回收。只要程序没有达到即将用完的地步,对象占用的对象就不会被释放。如果程序自动结束,而且垃圾回收器没有释放申请的内存会随着程序的正常退出,申请的内存会自动交还给操作系统。
3.2 垃圾回收只回收内存,而且只能回收内存中由java创建对象方式(堆)创建所占用的那一部分对象,无法回收其他资源,比如文件操作的句柄,数据库的连接等等。
3.3 调用垃圾啊回收器(GC)不一定保证垃圾回收器的运行。
3.4尽量避免使用finalize():
(1)finalize()不一定被调用,因为java的垃圾回收器的特性就决定了它不一定被调用。
(2)就算finalize()函数被调用,它被调用的时间充满了不确定性,因为程序中其他程序的优先级远远高于finalize()函数的线程优先级。也许等到finalize()被调用,数据库的连接池或者文件句柄早就耗尽了。
(3)如果一种未被捕获的异常在使用finalize()方法时被抛出,这个异常不会被捕获,finalize方法的终结过程也会终止,造成对象处于破坏的状态。被破坏的对象又很可能导致部分资源无法被回收,造成浪费。
(4)finalize()和垃圾啊回收器本身就要耗费资源,也许会导致程序暂时停止。