26、final、finally、finalize的区别
final修饰符(关键字):如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承例如:String类、Math类等。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重写,但是能够重载。 使用final修饰的对象,对象的引用地址不能变,但是对象的值可以变!
finally:在异常处理时提供 finally 块来执行任何清除操作。如果有finally的话,则不管是否发生异常,finally语句都会被执行。一般情况下,都把关闭物理连接(IO流、数据库连接、Socket连接)等相关操作,放入到此代码块中。
finalize:方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要清理工作。finalize() 方法是在垃圾收集器删除对象之前被调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。 一般情况下,此方法由JVM调用,程序员不要去调用!
27、写出java.lang.Object类的六个常用方法
(1)public boolean equals(java.lang.Object)
比较对象的地址值是否相等,如果子类重写,则比较对象的内容是否相等;
(2)public native int hashCode()
获取哈希码
(3)public java.lang.String toString()
把数据转变成字符串
(4)public final native java.lang.Class getClass()
获取类结构信息
(5)protected void finalize() throws java.lang.Throwable
垃圾回收前执行的方法
(6)protected native Object clone() throws java.lang.CloneNotSupportedException
克隆
(7)public final void wait() throws java.lang.InterruptedException
多线程中等待功能
(8)public final native void notify()
多线程中唤醒功能
(9)public final native void notifyAll()
多线程中唤醒所有等待线程的功能
28、private/默认/protected/public权限修饰符的区别
同一个类 | 同一个包 | 子类 | 所有类 | |
private | ✔ | |||
defailt | ✔ | ✔ | ||
protected | ✔ | ✔ | ✔ | |
public | ✔ | ✔ | ✔ | ✔ |
类的访问权限只有两种
- public 公共的:可被同一项目中所有的类访问。 (必须与文件名同名)
- default 默认的:可被同一个包中的类访问。
成员(成员变量或成员方法)访问权限共有四种:
- public 公共的:可以被项目中所有的类访问。(项目可见性)
- protected 受保护的:可以被这个类本身访问;同一个包中的所有其他的类访问;被它的子类(同一个包以及不同包中的子类)访问。(子类可见性)
- default 默认的:被这个类本身访问;被同一个包中的类访问。(包可见性)
- private 私有的:只能被这个类本身访问。(类可见性)
29、继承条件下构造方法的执行过程
继承条件下构造方法的调用规则如下:
- 情况1:如果子类的构造方法中没有通过super显式调用父类的有参构造方法,也没有通过this显式调用自身的其他构造方法,则系统会默认先调用父类的无参构造方法。在这种情况下,写不写“super();”语句,效果是一样的。
- 情况2:如果子类的构造方法中通过super显式调用父类的有参构造方法,那将执行父类相应构造方法,而不执行父类无参构造方法。
- 情况3:如果子类的构造方法中通过this显式调用自身的其他构造方法,在相应构造方法中应用以上两条规则。
特别注意的是,如果存在多级继承关系,在创建一个子类对象时,以上规则会多次向更高一级父类应用,一直到执行顶级父类Object类的无参构造方法为止。
30、==和equals的区别和联系
“==”是关系运算符,equals()是方法,同时他们的结果都返回布尔值;
“==”使用情况如下:
a) 基本类型,比较的是值
b) 引用类型,比较的是地址
c) 不能比较没有父子关系的两个对象
equals()方法使用如下:
a) 系统类一般已经覆盖了equals(),比较的是内容。
b) 用户自定义类如果没有覆盖equals(),将调用父类的equals (比如是Object),而Object的equals的比较是地址(return (this == obj);)
c) 用户自定义类需要覆盖父类的equals()
注意:Object的==和equals比较的都是地址,作用相同。
Java基础不扎实的同学,再好好学一下哦~
Java基础入门全套教程