Java面试题(四)
1.static关键字的作用
static可以修饰变量、方法、代码块和内部类
static属性属于这个类所有
可以对象创建后通过对象名.属性名和类名.属性名两种方式来访问
1.1在内存中份数不同
不管有多少个对象,static变量只有1份
static变量是属于整个类的,也称为类变量。
而非静态变量是属于对象的,也称为实例变量 。
1.2在内存中存放的位置不同
静态变量存在方法区中, 实例变量存在堆内存中

1.3访问的方式不同
实例变量 : 对象名.变量名 student1.name="Jacob";
静态变量:
对象名.变量名 student1.schoolName="希望小学";【不推荐】
类名.变量名 Student.schoolName="希望小学";【推荐】
1.4在内存中分配空间的时间不同
实例变量:创建对象的时候才分配了空间。
静态变量:第一次使用类的时候
Student.schoolName="希望小学";或者Student stu1 = new Student("小明","男",20,98);
static方法也可以通过对象名.方法名和类名.方法名两种方式来访问
static代码块。当类被第一次使用时(可能是调用static属性和方法,或者创建其对象)执行静态代码块,且只被执行
一次,主要作用是实现static属性的初始化。
static内部类:属于整个外部类,而不是属于外部类的每个对象。不能访问外部类的非静态成员(变量或者方法),
可以访问外部类的静态成员
2. final和abstract关键字的作用
final和abstract是功能相反的两个关键字,可以对比记
abstract:可以用来修饰类和方法,不能用来修饰属性和构造方法;使用abstract修饰的类是抽象类,需要被继承,使
用abstract修饰的方法是抽象方法,需要子类被重写。
final:可以用来修饰类、方法和属性,不能修饰构造方法。使用final修饰的类不能被继承,使用final修饰的方法不能被
重写,使用final修饰的变量的值不能被修改,所以就成了常量。
3.final、finally、finalize的区别
final:修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承例如:String
类、Math类等。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给
定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重写,但是能够重载。
使用final修饰的对象,对象的引用地址不能变,但是对象的值可以变!
finally:在异常处理时提供 finally 块来执行任何清除操作。如果有finally的话,则不管是否发生异常,finally语句都会
被执行。一般情况下,都把关闭物理连接(IO流、数据库连接、Socket连接)等相关操作,放入到此代码块中.。
finalize方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要清理工作。
finalize() 方法是在垃圾收集器删除对象之前被调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类
覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。 一般情况下,此方法由JVM调用,程序员不要去调用!
4. 写出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() 多线程中唤醒所有等待线程的功能
5.权限修饰符的区别
Java中有四种访问权限控制,大小情况:public》protected》default》private
| 同一个类 | 同一个包 | 子类 | 所有类 | |
| private | √ | |||
| default | √ | √ | ||
| protected | √ | √ | √ | |
| public | √ | √ | √ | √ |
6.继承条件下构造方法的执行过程
情况1:如果子类的构造方法中没有通过super显式调用父类的有参构造方法,也没有通过this显式调用自身的其他构
造方法,则系统会默认先调用父类的无参构造方法。在这种情况下,写不写“super();”语句,效果是一样的。
情况2:如果子类的构造方法中通过super显式调用父类的有参构造方法,那将执行父类相应构造方法,而不执行父
类无参构造方法。
7.==和equals的区别和联系
“==”是关系运算符,equals()是方法,同时他们的结果都返回布尔值;
“==”使用情况如下:
a) 基本类型,比较的是值
b) 引用类型,比较的是地址
equals()方法使用如下:
a) 系统类一般已经覆盖了equals(),比较的是内容。
8.谈谈Java的多态
多态性是OOP中的一个重要特性
实现多态的三个条件(前提条件,向上转型、向下转型)
1、继承的存在;(继承是多态的基础,没有继承就没有多态)
2、子类重写父类的方法。(多态下会调用子类重写后的方法)
3、父类引用变量指向子类对象。(涉及子类到父类的类型转换)
向上转型 Animal a = new Cat();
将一个父类的引用指向一个子类对象,称为向上转型,自动进行类型转换。此时通过父类引用变量调用的方法是子类 覆盖或继承父类的方法,而不是父类的方法,此时通过父类引用变量无法调用子类特有的方法.
向下转型 Cat a2 = (Cat)a;
将一个指向子类对象的引用赋给一个子类的引用,成为向下转型,此时必须进行强制类型转换。向下转型必须转换为 父类引用指向的真实子类类型,否则将出现ClassCastException,不是任意的强制转换.
9.简述Java的垃圾回收机制
传统的C/C++语言,需要程序员负责回收已经分配内存
显式回收垃圾回收的缺点:
1)程序忘记及时回收,从而导致内存泄露,降低系统性能。
2)程序错误回收程序核心类库的内存,导致系统崩溃。
Java语言不需要程序员直接控制内存回收,是由JRE在后台自动回收不再使用的内存,称为垃圾回收机制,简称GC;
1)可以提高编程效率。
2)保护程序的完整性。
3)其开销影响性能。Java虚拟机必须跟踪程序中有用的对象,确定哪些是无用的。
垃圾回收机制的特点:
1)垃圾回收机制回收JVM堆内存里的对象空间,不负责回收栈内存数据。
2)对其他物理连接,比如数据库连接、输入流输出流、Socket连接无能为力。
3)垃圾回收发生具有不可预知性,程序无法精确控制垃圾回收机制执行。
4)可以将对象的引用变量设置为null,暗示垃圾回收机制可以回收该对象。
垃圾回收机制回收任何对象之前,总会先调用它的finalize方法
程序员可以通过System.gc()
10.基本数据类型和包装类
1) 八个基本数据类型的包装类
| 基本数据类型 | 包装类 |
| byte | Byte |
| boolean | Boolean |
| short | Short |
| char | Character |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
2) 为什么为基本类型引入包装类
基本数据类型有方便之处,简单、高效。
3) 包装类和基本数据类型之间的转换
包装类------ wrapperInstance.xxxValue() ------>基本数据类型
包装类<---new WrapperClass(primitive)-- new WrapperClass(string)------基本数据类型
4)自动装箱和自动拆箱
JDK1.5提供了自动装箱(autoboxing)和自动拆箱(autounboxing)功能, 从而实现了包装类和基本数据类型之间
的自动转换
5)包装类还可以实现基本类型变量和字符串之间的转换
基本类型变量------------String.valueof()------------>字符串
基本类型变量<------------WrapperClass.parseXxx(string)------------字符串
若存在侵权,请联系,谢谢

浙公网安备 33010602011771号