- 为什么java代码可以实现一次编写,到处运行?
Java虚拟机(JVM)是Java跨平台的关键。在程序运行前,Java源代码(.Java)通过编译器编译成字节码(.class)。在程序运行时,JVM负责将字节码翻译成特定平台下的机器码并运行。
跨平台的是Java程序,不是JVM,JVM是用C/C++开发的软件,平台不同需要安装的版本也不同。
- 一个Java文件可以有多个类吗(不包含内部类)?
一个Java文件里可以有多个类,但是最多只能有一个被public修饰的类;
如果这个Java文件包含public修饰的类,则这个类的名称必须和Java文件名一致。
Java内部类有成员内部类、静态内部类、方法内部类、匿名内部类。
- 成员内部类:成员内部类的创建需要依赖外部类对象,成员方法必须通过对象调用,并且内部类和外部类相互独立。
- 静态内部类:定义在外部类的内部,使用static修饰,类比静态方法,静态内部类不需要外部类对象产生就能使用,不能访问外部类的成员域,但能访问静态域。
- 方法内部类:定义在方法内部(类比于局部变量)
- 匿名内部类:继承一个抽象类或者接口,没有构造方法。
//匿名内部类
interface IMessage {
void fun();
}
public class noNameClass {
public static void main(String[] args) {
IMessage iMessage = new IMessage() {
@Override
public void fun() {
System.out.println("hello");
}
};
iMessage.fun();
}
}
- Java访问权限的相关内容?
Java提供了三种访问修饰符,private、protected、public,使用时可以形成4种访问权限,即private、default、protected、public,在不加任何修饰符时是default访问权限。
- 修饰成员变量和成员方法时:
private:该成员可以被类内部成员访问。
default:该成员可以被该类内部成员访问,也可以被同一包下其它类访问。
protected:该成员可以被该类内部成员访问,也可以被同一包下其它类访问,还可以被它的子类访问。
public:该成员可以被任意包下,任意类访问。 - 修饰类时,该类只有两种访问权限,对应访问权限含义如下:
default:该类可以被同一包下其它类访问。
public:该类可以被任意包下,任意类访问。
- 介绍一下Java的数据类型?
Java数据类型包括基本数据类型和引用数据类型两大类。
基本数据类型有8个,整数类型(byte/short/int/long)、浮点类型(float/double)、字符类型(char)、布尔类型(boolean)。这八个类型中,除了boolean类型之外其它7个类型都可以看作数字类型,他们之间可以进行类型转换。
引用类型是对一个对象的引用,根据引用对象类型不同,从引用对象来进行分类可以将引用类型分为三类,即数组、类、接口类型。引用类型本质就是通过指针,指向堆中对象所持有的内存空间。
引用类型有4类:
- 强引用:Java中的引用默认就是强引用,任何一个对象的赋值操作就产生了对这个对象的强引用。强引用的特性就是只要强引用存在,被引用的对象就不会被垃圾回收。
- 软引用:软引用只有在内存不足的情况下,被引用的对象才会被回收。
- 弱引用:弱引用引用的对象只要垃圾回收执行就会被回收,不管是否内存不足。
- 虚引用:跟踪对象被垃圾回收的状态,确保一种对象被回收之后做某些事情的机制。
- 请介绍全局变量和局部变量的区别?
Java中的变量是分为成员变量和局部变量(Java没有真正的全局变量,这是出于其它语言的习惯说成的全局变量),区别如下:
成员变量:
- 成员变量是在类的范围里定义的变量
- 成员变量有默认的初始值
- 未被static修饰的成员变量也叫实例变量,它存储于对象所在的堆内存中,生命周期与对象相同
- 被static修饰的成员变量也叫类变量,它存储于方法区中,生命周期与当前类相同
局部变量:
- 局部变量是在方法里定义的变量
- 局部变量没有默认的初始值
- 局部变量存储在栈内存中,作用的范围结束,变量空间会自动释放
- 请介绍一下实例变量的默认值?
实例变量若为引用数据类型,其默认值一律为null。若为基本数据类型,其默认值如下:
上述默认规则适用于所有成员变量,所以对于类变量(static修饰的成员变量)也是适用的。
- 为啥要有包装类?
Java语言是面向对象的语言,其设计理念是一切皆对象。但是八种基本数据类型不具备对象的特性。为了解决这个问题,Java为每个基本数据类型定义了一个对应的引用类型,这就是包装类。
- 说一说自动装箱、自动拆箱的应用场景?
- 自动装箱可以把基本数据类型的数据直接赋值给对应的包装类型
- 自动拆箱可以把一个包装类型的对象直接赋值给对应的基本类型
通过自动装箱、自动拆箱功能,可以简化基本数据类型变量和包装类对象之间的转换过程。
- 如何对Integer和Double类型判断相等?
Integer、Double不能直接进行比较,这包括:
- 不能用==进行直接比较,因为它们是不同的数据类型
- 不能转为字符串进行比较,因为转为字符串后,浮点值带小数点,整数值不带,这样它们永远不相等
- 不能使用compareTo方法进行比较,虽然它们都有compareTo方法,但该方法只能对相同类型进行比较
正解:整数、浮点类型的包装类都继承于Number类型,而Number类型分别定义了将数字类型转换为byte、short、int、long、float、double的方法。所以,可以将Integer、Double先转换为相同的基本数据类型(double),然后使用==进行比较。
- int和Integer有什么区别,两者在做==运算时会得到什么结果?
int是基本数据类型,Integer是int的包装类。两者在做==运算时,Integer会自动拆箱为int类型,然后再进行比较。如果两个int值相等则返回true,否则返回false。