本节课或者本题你将学到的内容:
- 变量定义
- 基本数据类型
- 面向对象
- 类的定义、属性和方法
new
关键字private
和public
static
import
关键字- 输入:Scanner类的使用
- 输出语句
- while控制多次输入
类和面向对象
都说Java是一门面向对象的语言, 而且是“万物皆对象”,那该怎么理解这句话呢?
这里的“对象”实际上是对现实世界中所存在的事物的一种抽象,举个例子,你在计算机世界中怎么表示“人”这个概念呢?
我们可以将之抽象为一个类Person
, 并具有一些“属性”和“方法”。
- “属性”表示
Person
类所具有的特征,比如姓名、年龄、性别,通过这些特征,我们可以描述一个“人”的基本状态。 - “方法”表示
Person
类的行为和功能,比如吃饭、睡觉、行走,通过这些动作,我们可以描述一个“人”的动态行为。
比如下面的“伪代码”表示Person
类的定义, 它包括姓名、性别、年龄和吃饭的方法
Person {
// 姓名、性别、年龄等属性
name;
gender;
age;
// 吃饭的方法
eat() {
}
// 行走的方法
walk() {
}
}
这样在计算机世界,一个“人”的概念就建立起来了,但这里的Person
类只是个“模具”,空有概念,而无法表示具体的某一个人,只有创造一个类的实例(也就是我们说的对象),比如"张三,18, 男", "李明、20,男",才能真正的使用,而创建Person实例需要使用new
关键字。
// new Person()创建一个实例
// 将这个实例起名为xiaoming
// Person xiaoming表示这是一个Person的实例,xiaoming属于Person这种类型
Person xiaoming = new Person();
简而言之,“类”是现实世界中的实体在计算机世界中的抽象概念,类可以看作是对象的模板,它定义了对象的结构和行为方式,而对象是“类”的实现。
程序基本结构
如果你之前没有接触过java,甚至是没有接触过编程语言,可能很难去理解为什么要这样写,但是没关系,编程最开始往往是从“死记硬背”开始的,我们暂时只需要知道这是java程序必须有的结构就可以,后面我们会进行详细的解释,从而帮助你更好的理解它。
public class Main {
public static void main(String[] args) {
}
}
我们创建了一个Main.java
文件,在这个文件中,必须存在一个与该文件同名的类,类要使用class
这个关键字里定义,Main
是类的名称, 类的名称通常以大写字母开头, public
表示这个类是公开的,这意味着你可以在任何其他类中访问。
此外类中还必须包括一个方法main
, Java程序总是从main
方法开始执行,表示这是Java程序的入口, 下面的代码是main
方法的固定写法。
public static void main(String[] args) {
}
-
public
是一个访问修饰符, 除了可以修饰class
外,也可以修饰方法,表示该方法是公开的,对于main
来说,它必须是public
的。 -
关键字
static
是另一个修饰符,它表示静态方法,后面我们会讲解方法的类型,目前,我们只需要知道,Java入口程序规定的方法必须是静态方法。 -
void
表示该方法不返回任何值。 -
main
是方法的名称,作为程序的入口点,而且入口的名称方法名必须为main。
-
String[] args
:这是main
方法的参数。
方法的组成
实际上一个方法主要包含四个部分:
- 返回类型
- 方法名
- 形参列表
- 方法体
ReturnType methodName(/* 参数列表 */) {
// 方法体
}
- 返回类型
ReturnType
定义一个方法时,我们首先要在方法名之前放置一个关键字表示该方法的返回类型,这个关键字代表的含义是方法执行完毕会返回什么类型的值。main
方法通常不返回结果,所以用void
来修饰,因为它的主要目的是启动程序,而不是返回值。
- 函数名
methodType
一个类可以有很多个方法(比如人的吃饭、睡觉),每个方法有不同的作用,为了区分这些方法,我们要给不同的方法起不同的方法名称,而且方法命名是有规范的,而这里由于是主方法,所以方法的名称为main
,且不可更改。
- 形参列表
方法名之后的括号内填充的就是形参列表,它定义了方法在被调用时传递给方法的信息,参数可以有多个,不同参数之间用逗号分隔。String[] args是 main
方法的参数,它表示的含义是一个字符串数组。(这里也是固定写法)
- 方法体
从左花括号{
开始, 到右括号}
结束,这一部分就是方法体,方法体中可以有很多行代码,方法体中代码的执行产生不同的结果。
输入输出
在Java中,你可以使用标准输入(System.in
)进行输入操作,使用标准输出(System.out
)来进行输出操作,此外还需要使用到 Scanner
类(Java标准库中的一个类)。
System.in
是一个标准的输入流,它允许你从控制台(键盘)获取用户输入的数据。Scanner
是 Java 中的一个类,它位于java.util
包中,它提供了一种简便的方式来处理输入数据。
它的使用代码是这样的:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
sc.close(); // 关闭Scanner对象
}
}
在使用Scanner
时,需要从Java的工具库util
中引入,引入操作需要使用到import
关键字
在之前,我们讲述了类和对象,想要将类实例化(也就是创造一个对象实例),需要使用new
关键字, 实例化的时候,我们需要用一个“名称”(变量)来代表这个对象,比如创造Person实例时的“张三、李四”就是这个对象的名字,名称前面要加上类名,表示变量是这种类型。
// new Scanner(Symtem.in)创建了一个 Scanner 对象
// 给对象起了个名称sc, sc前面的Scanner表示sc是Scaner
Scanner sc = new Scanner(System.in);
变量
我们已经知道了可以使用标准输入(System.in
)进行输入操作,可是我们还有一个问题需要解决,那就是:系统怎么认识和标识我们输入的数字呢?比如说,我们想要输入两个数字100、100,系统如果使用100来标识100,那另外一个100应该怎么标识呢?
所以我们就需要在系统内部使用某样东西来指代和标识输入的内容,比如x = 100; y = 100
, 这里的x, y
在数学中被称为变量,在编程中也被称为变量,用来指代内容。
不过在数学中有整数、小数之分,那计算机在存储的时候也应该知道我们输入的x是一个什么类型的数字,这里我们输入的是整数,也就是前面使用的int
类型。
所以我们首先需要定义两个变量a,b
代码这么写:
为了简略,我们可以将代码写在一行,然后将类型略去,变量中间用逗号分隔。
int a,b;//定义变量a和b,名称为a、b。分别用于接收两个整数
int a = 1; // 定义一个整数类型变量,并赋予初始值1
程序编写
现在我们就可以使用一个变量来保存使用Scanner
读取的数字了,Scanner
使用nextInt()
方法读取并返回下一个整数,我们使用该方法读取两个整数,并存放在变量a和变量b中。
int a = sc.nextInt(); // 读取下一个整数,并将之赋值给变量a
int b = sc.nextInt(); // 读取下一个整数,并将之赋值给变量b
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
System.out.println(a+b);
sc.close();
}
}
但是上面的代码只能满足一次输入输出,也就是说只能输入输入一组a和b, 但是题目要求输入包含一系列的a和b,难道有一千组数据,我们需要书写一千行上面的代码嘛,更糟糕的是,我们并不知道一系列数据到底是多少组数据?
这个时候,我们可以使用“循环结构”while, while循环表示只要给定的条件是真的,就反复执行这一段代码,直到条件变假为止。
那么完整代码如下:
// 引入Scanner
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// 创造一个Scanner对象
Scanner sc = new Scanner(System.in);
// 判断是否还有下一个数据
while(sc.hasNextInt()) {
// 读取两个整数并将它们存储在变量 a和 b中
int a = sc.nextInt();
int b = sc.nextInt();
// 输出a和b的值
System.out.println(a+b);
}
sc.close(); // 关闭Scanner对象
}
}
延伸
除了int
类型之外,Java语言还有一些其他的数据类型用于存储整数、浮点数、字符和布尔值这些原始数据,而这些基本数据类型就是构建一个对象的基础。
整数类型(Integer Types):
byte
:在计算机存储中占用1个 字节,表示的范围 -128 到 127。short
:在计算机存储中中占用2个字节,范围 -32,768 到 32,767。int
:4 字节,范围约为 -231到231-1。long
:8 字节,范围约为-263到263-1。
byte score = 98; short age = 130; int count = 100000; long gdp = 10000000000L;
浮点数类型:用于表示包含小数部分的数字
float
:单精度浮点数,占用4个字节,通常用于存储较小的浮点数。double
:双精度浮点数,占用8个字节,通常用于存储较大或更精确的浮点数。
float floatValue = 3.14159f; // 使用 'f' 后缀表示
float double price = 2.99; // 默认是double类型
字符类型char
: 用于存储一个字符(用单引号括起来表示),比如字符'A'以及字符'1'。
char grade = 'A';
char ch2 = '1';
布尔类型(Boolean Type)
boolean
:表示布尔值,只有两个取值:true
(真)和false
(假)
因为有不同的数据类型,在实际应用中,你可以根据需要使用不同的 Scanner
方法来读取不同类型的数据。
next()
:读取下一个字符串。nextInt()
:读取下一个整数。nextDouble()
:读取下一个双精度浮点数。nextLine()
:读取下一行文本。hasNext()
:判断是否还有下一个输入项。如果有,返回true
;否则返回false
。hasNextInt()
:判断是否还有下一个整数输入项。hasNextDouble()
:检查是否还有下一个双精度浮点数输入项。
对于这些方法,目前大家只需要留有一个印象即可,我们后面会通过练习接触到这些方法。
访问修饰符
在程序基本结构中,我们介绍了用public
来修饰类, 这里的public
是一个访问修饰符,可以用来修饰类、属性或者方法,表示被修饰的成员对于其他所有类都是可见的。
public class A {
public int age;
}
public class B {
// 可以在B类中直接使用age
}
除了public
外,还有private
修饰符和一些其他的修饰符,private
表示被修饰的成员只能在包含它的类中被访问, 其他类无法访问类中的 private
成员。这通常用于隐藏类的内部细节。
public class A {
private int age;
}
public class B {
// 无法在 B 类中直接使用age
}
访问修饰符的使用取决于设计目标和需求。通常,应该尽量将成员定义为
private
,以实现数据隐藏和封装,只在需要时提供公共接口。
总结
本节课,我们知悉了类和对象的基本概念,并通过a和b的多组输入了解了java的基础结构、变量、输入输出、while循环等基础语法。