编者按:
本文主要为新手或小白而写的Java入门认知和学习指南。初步计划写三四篇,以便初学Java编程的同学能更好的认知Java、掌握Java编程中核心备忘清单以及进阶学习中应该了解的热门应用框架。有经验的Java人员可略过此篇。也欢迎各位新同学留言咨询。
关于2022年Java的预测和假设,请参考:Java 2022:值得一看的价值预测和假设
何为Java?
Java就是基于面向对象编程系统 (Object-Oriented Programming Systems ,OOPS) 概念的面向对象编程语言(Object-Oriented Programming Language)。
Java 中的一切都与对象有关。如果你掌握了对象的本质,Java 就像吃你最喜欢的食物一样简单和讨人喜欢。
问题来了,既然就像食物,那就有很多的编程语言好的,但是为什么要学习 Java呢?
1.为什么是Java?
简单来讲,因为Java 就像您最喜欢的各种美味(易于编码)和健康(安全且健壮)的食物!
除了 Java 是 2021 年的顶级热门编程语言之一,并且可能至少还会保持十年这样的事实之外,Java 几乎在您能想到的每个领域都取得了成功!
由于 Java 是安全的和多线程的,因此非常适合银行和交易管理服务。电子商务商店和计费软件的逻辑是在基于 Core Java 的框架中编写的。比如 Android 这样的移动操作系统也是使用 Java API的;股票市场算法基于 Java;最近以来的所有大数据——海量数据都用 Java 处理得轻而易举。实际上,Hadoop 的 MapReduce 框架是用 Java 编写的。 Java 与 Spring 等其他框架形成了强大的组合,可以对金融和 IT 领域的实现依赖项进行有序化处理,并编写相应的服务器端应用程序。
2.何为Java编程?
Java 是由 Sun Microsystems 开发的“一次编写、随处运行”的编程语言。它类似于 C 和 C ,但要容易得多。您可以将 Java 与许多技术(如 Spring、node js、Android、Hadoop、J2EE 等)结合起来,构建健壮、可扩展、可移植和分布式的成熟应用程序。 Java 还使用 Selenium 等工具促进持续集成和测试。
3.Java简史
Java 最初是由 James Gosling 和他在 Sun Microsystems 的同事在 1990 年代初期开发的。最初,它被称为“Oak”项目,其实现类似于 C 和 C 。 Java 这个名字是经过充分的头脑风暴后选定的,它是来自咖啡豆的名称。 Java 1.0,第一个版本于 1995 年发布,标语是“一次编写,随处运行”(write once, run anywhere)。后来,Sun Microsystems 被甲骨文收购。从那以后,再也没有回头。 Java 的最新版本是 2021 年 9 月发布的 Java 17(一个长期支持版)。
4.Java的特点
Java 提供了许多吸引人的特性—
- Ø 平台无关语言。
- Ø 丰富的标准库使其易于编码。您可以使用 Java 创建一个完整的独立应用程序。
- Ø Java 支持自动内存分配和释放(称为垃圾收集)。
- Ø 它提供了出色的性能,因为 Java 支持多线程和并发性,从而使其成为一种高度交互和响应性的语言。
- Ø 安全简单。
- Ø ……
要了解有关 Java 功能特性的更多信息,请查阅官网的文章。
5.何为Java平台?
您一定听说过很多关于 Java 作为编程语言的信息。但是,你知道它也是一个“平台”吗? Java 平台是一个纯软件平台,与 Windows、Mac、Linux 或 Solaris 等传统平台截然不同。前者运行在后者平台的硬件之上。 Java 程序通过 Java 虚拟机,将字节码转换为本地代码,从而使程序可以在任何设备上运行!这意味着您不需要单独的特定于机器的编译器来运行 Java 代码。这就是 Java 也被称为平台的原因。 Java 编程语言不同于 Java 平台。 Java 编程语言可帮助您构建应用程序。您用 Java 编程语言编写的内容是在现有的程序和工具集合(统称为 Java 平台)的帮助下开发和运行的。 Java平台由JDK、JVM和JRE组成。
Java 编程语言有四种 Java 平台——
- Ø Java SE(Java 平台,标准版)
- Ø Java EE(Java 平台,企业版,现在为Jakarta EE)
- Ø Java FX(可以认为是更高级的Swing,但可开发移动应用)
- Ø Java ME(Java平台,微型版,终端电子设备)
虽然可以在 Java SE 平台上构建独立应用程序,但大多数万维网(互联网)都依赖于 Java EE。 Java ME 适用于小型设备(如手机)上的应用程序。
Java 有三个主要架构性组件 – JVM、JDK 和 JRE。
JDK( Java Development Kit) 即Java 开发工具包,是开发人员编写代码并通过 JRE(Java Runtime Environment,即 Java 运行时环境)来运行它的地方。
代码是如何转译或翻译的?那是通过 Java 虚拟机 (JVM)来完成的。使用 JVM,任何用 Java(或任何其他语言——支持字节码的)编写的代码都可以转换为 Java 字节码。任何机器都可以基于操作系统实现此代码。 JVM 与 Java 包(库)一起驻留在 JRE 中以为Java程序服务。
简而言之:
- ü JDK:包含JRE 开发工具,如解释器(类加载器)、编译器(javac)、jar 文件(打包和存档)以及 javadocs等。
- ü JVM:执行 java 字节码的抽象机器。由描述 JVM 实现、实际实现程序和 JVM(运行时)实例的规范文档组成,可在其中运行主程序。
- ü JRE:JVM 的物理实现(运行时实例)。它包含 JVM 用于运行程序的库包和支持文件。
如果有电脑,可以在阅读本文时尝试一些事情以为练习:在本地系统上安装 JDK(Java 开发工具包)和 JRE(Java 运行时环境)。要下载最新版本,请到Java官网。
然后,您可在系统上安装一个 IDE 以处理我们将学习的概念。 Eclipse 是我使用的一个很好的 IDE,它很容易设置并且不会让你感到麻烦。您可以下载 Eclipse 或 Easy Eclipse。 Easy Eclipse 是 Eclipse 的轻量级版本,功能较少,适合初学者。还有其他更多 IDE,如netbeans,JDeveloper、 IntelliJ IDEA、BlueJ等——从Java 9开始,可以在JShell中开始初步的java编程学习了,为初学者提供了便捷的学习支持。
如果您现在不想做任何这些,而只想阅读 一下关于Java,那很好!只需继续阅读,掌握概念,然后随时开始编码!
哦,这里有个很好的 初学者的Java 课程,您在学习了基础知识后会喜欢上它!@牛旦IT课堂 专栏内有,如《Java从入门到实战(极速版)》
6.术语和编程认知
在我们开始编码之前,让我们熟悉一些术语——
每个 Java 程序都是由类或接口定义的不同类型对象的集合构成。这是基本结构——
class School {//由好几个其它对象和实例变量组成public String schoolName;public int ID;Teacher[] teachers;Student[] students;…..// 以及其它一些方法public int getSchoolName(){}}
逻辑都在方法内部,可以像类的 getter 和 setter 方法一样简单,也可以像基于多个条件从数据库中获取某些内容一样复杂!
我们来写一个简单的程序,当我们学习更多 Java 概念时,我们会添加扩展它。
请注意,就像任何其他编程语言一样,Java 中的每个独立程序都应该由一个 main 方法来执行。
创建一个 Test 类,并向其添加一些简单的代码,示例如下:
class Test{ public static void main(String args[]){ int rollNumber = 36; String name = “Solo”; System.out.println(“My name is ” name “ and my roll number is ” rollNumber); }}
这段代码的每一行都会陆续学习,简要介绍如下:
- l class – 此关键字用于创建 java 类。当你运行程序时,你会用命令 javac Test.java 来编译代码,然后 java Test.java 来执行程序。如果您使用的是 IDE,则只需右键单击该类并选择“运行”。
- l public – public 是指示可见性的访问修饰符。 main 方法不能将访问修饰符设为私有(访问修饰符)。私有方法只能在类内调用,而公共方法对所有人可见。
- l static – 变量和方法可以使用 static 关键字修饰。为什么 main 方法是静态的?对于静态方法,我们不必创建对象就可使用。因此,我们不必创建 Test 对象来调用 main 方法。
- l void – 如果方法不返回任何值,则其类型设置为 void。
- l int, String – 这是 Java 使用的众多数据类型中的两种。因为它也使用原始类型,所以 Java 不被视为完全面向对象的语言。
- l System.out.println – out 是 System 类的静态字段。该字段存储 PrintStream 类的实例。 println() 是此类的方法,它将所需的输出打印到控制台。
让我们稍微修改一下这个程序,以获取用户输入的名称和卷号。有很多方法可以做到这一点。对于这段代码,让我们使用最常用的方法——Scanner 类。要使用这个类,我们需要先将类进行导入: import java.util.Scanner;
在之前的代码中,在 System.out.println (…) 之前,让我们添加以下几行代码——
Scanner scanInput = new Scanner(System.in);System.out.println("Enter name: ");name = scanInput.nextLine();System.out.println("Enter roll number: ");rollNumber = scanInput.nextInt();
运行此程序时,系统会提示您"Enter name:",然后"Enter roll number:"。
另一种方法是通过 BufferedReader,这是传统的方法,但它有太多难以记住的包装。
我们来了解更多学生的信息——他们的姓名、登记号和科目。科目将在数组中,对于该程序,假设一名学生将修读 3 个科目。
将数组定义为 :
String[] subjects = new String[3];//获取学生的所有科目信息for(int j=0; j<subjects.length;j ){ subjects[j] = scanInput.next();}
这里我们使用 for 循环从用户那里获取科目并将其存储在 String 数组中。最新的java版本中for循环的语法已经改变,但这种语法更容易使用。 ‘j’是一个从0开始的临时计数器。注意j的变化。
subject.length 获取数组的长度,在本例中为 3。
要查看数组的内容,可通过 Arrays.toString(subjects)来查看,或输出到控制台。
如我们所见,我们有三个变量 name、rollNumber 和 subject,它们都属于一个公共实体 Student。那么,为什么不创建一个类并将所有 3 个变量作为该类的成员呢?当我们将它们用作对象时,添加、修改和删除数据会更容易!所以,我们来创建一个类 Student.java,如下所示:
public class Student { int rollNumber = 0; String name = ""; String[] subjects = new String[3];}
我们将不得不更改代码以创建此类的对象,并通过 getter 和 setter 方法访问变量。 getter 和 setter 方法的一个例子如下:
public int getRollNumber() { return rollNumber;}public void setRollNumber(int rollNumber) { this.rollNumber = rollNumber;}
在使用IDE时 ,IDE可以为您创建所有这些内容提供快捷方式,但对于初学练习来讲,最好还是自己完成。
现在,让我们回到我们的主程序。
我们已经拥有一个学生的所有数据,为什么不获取更多学生的详细信息!我们可以创建一个 Student 对象数组,并将每个学生的详细信息存储在该数组中的一个对象中。
让我们从用户那里得到学生的数量:
int numberOfStudents = scanInput.nextInt();
现在,让我们开始另一个 for 循环,它将从所有学生那里获取详细信息——
for(int i=0;i<numberOfStudents;i ){ //获取详细信息}
我们现在要做的就是将数据设置为学生对象。为此,创建一个大小与 numberOfStudents 相同的 Student 对象数组。代码如下:
Student[] student = new Student[numberOfStudents];for(int i=0;i<numberOfStudents;i ){ student[i] = new Student(); name = scanInput.next(); student[i].setName(name); rollNumber = scanInput.nextInt(); student[i].setRollNumber(rollNumber); // 跟前面写的一样 for(int j=0; j<subjects.length;j ){ subjects[j] = scanInput.next(); } student[i].setSubjects(subjects);}
- l 当我们创建 Student[] 数组时,单个 Student 对象仍然为空。这就是为什么在 for 循环中,我们要创建新的 Student 对象。不这样做,试图使用 student[i]..就会抛出 NullPointerException,。 我们将在本文后面讨论异常。
- l 我们对 String 使用 next() 而不是 nextLine()。 nextLine() 将跳过当前行并转到下一行。最好使用 next()。
- l 假设用户将 numberOfStudents 设为 2。外部 for 循环将执行两次。主题数组的大小为 3,因此内部 for 循环将为每个外部循环执行 3 次,因此总共执行 6 次。
- l 请注意 Java 中的命名约定。变量名和方法名以小写开头,但我们将每个单词的第一个字母大写,而类名则以大写字母开头。
现在,我们拥有 Student 数组中的所有数据。我们可以使用 Java 构造函数来改进代码,这是一种比 setter 方法更有效的在对象中存储事物的方法。当你有很多数据时,你可以一次设置构造函数中的所有值,而不是使用 10 次 set 方法。让我们在 Student 类中创建一个构造函数。如下所示:
public Student(String name, int rollNumber, String[] subjects){ this.name = name; this.rollNumber = rollNumber; this.subjects = subjects;}
现在,让我们修改我们的 Test 类以使用这个构造函数。请注意,现在该行:
student[i] = new Student();
此行不会起作用,因为我们没有在我们的类中创建一个无参数的构造函数。当没有定义其他构造函数时,java编译器默认创建no-arg构造函数,否则,我们应该使用我们在代码中创建的构造函数。
我们的代码现在将变成——
System.out.println("Enter name and roll number: ");student[i] = new Student(scanInput.next(), scanInput.nextInt(), subjects);
这为我们减少了大约 3-4 行代码。想象一下,当有更多的对象和成员变量时,它会有多有用。请注意,subjects 数组是空的,因为我们正在获取科目的 name 和 rollNumber 之后才轮到subjects的值。
下一个问题是我们在哪里存储这些学生对象,以便我们以后可以检索它们并进行一些修改或显示列表的内容?简单的答案是 ArrayList。创建一个 ArrayList 并向其添加对象非常简单。
ArrayList 的一些重要特性须知:
- l ArrayList 是动态的。我们可以随时扩展ArrayList,大小不固定,不像数组。
- l ArrayList 是 Java 集合框架的重要组成部分。
- l 我们可以随机访问列表中的任何对象。
- l 我们只能在 ArrayList 中存储对象。如果我们必须创建一个整数的 ArrayList,我们需要将原始 int 类型包装到 Integer 对象中。
回到我们的代码,来创建ArrayList为 :
ArrayList studentList = new ArrayList();
要将对象添加到列表中,在获取所有详细信息后,只需将完整对象添加到列表中。这样添加:
studentList.add(student[i]);
与其混淆数组循环并将每个对象寻址为 student[0]、student[1] 等……让我们使用 Iterator 来获取和显示数据。
可将迭代器视为一个游标,它遍历集合的元素。您可以使用迭代器从集合中获取或删除任何元素。类似如下:
Iterator itr = studentList.iterator();System.out.println("所有学生的输入信息为---");while(itr.hasNext()){ System.out.println(itr.next().toString());}
- l 我们不创建 Iterator() 的新对象,而是使用列表的迭代器方法指向 itr。
- l while 循环使用 hasNext() 方法检查列表中是否还有更多对象。当 hasNext() 返回 false 时,while 循环将结束。
- l itr.next() 获取列表中的下一项。
您希望输出的应该是整洁的输入信息。不对头啊?Java 给的类似下面的东西——
Student@e7b241
因为要单独打印对象的成员,我们还需要覆盖 Student 类中的 toString() 方法。
public String toString(){ String studentDetails = null; studentDetails = "Student name: " this.name ", Student roll number: " this.rollNumber " , Chosen subjects: " Arrays.toString(this.subjects) "n"; return studentDetails;}
- l this 关键字是一个引用变量,指向当前类的实例变量。
- l 要从数组中获取值,我们使用实用程序类 Arrays 的 toString() 方法。请注意,Arrays包含静态方法,因此我们不需要创建对象来使用这些方法。我们直接使用类名和方法名。
看见没,现在会得到你想要的结果了!
但是,有一个问题……
我们没有处理用户输入错误的场景!例如,如果有人为 rollNumber 输入一个字符串会怎样?我们不会向用户抛出异常的整个堆栈跟踪。相反,我们可以向用户发送一条好消息。
尝试为 rollNumber 输入一个字符串,您将在线程“main”中得到异常 java.util.InputMismatchException。
try{ rollNumber = scanInput.nextInt();}catch (InputMismatchException ime){ System.out.println("Please enter a valid number");}
为了确保不会发生这种情况,我们需要确保用户输入正确的值。但是,怎样实现?让我们放置一个 try/catch 块来捕获异常并在出现错误时向用户显示一条友好的消息。
我们也可以对 numberOfStudents 应用相同的方法。最好的做法是将整个代码放在 try 块中,这样任何异常都可以在 catch 块中捕获。
这在 Java 中称为异常处理。在实际应用程序中,类可以抛出异常,最后某个类将捕获并向用户显示适当的消息。 Java 中有更多的运行时异常,最常见的是 NullPointerException、ClassCastException、ArithmeticException、IllegalArgumentException、ArrayIndexOutOfBoundsException 等……
7.快速回顾
在本文中,我接触了 Java 的基础知识,只是让您知道什么是编程语言,若之前使用过其他语言,就可以很快开始使用 Java 进行编码。通过本文,要了解以下基本概念——
- l 类和对象
- l 构造函数
- l 输入/输出流
- l for 和 while 循环
- l 基本和非基本数据类型
- l toString() 方法
- l 集合(ArrayList)和迭代器
- l 异常处理基础
这里只是通过一个简单的程序来认知这些。还有许多高级概念不在本文的范围内,但请继续关注本头条号,这里将或已经推出更多关于线程、内部类、接口、垃圾收集等高级概念的文章。
赶快从@牛旦IT课堂的专栏开始学Java编程吧:
下一篇,将为Java编程学习的同学提供一份核心基础知识备忘清单,以供随时翻阅。本篇就到这里了,分享出去吧。再见!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。