最近小编抽空汇总了一些Java面试一些基础和常用到的一些知识点,希望对即将要面试的大家提供一些帮助,后期这个专栏会不定期更新,大家敬请期待
-
面向对象编程有哪些特征(面试率⭐⭐⭐ 难度⭐⭐)
一、抽象
1.什么是抽象
抽象是面向对象编程的重要概念,它允许我们从一个类中提取共同的特征,并将其封装在一个抽象基类中,以便于代码的重用和扩展。抽象类和接口是实现抽象的两种方式,它们可以定义一些方法的声明,但没有方法的实现。抽象类是用于实例化对象的基类,而接口是只包含方法声明的一组规范。
2.抽象在代码中的具体体现
// 定义一个抽象基类Animal
abstract class Animal {
String name;
Animal(String n) {
name = n;
}
abstract void makeSound();
void eat() {
System.out.println(name + " is eating.");
}
}
// 定义一个继承自Animal的子类Dog
class Dog extends Animal {
Dog(String n) {
super(n);
}
void makeSound() {
System.out.println(name + " says: 汪汪汪!");
}
}
// 定义一个继承自Animal的子类Cat
class Cat extends Animal {
Cat(String n) {
super(n);
}
void makeSound() {
System.out.println(name + " says: 喵喵喵!");
}
}
public class AbstractExample {
public static void main(String[] args) {
Animal myDog = new Dog("Rufus");
Animal myCat = new Cat("Whiskers");
myDog.makeSound(); // 输出: Rufus says: 汪汪汪!
myCat.makeSound(); // 输出: Whiskers says: 喵喵喵!
}
}
在上面的示例代码中,Animal是一个抽象基类,它定义了一个抽象方法makeSound(),同时提供了一个非抽象方法eat()。Dog和Cat是继承自Animal的子类,它们分别实现了makeSound()方法,从而满足了抽象基类的要求。在AbstractExample类的main方法中,我们创建了一个Dog对象和一个Cat对象,并调用它们的makeSound()方法,输出了相应的声音。这展示了抽象类和接口可以提供一种可扩展的方式来组织和管理代码。
二、封装
1.什么是封装
封装是一种将数据和操作数据的方法打包在一个对象中的编程技术。它将数据和操作数据的方法封装在一个对象中,并对外部提供一种访问这些数据和方法的方式。这样可以隐藏实现细节,只暴露出需要对外部可见的内容,从而提高程序的安全性和可维护性。
2. 封装在代码中的具体体现
下面是一个用Java代码实现封装的例子:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
}
三、继承
1.什么是继承
继承是一种面向对象编程的重要概念,它允许一个类(称为子类或派生类)从另一个类(称为父类或基类)继承属性和方法。子类可以使用父类的属性和方法,而无需重新编写代码。这种关系使得代码可重用,提高了开发效率。
2.继承在代码中的具体体现
// 父类
class Animal {
String name;
public Animal(String name) {
this.name = name;
}
public void eat() {
System.out.println(name + " is eating.");
}
}
// 子类
class Dog extends Animal {
public Dog(String name) {
super(name);
}
public void bark() {
System.out.println(name + " is barking.");
}
}
// 创建对象并调用方法
public class Main {
public static void main(String[] args) {
Dog dog = new Dog("Buddy");
dog.eat(); // 输出: Buddy is eating.
dog.bark(); // 输出: Buddy is barking.
}
}
在上面的代码中,Dog 类继承了 Animal 类。Dog 类添加了一个 bark 方法,并重写了 Animal 类的 eat 方法。在 Main 类中,创建了一个 Dog 对象并调用了方法,输出了相应结果。
四、多态
1.什么是多态
多态是面向对象编程的重要概念,它允许使用相同的接口访问不同类的对象。多态性可以通过重写父类的方法来实现,这样子类就可以以自己的方式实现父类的方法。多态性还可以通过重载函数来实现,这样可以根据参数的数量和类型来调用正确的函数。多态性可以提高代码的可扩展性和可维护性。
2.多态在代码中的具体体现
// 父类 Animal
public class Animal {
public void makeSound() {
System.out.println("The animal makes a sound");
}
}
// 子类1:Dog
public class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("The dog barks");
}
}
// 子类2:Cat
public class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("The cat meows");
}
}
// 主函数
public static void main(String[] args) {
Animal animal1 = new Dog(); // 创建一个Dog对象并赋值给Animal类型的变量
Animal animal2 = new Cat(); // 创建一个Cat对象并赋值给Animal类型的变量
animal1.makeSound(); // 调用Animal类型变量的makeSound方法,实际调用的是Dog类的makeSound方法
animal2.makeSound(); // 调用Animal类型变量的makeSound方法,实际调用的是Cat类的makeSound方法
}
上述代码中,Animal类是一个父类,而Dog和Cat类是Animal类的子类。每个子类都重写了父类的makeSound方法,并实现了自己的声音。在主函数中,我们创建了两个Animal类型的变量,分别存储了Dog和Cat对象。当我们调用它们的makeSound方法时,实际上会调用各自子类的方法,输出不同的声音。这就是多态的体现,即使用共同的接口访问不同的类对象。
-
JDK和JRE的区别(面试率⭐⭐⭐ 难度⭐⭐)
1.什么是JDK
JDK(Java Development Kit)是Java开发工具包,它包含了一系列用于开发和调试Java应用程序的工具,包括编译器、调试器、文档等。JDK还包含Java运行环境(JRE),用于支持Java的计算机系统上运行Java程序。此外,JDK还包含其他一些用于开发的工具如Java虚拟机(JVM)、Java核心类库和其他必要组件
2.什么是JRE
JRE(Java Runtime Enviroment)是Java运行环境,他是一套软件,用于在支持Java的计算机系统上运行Java程序。JRE包含了Java虚拟机(JVM)、Java核心嘞库和其他Java运行时必要的组件。它使得Java程序可以在不同的操作系统上运行,而无需修改代码
3.JDK和JRE的区别
JDK和JRE都是Java的软件开发工具包,但它们的功能不同。JDK包含了一系列用于开发和调试Java应用程序的工具,包括编译器、调试器、文档等。而JRE之包含Java虚拟机、Java核心类库和其他必要的组件,用于在支持Java的计算机系统上运行Java程序。因此,JDK比JRE多了一些用于开发的功能
-
Java中的关键字(面试率⭐ 难度⭐)
关键字 | 含义 | 描述 | 实例 |
---|---|---|---|
import | 引用类 | 用于导入其他类文件中的类。当我们使用import关键字时,它可以指定要导入的类的包名,这样我们就可以在代码中使用该类了。如果没有使用import关键字,我们需要指定完整的类名才能使用该类。import还可以导入整个包,这样我们就可以在代码中使用该包下的所有类了。 | |
class | 定义类 | 类是一种自定义的数据类型,它可以封装数据和方法,用于描述现实世界中的对象。在Java中,我们可以使用class关键字来定义一个类,类中可以包含变量(成员变量)和方法(成员方法),也可以包含内部类、接口等。通过类,我们可以创建对象,实现面向对象编程。 | |
interface | 定义接口 | 接口(Interface)是Java中的一种抽象类型,它定义了一组方法和常量,但没有实现。接口可以用来为不同的类定义共同的行为,实现代码的复用。类可以实现一个或多个接口,通过实现接口中的方法来实现类的功能。接口还可以用来定义类之间的协议,规定类之间如何进行交互。通过使用接口,可以提高程序的可扩展性和可维护性。 | |
abstract | 抽象类或抽象方法 | 用于定义抽象方法和抽象类。抽象方法没有方法体,只有方法的声明,实现留给子类;抽象类不能被实例化,只能被子类继承。使用abstract关键字可以定义一个抽象方法,表示该方法的实现留给子类来实现。抽象类和抽象方法的目的是为了提供一个框架,要求子类必须实现其中的方法,以保证子类的行为符合预期。 | |
super | 引用父类 | 用于引用父类的成员变量和方法。它可以用来调用父类的构造方法,访问父类的成员变量和方法,以及调用父类的静态方法。super还可以在子类中重写父类的方法时,用来引用父类的同名方法。在继承关系中,super是一个指向父类对象的引用 | |
extends | 继承类 | 用于实现继承。它允许一个类(子类)继承另一个类(父类)的属性和方法。子类可以使用父类的属性和方法,同时还可以添加自己的属性和方法。通过继承,可以减少代码的重复,并且可以更好地组织和管理代码。 | |
implements | 实现接口 | 用于实现接口。它用于声明类或接口如何实现某个特定的功能集合。当一个类使用implements关键字来实现一个或多个接口时,它必须实现接口中定义的所有方法。这样可以确保类具有特定的功能,并且可以与其他类进行正确的交互。 | |
private | 私有权限 | 1.private是Java语言中访问修饰符的一种,用于限制类成员的访问权限。当一个成员变量或成员方法被声明为private时,它只能在类的内部被访问,无法被类的外部访问。 2.被private修饰的成员变量通常被称为私有成员变量,它们只能在类的内部进行赋值和访问。私有成员变量通常用于封装类的实现细节,隐藏实现的具体逻辑,只提供公共的接口给外部使用。 3.被private修饰的成员方法被称为私有方法,它们也只能在类的内部被访问。私有方法通常用于实现类的内部逻辑,不被类的外部直接调用 | |
protected | 保护权限 | 1.protected是一个访问修饰符,它可以应用于类、方法和成员变量。 2. 当应用于类时,表示该类中的所有成员对于该类的子类和同一包中的类是可见的,但在其他包中则不可见。 3.当应用于方法时,表示该方法对于该类的子类和同一包中的类是可见的,但在其他包中则不可见。 4.当应用于成员变量时,表示该成员变量对于该类的子类和同一包中的类是可见的,但在其他包中则不可见。 | |
public | 公开权限 | public是一个访问修饰符,在Java中使用。当一个成员(方法、属性、内部类等)被声明为public时,它可以从程序的任何地方访问到。 具体来说,public有以下几个特点: 1. 公共成员可以在当前类的所有方法和属性中使用。 2. 公共成员可以被其他类、其他包中的类访问。 3. 公共成员是强制性的,如果一个成员没有被声明为public、protected、private之一,默认就是private | |
final | 不可继承、不可重写、常量 | 在Java中,关键字final用于修饰类、方法和变量,用来表示不可变性,表示该类不能被继承,该方法不能被重写,该变量不能被重新赋值 | |
static | 静态属性 | static是Java中的一个关键字,它有以下几个作用: 1. 静态变量:使用static关键字声明的变量是类变量,被类的所有对象共享,而不是每个对象有一份独立的变量。静态变量可以在类的任何地方被访问,不需要创建类的对象。 2. 静态方法:使用static关键字声明的方法是类方法,可以直接通过类名调用,不需要创建类的对象。静态方法不能访问非静态方法和变量,也不能调用非静态方法。 3. 静态初始化块:使用static关键字声明的初始化块可以在类加载时执行一些初始化操作,优先于构造方法执行。 4. 静态导入:使用static关键字导入类中的静态成员,比如静态方法和静态变量。 5. 静态内部类:使用static关键字声明的内部类称为静态内部类,它可以在类外被访问,并且可以继承静态和非静态内部类的所有方法和成员。 6. 静态链接:使用static关键字加载类时,会先加载静态成员,然后再加载非静态成员。 7. 静态分析:使用static关键字可以在不创建对象的情况下对类进行分析,比如反射机制。 总之,static关键字用于声明与类相关联的成员,提供了一种更高效、更灵活的方式来访问类的成员。 | |
synchronized | 线程同步 | synchronized关键字可以用来修饰类、方法或代码块,其作用是保证在特定的线程中只有一个线程可以访问被synchronized修饰的部分代码。 1. 当synchronized用来修饰类时,代表该类的方法都是同步的,即在任意时刻只有一个线程可以访问该类的方法。 2. 当synchronized用来修饰方法时,代表该方法中的代码都是同步的,即在任意时刻只有一个线程可以访问该方法。 3. 当synchronized用来修饰代码块时,可以在代码块前指定synchronized关键字,后面加上一个对象锁,代表该代码块是同步的,即在任意时刻只有一个线程可以访问该代码块,并且多个线程访问同一对象的不同代码块时是并发执行的。 synchronized可以用于解决多线程并发访问共享资源时出现的数据竞争、死锁等问题,通过保证同一时间只有一个线程可以访问共享资源,从而避免多个线程同时修改共享资源引发的不可预期的问题。 | |
do-while | 循环 | do-while循环是一种循环结构,它会先执行一次循环体,然后再判断循环条件是否满足。与while循环不同,do-while循环至少会执行一次循环体 | |
switch-case-default | 选择结构 | switch-case是一种选择结构,用于根据一个表达式的值来执行不同的代码块。它的基本结构是,先对表达式进行匹配,然后根据不同的匹配结果执行相应的代码块 | |
break/continue | 结束/继续循环 | ||
catch | 异常处理 | ||
finally | 最后处理 | ||
throw | 手动抛出一个异常 | ||
throws | 声明要抛出的异常 |
保留关键字 | 含义 |
---|---|
goto | 跳转 |
const | 常量 |
特殊关键字 | 含义 |
---|---|
true | 真 |
false | 假 |
null | 空值 |
如有错误和不合适的地方欢迎大家在评论区留言指出!