Java Virtual Machine(JVM)是一个抽象的计算机,能够执行Java字节码。能针对不同的软件和硬件提供不同的JVM。因此JVM是平台独立的,JVM在平台上负责执行指令、字节码加载、检查和执行,同时还要管理数据、内存和寄存器。
Java 编译器将 Java 程序编译成虚拟机能够识别的二进制代码,这种代码称为字节码(Bytecode)。字节码就是虚拟机的机器指令,它与平台无关,有统一的格式,不依赖于具体的硬件环境,只运行在 JVM 上。JVM 在执行字节码文件时,把字节码解释成具体的机器指令执行。
Java 程序可以经解释器得到字节码,所生成的字节码经过精心设计,并进行优化,提高了运行速度。现在的 Java 版本中又加入了即时编译功能(just-in-time 编译器,简称 JIT 编译器),编译器将字节码转换成本机的机器代码,然后能够以较高速度执行,使得执行效率大幅度提高,基本达到了编译语言的水平。
在Java中,JVM将内存分配给不同的进程,方法和对象。 JVM分配的一些内存区域是:
即时编译器(Just In Time,也称为JIT编译器)用于提高Java的性能。 默认情况下启用。 它是在执行时(而不是更早)完成的。 Java通过将JIT编译器包含在JVM中来普及其使用。
Java是与平台无关的语言。 Java编译器将Java代码转换为可由JVM解释的字节代码。 JVM为世界上几乎所有流行的平台编写。
Java字节码可以相同的方式在任何受支持的平台上运行。 与其他语言一样,需要为特定平台编译的库才能运行。
你可以在Windows平台编写Java代码,同时在Windows上编译它。在Windows上编写的类和jar文件能够运行在Unix环境下。所以Java是真正的平台无关的语言。
所有这些可移植性的背后是Java字节码。 Java编译器生成的字节码可以由任何JVM解释。 因此,用Java编写程序并期望它们可以在任何平台上运行变得容易得多。
Java编译器javac
编译Java代码,而JVM java
运行该代码。
javac HelloWorld.java
java HelloWorld
在Java中,ClassLoader是用于在JVM中加载文件的类。 ClassLoader从其物理文件位置加载文件,例如 文件系统,网络位置等。
Java中有三种主要的类加载器:
jre/lib/ext
等位置加载类文件,或通过java.ext.dirs系统变量加载指定路径中的类库。CLASSPATH
,负责加载用户路径(classpath)上的类库。如果你指定了CLASSPATH
种jars
,那么类加载器就会加载它们。除了上述3种类加载器,我们也可以通过继承java.lang.ClassLoader实现自定义的类加载器。
不,main只是方法的名称。 一个类文件中可以有多个具有相同名称main的方法。 它不是Java中的关键字。
不,你不能这样写。 任何方法都必须首先指定修饰符,然后再指定返回值。 修饰符的顺序可以更改。
我们可以编写static public void main()
,而不是public static void main()
。
Java不会使用任何默认值初始化局部变量。 因此,这些变量默认情况下将为null。
默认情况下,Java中参数的String数组的值为空。
byte和char都是Java中的数字数据类型。 它们用于表示特定范围内的数字。 它们之间的主要区别是字节可以存储原始二进制数据,而char则可以存储字符或文本数据。
char的用法是 char ch ='x'
;
字节值的范围是-128至127。
一个字节由8位组成。 但是一个char由16位组成。 因此,它相当于2个字节。
答:面向对象编程的语言,像Java、C++遵循--封装、抽象、多态和继承等面向对象编程的概念。
基于对象编程的语言遵循一些面向对象语言的特点,但是不提供多态和继承的支持。比如:Javascript、VBScript等。
基于对象的编程语言提供对对象的支持,您可以从构造函数中构建对象。 他们的语言还支持封装。 这些也称为面向原型的语言。
Java中所有的实例变量的对象引用默认为null。
Java是一种面向对象的语言,我们可以在其中创建和使用对象。构造函数是一段类似于方法的代码。它用于创建对象并设置对象的初始状态。
构造函数是一个特殊的函数,具有与类名相同的名称。
没有构造函数,就没有其他方法可以创建对象。
默认情况下,Java为每个对象提供默认的构造函数。如果我们重载了一个构造函数,那么必须实现这个默认的构造函数。
如果没有定义其他构造函数,则默认构造函数是Java会自动生成的无参构造函数。
根据Java规范,如果类中没有重载的构造函数,它将提供一个默认的构造函数。但这并没有说明在类中编写重载构造函数的情况。
我们至少需要一个构造函数来创建一个对象,这就是Java提供默认构造函数的原因。
当我们重载了构造函数后,Java会假定我们希望在代码中进行一些自定义处理。由于此原因,它不提供默认构造函数。但是它需要按照规范的默认构造函数。因此,它会给出错误。
当我们用Java调用构造函数时,它返回由它创建的对象。 这就是我们用Java创建新对象的方式。
不能,Java不支持构造函数的继承。
如果将方法设置为final
,则意味着我们不希望任何类覆盖它。 但是构造函数(按照Java语言规范)不能被覆盖。 因此,没有必要将其标记为final
。
如果我们将方法设置为抽象方法,则意味着它没有主体,应在子类中实现。 但是,当使用new关键字时,将隐式调用构造函数。 因此,它需要一个body。
如果我们将方法设置为static
,则意味着它属于该类,但不属于特定对象。 始终调用构造函数来初始化对象。 因此,没有使用标记构造函数为静态的。
在Java中,”this“关键字是指对象的当前实例。this调用本类中的属性,也就是类中的成员变量。
this调用本类中的其他方法
this可以用来调用构造函数,或者用来引用实例。
this关键字除了可以引用变量或者成员方法之外,还有一个重大的作用就是返回类的引用
继承是面向对象编程概念中一个很重要的概念。一些对象具有某些特征和行为。通过使用继承,我们可以将常见的行为和特征放在基类(父类)中。
然后所有具有共同行为的对象都将从该基类继承。类似于“is-a”关系。
继承增加代码的可重用性、方法重写和多态性。
Java是一种面向对象的编程语言。在Java中,Object 类是其他所有类的父类。
多重继承意味着一个类可以从两个或者多个父类中继承行为。
多重继承的问题在于,对于同一个方法,两个父类可能具有不同的实现。因此,他们有不同的方式来做同一件事。在这种情况下,子类该选择哪种实现?
这导致多重继承中的歧义,所以Java在实现中不支持多重继承。
但是在Java中可以实现(implement)多个接口(interfaces)。
组合是整体和个体之间的关系,即has-a的关系,“has-a”关系涉及两个类。例如,Class Car有方向盘。
如何一个类拥有另一个的实例,则称为组合。
在OOPS中,聚合和组合是关联关系的类型。 组合是强关系。 如果组合对象被破坏,那么其所有部分都将被破坏。 例如。 汽车有方向盘。 如果Car对象被破坏,那么方向盘就没有意义。 在聚合中,该关系比组合弱。例如。 图书馆有学生。 如果图书馆被毁,学生仍然存在。 因此,图书馆和学生是通过聚合关联的。
图书馆有书。 如果图书馆被销毁,则书籍也将被销毁。 没有图书馆就不可能存在图书馆的书籍。 因此,书籍和图书馆是组合关系。
在Java中,有引用而不是指针。 这些引用指向内存中的对象。 但是不能直接访问这些存储位置。 JVM可以自由地在VM内存中移动对象。
缺少指针有助于Java有效地管理内存和垃圾回收。 此外,它还方便为开发人员提供有效的内存分配和释放。
在Java中,指针是等同于对象引用。 当我们使用。 它指向对象的引用。 因此,JVM使用指针,但是程序员仅看到对象引用。
如果对象引用指向空对象,并且我们尝试访问其上的方法或成员变量,则将获得NullPointerException。
“ super”关键字用于子类的方法或构造函数中。 它指对象的直接父类。
通过使用“ super”,我们可以从子类的方法中调用父类的方法。
我们也可以使用“ super”关键字从子类的构造函数中调用父类的构造函数。
不,Java不允许在同一构造函数中同时使用super()
和this()
。 根据Java规范,super()
或this()
必须是构造函数中的第一条语句。
Object.clone()
方法用于在Java中创建对象的完全拷贝。 它的行为就像复制一个构造函数。 它创建并返回对象的副本,该对象具有相同的类,并且所有字段的值与原始对象的值相同。
克隆的一个缺点是返回类型是Object。 必须将其显式转换为实际类型。