- 面向对象。
参照第二题。
- 平台无关性。
Java 是“一次编写,到处运行(Write Once,Run any Where)”的语言,因此采用 Java 语言编写的程序具有很好的可移植性,而保证这一点的正是 Java 的虚拟机机制。在引入虚拟机之后,Java 语言在不同的平台上运行不需要重新编译。
Java 语言使用 Java 虚拟机机制屏蔽了具体平台的相关信息,使得 Java 语言编译的程序只需要生成虚拟机上的目标代码,就可以在多种平台上不加修改地运行。
- 简单性。
Java 舍弃了很多 C++ 中难以理解的特性,比如操作符的重载和多继承等,而且 Java 语言加入了垃圾回收机制,解决了程序员需要管理内存的问题,使编程变得更加简单。
- 支持多线程。
Java 支持多个线程同时执行,并提供多线程之间的同步机制。
- 健壮性。
Java 的强类型机制、异常处理、垃圾回收机制等都是 Java 健壮性的重要保证。
- 高性能。
随着 JIT(Just in Time,即时编译)的发展,Java 的运行速度也越来越快。
第四题,Java 是 100% 面向对象吗?
不是的。Java 有 8 中基本数据类型,包括 boolean、char、byte、short、int、long、float 和 double,它们都不是对象。
第五题,什么是抽象?
抽象是指为了某种目的,对一个概念或一种现象包含的信息进行过滤,移除不相关的信息,只保留与某种最终目的相关的信息。例如,一个_皮质的足球_,我们可以过滤掉它的质料,得到更一般性的概念,也就是_球_。从另外一个角度看,抽象就是简化事物,抓住事物本质的过程。
在 Java 中,可以通过两种形式来体现抽象:抽象类和接口。
定义抽象类的时候需要用到关键字 abstract,放在 class 关键字前。
public abstract class AbstractPlayer {
abstract void play();
}
通过 extends 关键字可以继承抽象类。
public class BasketballPlayer extends AbstractPlayer {
@Override
void play() {
System.out.println(“我是张伯伦,篮球场上得过 100 分”);
}
}
接口是通过 interface 关键字定义的,它可以包含一些常量和方法。
public interface Electronic {
// 常量
String LED = “LED”;
// 抽象方法
int getElectricityUse();
// 静态方法
static boolean isEnergyEfficient(String electtronicType) {
return electtronicType.equals(LED);
}
// 默认方法
default void printDescription() {
System.out.println(“电子”);
}
}
通过 implements 关键字可以实现一个接口。
public class Computer implements Electronic {
public static void main(String[] args) {
new Computer();
}
@Override
public int getElectricityUse() {
return 0;
}
}
第六题,什么是封装?
封装将类的某些信息隐藏在类的内部,不允许外部程序直接访问,只能通过该类提供的方法来实现对隐藏信息的操作和访问。
例如,一台计算机内部极其复杂,有主板、CPU、硬盘和内存, 而一般用户不需要了解它的内部细节,不需要知道主板的型号、CPU 主频、硬盘和内存的大小,于是计算机制造商用机箱把计算机封装起来,对外提供了一些接口,如鼠标、键盘和显示器等,这样做了以后,用户使用计算机就非常方便了。
封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。
实现封装的具体步骤如下:
-
修改成员变量的可见性来限制对属性的访问,一般设为 private。
-
为每个成员变量创建一对赋值(setter)方法和取值(getter)方法,一般设为 public,用于属性的读写。
-
在赋值和取值方法中,加入成员变量控制语句(对成员变量值的合法性进行判断)。
public class Student {
private int id;
private String name;
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return this.id;
}
public String getName() {
return this.name;
}
public static void main(String args[]) {
Student student = new Student();
student.setId(1034);
student.setName(“沉默王二”);
System.out.println("学生 id " + student.getId());
System.out.println("学生姓名 " + student.getName());
}
}
第七题,抽象和封装有什么区别?
抽象只关注对象的相关数据,并隐藏所有可能无关行为的细节。它隐藏了背景细节,但强调了要点,以减少复杂性并提高效率。抽象关注的是思想而非事件。
封装将成员变量和方法绑定到单个类中,同时限制了对某些成员变量的访问。封装意味着隐藏成员变量以保护成员变量免受外部访问,从而使应用程序某一部分的更改不会影响其他部分。
-
抽象和封装在“定义”上的差异 —— 抽象通过隐藏不相关的细节来强调对象的所有基本方面,以提高效率并消除复杂性。封装是一种数据隐藏机制,它将数据包装在一个胶囊中以限制来自外界的访问。
-
抽象和封装在“功能”上的差异 —— 抽象仅强调使复杂程序更简单的基本功能,而封装则是将成员变量和操作成员变量的方法绑定到单个类中。
-
抽象和封装在“实现”上的区别 —— 抽象由抽象类和接口实现,而封装则通过访问权限修饰符来实现。
第八题,什么是继承?
继承是面向对象编程中非常强大的一种机制,在 Java 中使用 extends 关键字来表示继承关系。当创建一个类时,总是在继承,如果没有明确指出要继承的类,总是隐式地从根类 Object 进行继承。
class Person {
public Person() {
}
}
class Man extends Person {
public Man() {
}
}
Person 类隐式地继承了 Object 类,因此 Person 类也自动地拥有了 hashCode()
、equals()
、toString()
等方法。
Man 类继承了 Person 类,这样一来,Person 类就称为父类,Man类就称为子类。如果两个类存在继承关系,子类会自动继承父类的方法和成员变量,在子类中可以调用父类的方法和成员变量。
Java 只允许单继承,也就是说一个类最多只能显式地继承一个父类。但一个类却可以被多个类继承,也就是说一个类可以拥有多个子类。
第九题,什么是多态?
多态是同一个行为具有多个不同表现形式的能力,可以使程序具有良好的扩展性,并可以对所有类的对象进行通用处理。
在继承关系中,子类如果定义了一个与父类方法签名完全相同的方法,被称为方法重写(Override)。
public class Shape {
public void getArea() {
System.out.println(“形状”);
}
}
public class Rectangle extends Shape {
@Override
public void getArea() {
System.out.println(“矩形”);
}
public static void main(String args[]) {
Shape shape = new Rectangle();
shape.getArea();
}
}
方法重写和方法重载(Overload)不同,如果一个类有多个名字相同但参数个数不同的方法,我们通常称这些方法为方法重载。
public class Calculator {
public int subtract(int a, int b) {
return a - b;
}
public double subtract(double a, double b) {
return a - b;
}
public static void main(String args[]) {
Calculator calculator = new Calculator();
System.out.println("150 和 12 相差 " + calculator.subtract(150, 12));
System.out.println("15.5 和 15.4 相差 " + calculator.subtract(15.50, 15.40));
}
}
通过下面这幅图可以了解到,子类 Circle、Triangle、Square 继承了父类 Shape,并且重写了 draw()
方法用于绘制不同的形状。
方法重写用于提供父类已经声明的方法的特殊实现,是实现多态的基础条件。
第十题,怎么区分关联、聚合、组合?
能体现关联(Association)关系的例子有客户和订单之间的关系、公司和员工之间的关系、用户与电脑之间的关系。关联关系所涉及的两个类是处在同一层次上的。
class Computer {
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
果低效漫长且无助。**
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-2AUX4cMS-1714700186109)]
[外链图片转存中…(img-5RxxEtvb-1714700186110)]
[外链图片转存中…(img-THggBR1v-1714700186110)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!