Java 语言是什么呢,首先来看维基的介绍吧:
Java is a high-level, class-based, object-oriented programming language that is designed to have as few implementation dependencies as possible.
high-level 是从编程语言的层次性来说的。计算机内的语言层次从低到高分别是机器语言、汇编语言,高级语言,应用程序语言等等。其中,机器语言是能被计算机直接执行的零一二进制字串,而汇编语言则用助记符来表示机器语言的指令。例如 MOV BX, AX 指令可以将数据从寄存器 AX 复制到寄存器 BX。如 java 语言这样的高级语言则同具体的系统架构进一步分离,从而更加便于程序的移植和维护。
在Java中,class(类)是一种用来描述对象的模板,它定义了对象的属性和行为。一个class包含了对象的数据(称为字段或属性)和方法(称为方法或函数)。通过定义class,我们可以创建多个对象(实例),这些对象都会共享该class所定义的属性和行为。
比如我们可以定义一个 car 类,在平面上则需要具有 x,y 坐标等变量,以及 move 进行四处移动的方法(函数)。
// 定义一个抽象类 Car
abstract class Car {
// 声明x和y坐标变量
int x;
int y;
// 抽象方法 move,用于移动车辆
public abstract void move(int newX, int newY);
}但是仅仅如上代码并不能给出 move 函数的具体实现,我们只是在一个抽象的层面上对 car 的客观实在进行了简化。为了能够最终通过 java 代码创建一个 car 的实例,我们还需要与之对应的实现类:
class MyCar extends Car {
// 实现move方法,移动车辆到指定的坐标
@Override
public void move(int newX, int newY) {
this.x = newX;
this.y = newY;
System.out.println("The new position is:" + "(" + newX + ", " + newY + ")");
}
}其中我们需要特别注意extends 关键字和@override 关键字。extends用于创建类的继承关系。当一个类继承另一个类时,它会继承父类的属性和方法,从而可以重用父类的代码并添加自己的特定功能。而@override是一个注解,用于告诉编译器,该方法是重写(override)父类中的方法。
通过继承和覆写,我们可以增加新函数或者修改原有函数的功能,从而构建高度具有可拓展性的代码。
(Object-orinted)面向对象本身是一种编程观念,要求把设计的系统组件具有封装、继承和多态三种特性。
封装(Encapsulation)是面向对象编程中的一个重要概念,它指的是将数据(属性)和操作数据的方法(方法)捆绑在一起,形成一个独立的单元。通过封装,我们可以隐藏对象的内部细节,只暴露一些接口供外部使用,从而实现了信息隐藏和保护数据的安全性。
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String newName) {
this.name = newName;
}
public int getAge() {
return age;
}
public void setAge(int newAge) {
if(newAge > 0) {
this.age = newAge;
}
}
public void speak() {
System.out.println("大家好,我是" + name + ",今年" + age + "岁啦!");
}
}
public class Main {
public static void main(String[] args) {
Person person1 = new Person();
person1.setName("小明");
person1.setAge(20);
person1.speak();
}
}
其中私有访问修饰符 private可以用来限制类的成员(字段或方法)只能在本类内部访问,而无法被外部类访问。其它控制访问权限的还有public、protected 等,访问权限如下:
| 关键字 | 访问权限 | 同一类 | 同一包 | 子类 | 其他包 |
|---|---|---|---|---|---|
| private | 私有的 | 可见 | 不可见 | 不可见 | 不可见 |
| protected | 受保护的 | 可见 | 可见 | 可见 | 不可见 |
| public | 公共的 | 可见 | 可见 | 可见 | 可见 |
继承(inheritance)刚刚已经讲过,通过关键字 extends 得以实现,是一种面向对象编程的特性,它允许一个类(称为子类)继承另一个类(称为父类)的属性和方法。
比如我们有一个动物类,包括(Animal),包括名称、年龄等私有变量,以及吃和睡两种属性。
那么继承动物类的狗类(Dog)就可以在继承中增加新的属性如品种(breed),新的方法如狗叫(bark)以及玩(play)等等:
相应代码如下:
class Animal {
private String name;
private int age;
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public void eat() {
System.out.println(name + " is eating.");
}
public void sleep() {
System.out.println(name + " is sleeping.");
}
}
class Dog extends Animal {
private String breed;
public Dog(String name, int age, String breed) {
super(name, age);
this.breed = breed;
}
public void bark() {
System.out.println(name + " is barking.");
}
public void play() {
System.out.println(name + " is playing.");
}
}
public class Main {
public static void main(String[] args) {
Dog myDog = new Dog("Buddy", 5, "Golden Retriever");
myDog.eat();
myDog.sleep();
myDog.bark();
myDog.play();
}
}通过面向基本类型的继承,我们可以避免重复的属性和方法设置,增加代码的复用性。
多态(Polymorphism)指的是同一个方法调用可以在不同对象上有不同的行为。这意味着父类的引用可以指向子类的对象,通过父类的引用调用重写的方法时,实际上会调用子类中的方法。例如同样对于“吃”这个动作来说,猫要吃鱼,而狗喜欢啃骨头。这样,动物类中的吃便需要在子类猫和狗中分别给予相应实现,如下所示:
相应地我们可以给出 java 伪码:
class Animal {
public void eat() {
System.out.println("动物在进食");
}
}
class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫在吃鱼");
}
}
class Dog extends Animal {
@Override
public void eat() {
System.out.println("狗在啃骨头");
}
}
public class Main {
public static void main(String[] args) {
Animal animal1 = new Cat();
Animal animal2 = new Dog();
animal1.eat(); // 输出:猫在吃鱼
animal2.eat(); // 输出:狗在啃骨头
}
}在这段代码中,Main 类中的两个动物在执行时分别会调用System.out.println(“狗在啃骨头”);和System.out.println(“猫在吃鱼”) 两个方法,依赖的正是在子类中@Override 对父类方法的覆写以及创建实例是对相应子类的调用。
当然,除此之外,面向对象其实还有很多内容,例如 SOLID 原则,以后我们会一一讲到。
面向对象编程范式的基本愿景就在于尽可能减少系统组件之间耦合性以及增加对于系统功能的内聚性。
按照德梅斯的意见,系统本身由三部分组成,要素、内在联结和功能/目标。例如一个社会团体,当他们出于某种理由保持对于其它社区的进攻姿态时,这种进攻作为实现掠夺目标的功能就会要求成员之间减少不必要的仇怨或者思念,并以服从有益进攻的指令为社区的价值标准。
而在编程中,试想一个文本编辑器,包括窗口处理,文本缓冲区处理,鼠标/键盘事件响应等模块。
在低耦合的状态下,当其中一个模块出现问题时,便不必考虑其它模块,修改内部的相应内容即可,从而降低代码修改成本。另外一个好处是,在文本编辑器这种主类中对三个模块进行聚合的时候,又可以不必过多考虑更改具体的实现细节,直接修改组件之间的依赖关系即可。
另外低耦合高内聚对于我们日常工作也很有启发,反映在 ZTD 中意味着一次只做一件事(低耦合)以及用于整合各个子目标的清单系统。你每天列出最重要的三件事,然后集中精力一次做完一件,效率自然就会比漫无目的浏览各种信息高很多
那么怎么安装 Java 呢?
很简单,从官网下载 jdk,解压到你喜欢的文件夹中。然后将 bin 目录增加到你的环境变量中就可以啦。

