51. 使用 new() 创建 String 与创建文字有何不同?
使用 new() 的字符串与文字不同,因为当我们声明字符串时,它将元素存储在堆栈内存中,而当使用 new() 声明时,它会在堆内存中分配动态内存。即使存在相同内容的对象,也会在堆内存中创建对象。
句法:
String x = new String("ABC");
52. Java 中的数组是什么?
Java 中的数组是一种数据结构,用于存储相同类型的固定大小元素序列。数组元素可以通过其索引访问,索引从 0 开始,直到长度减 1。Java 中的数组声明是借助方括号完成的,并且在声明期间还指定大小。
句法:
int[] Arr = new int[5];
53. Java 在哪些内存上创建数组?
Java 中的数组是在堆内存中创建的。使用 new 关键字创建数组时,将在堆中分配内存来存储数组的元素。在 Java 中,堆内存由 Java 虚拟机 (JVM) 管理,并且也在 Java 程序的所有线程之间共享。对于程序不再使用的内存,JVM 使用垃圾收集器来回收内存。Java 中的数组是动态创建的,这意味着数组的大小是在程序运行时确定的。数组的大小是在声明数组时指定的,一旦创建数组,就无法更改。
54. 数组有哪些类型?
有两种类型的数组,即原始数组和引用数组。
- 一维数组:只有一个维的数组,即整数数组或字符串数组,称为一维数组。
句法:
数据类型[] Array_Name = 新数据类型[ArraySize];
- 多维数组:具有两个或多个维度的数组,例如二维或三维数组。
55.为什么Java数组索引从0开始?
数组的索引表示距离数组起始点的距离。因此,第一个元素的距离为 0,因此起始索引为 0。
句法:
data_type[] Array_Name = new data_type[ArraySize];
- 多维数组:具有两个或多个维度的数组,例如二维或三维数组。
55.为什么Java数组索引从0开始?
数组的索引表示距离数组起始点的距离。因此,第一个元素的距离为 0,因此起始索引为 0。
句法:
[Base Address + (index * no_of_bytes)]
56. int array[] 和 int[] array 有什么区别?
int array[] 和 int[] array 都用于在 Java 中声明整数数组。它们之间的唯一区别在于语法,而功能上没有区别。
int arr[] 是一种用于声明数组的 C 风格语法。
int[] arr 是一种用于声明数组的 Java 风格的语法。
但是,一般建议使用 Java 风格的语法来声明数组。因为它易于阅读和理解,并且与其他 Java 语言结构更一致。
57. 如何在 Java 中复制数组?
在 Java 中,根据需要有多种方法可以复制数组。
- Java 中的 clone() 方法: Java 中此方法用于创建给定数组的浅表副本,这意味着新数组将与原始数组共享相同的内存。
int[] Arr = { 1, 2, 3, 5, 0};
int[] tempArr = Arr.clone();
- arraycopy() 方法:要创建数组的深层复制,我们可以使用此方法,它创建一个具有与原始数组相同值的新数组。
int[] Arr = {1, 2, 7, 9, 8};
int[] tempArr = new int[Arr.length];
System.arraycopy(Arr, 0, tempArr, 0, Arr.length);
- copyOf() 方法:此方法用于创建一个具有特定长度的新数组,并将原数组的内容复制到新数组。
int[] Arr = {1, 2, 4, 8};
int[] tempArr = Arrays.copyOf(Arr, Arr.length);
- copyOfRange()方法:这个方法与Java中的copyOf()方法非常相似,但是这个方法还允许我们指定从原始数组中复制元素的范围。
int[] Arr = {1, 2, 4, 8};
int[] temArr = Arrays.copyOfRange(Arr, 0, Arr.length);
58.你对锯齿数组有何理解?
Java 中的锯齿数组只是一个二维数组,其中数组的每一行可以具有不同的长度。由于二维数组中的所有行都具有相同的长度,但锯齿数组允许每行的大小具有更大的灵活性。当数据长度不同或需要优化内存使用时,此功能非常有用。
句法:
int[][] Arr = new int[][] {
{1, 2, 8},
{7, 5},
{6, 7, 2, 6}
};
59. 是否可以将数组设为易失性的?
在 Java 中,无法创建 volatile。Java 中的 volatile 关键字只能应用于单个变量,而不能应用于数组或集合。当变量被定义为 volatile 时,变量的值始终从主内存读取并写入主内存,而不是缓存在线程的本地内存中。这样可以更轻松地确保访问变量的所有线程都可以看到对变量所做的更改。
60. 数组的优点和缺点是什么?
数组的优点是:
- 通过数组可以实现对集合中任何元素的直接有效访问。可以使用 O(1) 操作访问数组的元素,这意味着执行此操作所需的时间是恒定的,并且与数组的大小无关。
- 使用数组可以有效地将数据存储在内存中。数组的大小在编译时已知,因为其元素存储在连续的内存区域中。
- 由于数据存储在连续的内存区域中,因此数组可以提供快速的数据检索。
- 数组易于实现和理解,是初学者学习计算机编程的理想选择。
数组的缺点是:
- 数组在创建时具有预定的大小,该大小是在当时选择的。这意味着如果需要扩展数组的大小,则需要创建一个新数组,并且需要将数据从旧数组复制到新数组,这会占用大量时间和内存。
- 如果数组的内存空间没有被完全占用,那么数组的内存空间中可能会有未使用的内存空间。如果你的记忆力很差,这可能会是个问题。
- 与链表和树等其他数据结构相比,数组可能由于其固定大小和对复杂数据类型的支持有限而显得僵化。
- 由于数组的元素必须全部属于同一数据类型,因此它不支持对象和结构等复杂数据类型。
61. 什么是面向对象范式?
范式的字面意思是一种模式或一种方法。编程范式是解决程序问题的方法,分为四种类型,即命令式、逻辑式、函数式和面向对象式。当使用对象作为应用方法、执行封装或继承功能的基础实体时,它被称为面向对象范式。
62. Java 中 OOP 的主要概念是什么?
Java 中 OOP 的主要概念如下:
- 集成
- 多态性
- 抽象
- 封装
63. 面向对象编程语言和基于对象的编程语言有什么区别?
面向对象编程语言 | 基于对象的编程语言 |
---|---|
面向对象的编程语言涵盖了更大的概念,如继承、多态、抽象等。 | 基于对象编程的范围仅限于对象和封装的使用。 |
它支持所有内置对象 | 它不支持所有内置对象 |
例如:Java、C#等等。 | 例如:Java 脚本、Visual Basics 等等。 |
64. Java 中的 'new' 运算符与 'newInstance()' 运算符有何不同?
new 操作符用于创建对象,但是如果我们想在运行时决定创建的对象类型,我们就没办法使用 new 操作符了。在这种情况下,我们必须使用 newInstance () 方法。
65. Java 中的类是什么?
在 Java 中,类是具有相似特征和属性的对象的集合。类表示创建对象的蓝图或模板。类不是现实世界的实体,但可以帮助我们创建现实世界的实体对象。
66. 静态(类)方法和实例方法有什么区别?
静态(类)方法 | 实例方法 |
---|---|
静态方法与类而不是对象相关联。 | 实例方法与对象而不是类相关联。 |
静态方法只需使用类名即可调用,而无需创建类的实例。 | 可以使用对象引用在类的特定实例上调用实例方法。 |
静态方法无权访问此关键字。 | 实例方法可以访问此关键字。 |
静态方法只能访问类的静态成员。 | 实例方法可以访问类的静态方法和非静态方法。 |
静态方法无法被重写,因为它们是在编译时解析的,而不是在运行时。这意味着编译器根据引用类型而不是对象类型来决定调用哪个方法。 | 实例方法可以被重写,因为它们是在运行时解析的,而不是在编译时。这意味着编译器根据对象类型而不是引用类型来决定调用哪个方法。 |
67. Java 中的 this 关键字是什么?
'this' 是用于引用指向当前对象的变量的关键字。
68. 什么是简要访问说明符和访问说明符的类型?
Java 中的访问说明符有助于限制类、构造函数、变量、方法或数据成员的范围。Java 中有以下四种类型的访问说明符:
- Public
- Private
- Protected
- Default
69. 定义为实例变量的对象引用的初始值是多少?
定义为实例变量的对象引用的初始值是 NULL 值。
70.什么是对象?
对象是具有特定属性和方法的真实实体。对象也被定义为类的实例。可以使用 new 关键字声明对象。
71. Java 中创建对象有哪些不同的方法?
Java 中创建对象的方法如下:
- 使用 new 关键字
- 使用新实例
- 使用 clone() 方法
- 使用反序列化
- 使用 Constructor 类的 newInstance() 方法
要了解有关在 Java 中创建对象的方法的更多信息,请参阅本文。
72.对象克隆的优点和缺点是什么?
使用对象克隆有许多优点和缺点,如下所述:
优点:
- 在 Java 中,'=' 赋值运算符不能用于克隆,因为它只是创建引用变量的副本。为了克服这种差异,可以使用 Object 类的 clone() 方法代替赋值运算符。
- clone() 方法是 Object 类的受保护方法,这意味着只有 Employee 类可以克隆 Employee 对象。这意味着除 Employee 之外的任何类都无法克隆 Employee 对象,因为它不知道 Employee 类的属性。
- 代码大小随着重复的减少而减小。
- 允许复制(有点像原型模式)手动初始化每个字段会产生大量代码,如果对象很复杂,则使用克隆会更快。
缺点:
- 由于 Object.clone() 方法受到保护,因此需要提供我们自己的 clone() 并从中间接调用 Object.clone()。
- 如果我们没有任何方法,那么我们需要提供一个 Cloneable 接口,因为我们需要提供 JVM 信息,以便我们可以在我们的对象上执行 clone()。如果没有,我们就不能克隆,如果我们只是从克隆方法返回 super.clone(),那么克隆会对字段进行浅拷贝,这可能会有问题。
73. 将其传递给方法而不是当前类对象本身有什么好处?
将其传递给方法而不是当前类对象本身有几个优点,包括:
- 这是最终变量,因此不能将其分配给任何新值,而当前类对象可能不是最终的,并且可以更改。
- 这可以在同步块中使用。
74.什么是构造函数?
构造函数是用于初始化对象的特殊方法。创建对象时会调用构造函数。构造函数的名称与类的名称相同。
例子:
// Class Created
class XYZ{
private int val;
// Constructor
XYZ(){
val=0;
}
};
75. 如果在类中没有提供构造函数会发生什么情况?
在Java中,如果类中没有提供构造函数,编译器会自动生成一个没有参数、没有操作的默认构造函数,该构造函数为默认构造函数。
76. Java 中使用了多少种类型的构造函数?
Java 中有两种类型的构造函数,如下所示:
- 默认构造函数
- 参数化构造函数
默认构造函数:不接受任何参数值的类型。用于设置对象属性的初始值。
class_Name();
// 调用默认构造函数
参数化构造函数:它是接受参数作为参数的构造函数类型。这些参数用于在对象初始化期间为实例变量赋值。
class_Name(参数1,参数2......);
// 作为参数传递的所有值将
相应地分配
77. 默认构造函数的用途是什么?
构造函数有助于创建类的实例,或者可以说是创建类的对象。构造函数在对象初始化期间调用。默认构造函数是一种不接受任何参数的构造函数,因此分配给对象属性的任何值都被视为默认值。
78. 你对Java中的复制构造函数如何理解?
复制构造函数是一种构造函数类型,我们将另一个对象作为参数传递,因为两个对象的属性看起来相同,这就是为什么构造函数似乎创建了一个对象的副本。
79. 在哪里以及如何使用私有构造函数?
如果您不希望任何其他类实例化该对象以避免子类化,则可以使用私有构造函数。示例中可以看到私有构造函数的使用。
例子:
// Java program to demonstrate implementation of Singleton
// pattern using private constructors.
import java.io.*;
class GFG {
static GFG instance = null;
public int x = 10;
// private constructor can't be accessed outside the
// class
private GFG() {}
// Factory method to provide the users with instances
static public GFG getInstance()
{
if (instance == null)
instance = new GFG();
return instance;
}
}
// Driver Class
class Main {
public static void main(String args[])
{
GFG a = GFG.getInstance();
GFG b = GFG.getInstance();
a.x = a.x + 10;
System.out.println("Value of a.x = " + a.x);
System.out.println("Value of b.x = " + b.x);
}
}
输出
Value of a.x = 20 Value of b.x = 20
80. 构造函数和方法有什么区别?
Java 构造函数用于初始化对象。在创建过程中,构造函数被调用来设置对象的属性,除了它们之间的一些基本区别之外:
- 构造函数仅在创建对象时被调用,但其他方法可以在对象的生命周期内被多次调用。
- 构造函数没有返回类型,而方法有返回类型,可以是
void
任何其他类型。 - 构造函数用于设置初始状态,但方法用于执行特定操作。
81. 什么是接口?
Java 中的接口是静态最终变量和抽象方法的集合,它们定义一组链接类的契约或协议。任何实现接口的类都需要实现一组特定的方法。它指定类必须表现出的行为,但不指定应如何实现的细节。
句法:
interface
{
// constant fields
// methds that are abstract by default
}
例子:
// Java Program to demonstrate Interface
import java.io.*;
interface Shape {
double getArea();
double getPerimeter();
}
class Circle implements Shape {
private double radius;
public Circle(double radius) { this.radius = radius; }
public double getArea()
{
return Math.PI * radius * radius;
}
public double getPerimeter()
{
return 2 * Math.PI * radius;
}
}
class GFG {
public static void main(String[] args)
{
Circle circle = new Circle(5.0);
System.out.println("Area of circle is "
+ circle.getArea());
System.out.println("Perimeter of circle is"
+ circle.getPerimeter());
}
}
输出
Area of circle is 78.53981633974483 Perimeter of circle is31.41592653589793
82. 给出界面的一些特点。
Java 编程语言中的接口被定义为用于指定类的行为的抽象类型。Java 中的接口是行为的蓝图。Java 接口包含静态常量和抽象方法。
该界面的特点如下:
- 该接口可以帮助实现完全的抽象。
- 允许我们在 Java 中使用多重继承。
- 即使一个类只能扩展一个类,任何类都可以实现多个接口。
- 它还用于实现松散耦合。
83. 什么是标记接口?
接口被视为空接口(没有字段或方法),称为标记接口。标记接口的示例包括 Serializable、Cloneable 和 Remote 接口。
84. 抽象类和接口有什么区别?
抽象类 | 接口类 |
---|---|
在抽象类中可以找到抽象方法和非抽象方法。 | 该接口仅包含抽象方法。 |
抽象类支持Final方法。 | 接口类不支持Final方法。 |
抽象类不支持多重继承。 | 接口类支持多重继承。 |
Abstract 关键字用于声明抽象类。 | Interface 关键字用于声明接口类。 |
extend关键字用于扩展抽象类。 | implements关键字用于实现接口。 |
抽象类具有受保护、私有等成员。 | 默认情况下,所有类成员都是公开的。 |
85. 数据封装是什么意思?
数据封装是将接口绑定在一起的类的 OOPS 属性和特征的概念。基本上,它将数据和对该数据进行操作的方法捆绑在一个单元内。封装是通过将类的实例变量声明为私有来实现的,这意味着它们只能在类内访问。
86.Java 中的封装有什么优点?
Java中封装的优点如下:
- 数据隐藏:这是一种通过隐藏实现细节来限制数据成员访问的方法。封装也提供了一种数据隐藏的方法。用户将不知道类的内部实现。
- 增加灵活性:我们可以根据需要将类的变量设为只读或只写。
- 可重用性:封装还提高了可重用性,并且易于根据新需求进行更改。
- 测试代码很容易:代码很容易进行单元测试。
87.封装的主要好处是什么?
Java 中封装的主要优点是它能够保护对象的内部状态免受外部修改或访问。它是一种隐藏类的实现细节以防止外部访问并仅公开可用于与类交互的公共接口的方法。它的主要好处是提供一种控制和管理对象状态和行为的方法,同时保护它免受修改和未经授权的访问。
例子:
// Java Program to demonstrate use of Encapsulation
import java.io.*;
class Person {
private String Name;
private int age;
public String getName() { return Name; }
public void setName(String Name) { this.Name = Name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
}
// Driver class
class GFG {
// main function
public static void main(String[] args)
{
Person p = new Person();
p.setName("Rohan");
p.setAge(29);
System.out.println("Name is " + p.getName());
System.out.println("Age is " + p.getAge());
}
}
输出
Name is Rohan Age is 29
88. 聚合是什么意思?
聚合是一个与两个类之间的关系相关的术语,最好将其描述为“具有”关系。这种类型是关联的最专业版本。它是一种单向关联,意味着它是一种单向关系。它包含对另一个类的引用,并且被认为拥有该类的所有权。
89. OOPs Java 中的“IS-A”关系是什么?
“IS-A” 是 OOPs Java 中的一种关系类型,其中一个类继承另一个类。
90. 定义继承。
当属于子类的对象获得来自超类的父对象的所有属性和行为时,这称为继承。类中的类称为子类,后者称为超类。子类或子类被称为特定的,而超类或父类则是通用的。继承提供了代码可重用性。
91. Java 中有哪些不同类型的继承?
继承是子类可以继承父类或父类的特征的方法。在 Java 中,继承有四种类型:
- 单继承:当子类或子类仅扩展一个超类时,称为单继承。单亲类属性将传递给子类。
- 多级继承:当子类或子类扩展任何其他子类时,就会创建一个继承层次,这称为多级继承。换句话说,一个子类成为另一个子类的父类。
- 层次继承:当多个子类从同一个父类派生时,称为层次继承。换句话说,一个只有一个父类的类有许多子类。
- 多重继承:当子类从多个父类继承时,称为多重继承。在 Java 中,它仅支持接口的多重继承,而不支持类的多重继承。
92. 什么是多重继承? Java 支持多重继承吗?
面向对象概念的一个组成部分称为多重继承,它允许一个类从多个父类继承属性。当具有相同签名的方法同时存在于超类和子类中时,就会出现问题。方法的调用者无法向编译器指定应调用哪个类方法,甚至无法指定应优先调用哪个类方法。
注意: Java 不支持多重继承
例子:
// Java Program to show multiple Inheritance
import java.io.*;
interface Animal {
void eat();
}
interface Mammal {
void drink();
}
class Dog implements Animal, Mammal {
public void eat() { System.out.println("Eating"); }
public void drink() { System.out.println("Drinking"); }
void bark() { System.out.println("Barking"); }
}
class GFG {
public static void main(String[] args)
{
Dog d = new Dog();
d.eat();
d.drink();
d.bark();
}
}
输出
Eating Drinking Barking
93. C++中的继承与Java有何不同?
C++ 中的继承 | Java 中的继承 |
---|---|
C++ 允许用户继承多个类。 | Java 不支持多重继承。 |
当在 C++ 中创建一个类时,它不会从对象类继承,而是独立存在。 | Java 总是被认为具有单一继承,因为所有类都以某种方式从对象类继承。 |
94. 使用继承有什么限制吗?
是的,在 Java 中使用继承有一个限制,因为继承可以从超类和接口中继承所有内容,因此子类过于聚集,并且在某些情况下进行动态覆盖或动态重载时有时容易出错。
95. 尽管继承是一个流行的 OOP 概念,但它的优势不如组合。解释一下。
继承是面向对象编程 (OOP) 的一个流行概念,其中一个类可以从任何其他类继承属性和方法,这些类被称为父类或超类。另一方面,在组合中,一个类可以包含另一个类的实例作为成员变量,这通常被称为部分或组件。以下是组合比继承更有利的一些原因:
- 紧密耦合:每当对超类进行任何更改时,这些更改都会影响其所有子类或子类的行为。这个问题会使代码变得不那么灵活,也会在维护期间产生问题。这个问题还会导致类之间的紧密耦合。
- 脆弱基类问题:对基类的更改可能会破坏其派生类的功能。此问题会使添加新功能或修改现有功能变得困难。此问题称为脆弱基类问题。
- 有限的重用: Java 中的继承会导致有限的代码重用以及代码重复。由于子类继承了其超类的所有属性和方法,有时它可能会得到不需要的不必要代码。这会导致代码库更难维护。
96. 什么是协会?
关联是两个独立类之间通过其对象建立的关系。它表示 Has-A 关系。
97. 聚合是什么意思?
组合是聚合的一种受限形式,其中两个实体彼此高度依赖。它代表关系的一部分。
98.Java的组成是什么?
组合意味着孩子不能独立于父母而存在的关系。例如,人的心脏,心脏不能独立于人而存在。
99. 说明组合和聚合之间的区别。
聚合 | 作品 |
---|---|
它定义了对象之间的“具有”关系 | 它代表了部分关系 |
对象彼此独立。 | 对象之间是互相依赖的。 |
使用实心菱形来表示它。 | 使用空心菱形来表示它。 |
子对象没有生命周期。 | 子对象有生命周期。 |
100.构造函数可以被继承吗?
不,我们不能继承构造函数。