目录
1.java平台无关性解释?
C/C++之所以不能跨平台,就是因为C/C++源程序是对平台编译的,所以与平台密切相关。如果有这样的一个环境:它既可以向下兼容(对平台兼容),又可以向上兼容(程序可以运行),那么不就可以跨平台了吗。基于这样的原理,Java在计算机的操作系统上又提供了一个Java运行环境——JRE(安装JDK)。 JRE由Java虚拟机,类库和一些核心文件组成,也就是说,只要平台提供了Java运行环境,Java编写的软件就可以在其上运行。 和C/C++不同的是,Java语言提供的编译器不针对特定的操作系统和CPU芯片进行编程,而是针对Java虚拟机把Java源程序编译成称为字节码的“中间代码”,然后Java虚拟机负责将字节码翻译成虚拟机所在平台的机器码,并让当前平台运行该机器码。
Java语言能够一次编译,处处运行,也就是Java跨平台的原因
在一个计算机上编译得到的字节码文件(就是.class文件),可以复制到任何一个安装了Java运行环境的计算机上直接运行。然后字节码文件由虚拟机负责解释执行,即Java虚拟机将字节码翻译成本地计算机的机器码,然后将机器码交给本地的操作系统运行。
2.java程序初始化的顺利是怎样的?
java程序初始化工作可以在许多不同的代码块中来完成,执行顺序为:父类静态变量、父类静态代码块、子类静态变量、子类静态代码块、父类非静态变量、父类非静态代码块、父类构造函数、子类非静态变量、子类非静态代码块、子类构造函数。
3.java的作用域有哪些?
作用域与可见性 | 当前类 | 同一package | 子类 | 其他package |
public | ✔️ | ✔️ | ✔️ | ✔️ |
private | ✔️ | ❌ | ❌ | ❌ |
protected | ✔️ | ✔️ | ✔️ | ❌ |
default | ✔️ | ✔️ | ❌ | ❌ |
若父类与子类位于同一个包内,则子类对父类的default成员变量或方法有访问权限。不同包则没有访问权限。
注意:修饰符只能修饰成员变量,不能来修饰局部变量。private和protected不能用来修饰类,只有public、abstract、final能用来修饰类。
4.什么是构造函数
构造函数是一种特殊的函数,用来在对象实例化时初始化对象的成员变量。特点有
- 构造函数必须与类名相同,并且不能有返回值。
- 每个类可以有多个构造函数,若开发人员没有提供构造函数,编译器在把源代码编译成字节码的过程中会提供一个无参构造函数。
- 构造函数总是伴随着new操作一起调用,程序员不能自己调用,必须由系统调用。
- 构造函数不能被继承,构造函数可重载(即构造函数的参数可以有0个,1个或多个)。
- 子类可以通过super关键字来显示的调用父类的构造函数,若父类没有提供无参数的构造函数时,子类的构造函数中必须显式的调用父类的构造函数。若父类提供了无参数的构造函数,此时子类的构造函数就可以不显式的调用父类的构造函数,在这种情况下编译器会默认调用父类提供的无参数的构造函数。
5.object中的方法
Object类是一个特殊的类,是所有类的父类,如果一个类没有用extends明确指出继承于某个类,那么它默认继承Object类 。object中的方法有getclass、hashcode、equals、clone、tostring、notify、notifyall、wait、finalize;
registerNatives() //对本地方法进行注册。
getClass() //返回此 Object 的运行类。
hashCode() //用于获取对象的哈希值。
equals(Object obj) //用于确认两个对象是否“相同”。
clone() //创建并返回此对象的一个副本。
toString() //返回该对象的字符串表示。
notify() //唤醒在此对象监视器上等待的单个线程。
notifyAll() //唤醒在此对象监视器上等待的所有线程。
wait(long timeout) //在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或 者超过指定的时间量前,导致当前线程等待。
wait(long timeout, int nanos) //在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量前,导致当前线程等待。
wait() //用于让当前线程失去操作权限,当前线程进入等待序列
finalize() //当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
6.什么是反射机制
Java反射说的是在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性。对于任何一个对象,我们都能够对它的方法和属性进行调用。我们把这种动态获取对象信息和调用对象方法的功能称之为反射机制。也就是所谓在运行过程中获取类的字节码文件,有三种方式获取class类。
public class Test01 {
public static void main(String[] args) {
//第一种:通过实例.getClass()
Test01 test01 = new Test01();
Class<? extends Test01> aClass = test01.getClass();
System.out.println(aClass.getName());//Test20190523.Test01
//第二种:通过类名.Class
Class<Test01> test01Class = Test01.class;
System.out.println(test01Class.getName());//Test20190523.Test01
try {
//第三种:通过Class.forName("类的路径")
Class<?> aClass1 = Class.forName("Test20190523.Test01");
System.out.println(aClass1.getName());//Test20190523.Test01
} catch (Exception e) {
e.printStackTrace();
}
}
}
7.面向对象有哪些特征?
1.抽象
2.继承
3.封装
4.多态