下面简单说一下环境变量的添加方法。
Win 搜索环境变量,

打开后进入环境变量

进入之后找到 path 变量,选中进行编辑。

然后新建变量,把你的 java/bin 目录填充进去即可。

vim ~/.bashrc输入以下内容:
export JAVA_HOME=/usr/java/jdk-22.0.2
export PATH=$PATH:$JAVA_HOME/bin在命令行/bash 中输入 java 和 javac 没有报错即可。其中 java 是用来执行 java 程序字节码的命令。而 javac 是把 java 源码编译成字节码的命令。一般我们编译 java 程序都需要经过 javac 和 java 这两步。
至于 jvm 的概念,我们就放到以后再讲吧。
其实 emacs 就非常适合 java,只需要在配置文件.~/.emacs 中增加一条关于 java 的编译命令,就可以进行简单的 java 编程了:
(setq compile-command "javac Main.java")
(defun run-java ()
(interactive)
(compile "javac Main.java")
(compile "java Main"))
(global-set-key (kbd "C-c r") 'run-java)或者你也可以考虑 eclisp 和 netbeans,从官网下载安装即可。
或许你在使用 netbeans 的过程中会遇到中文支持的问题,我的环境是 jdk22和 netbeans22,在这里给出我的解决方案吧:
File-Project Properties-Run-VM options-Customize,增加属性:
Dstdout.encoding=UTF-8
Dstderr.encoding=UTF-8
具体界面如下:


设置完成后我们来测试一段经典程序:
public class Hello {
public static void main(String[] args) {
System.out.println("你好,世界!");
}
}
可以看到执行得很顺利。

以上就是本篇文章的内容,介绍了从 java 语言的基本概念到安装方法。如果有什么想法或建议,欢迎您在评论区留言。感谢您的观看。