Java 基础
一、Hello World 程序(入门第一个程序)
1. Hello_World.java
public class Hello_World { public static void main (String[] args) { System.out.println("Hello World" ); } }
代码解释:
public class Hello_World:定义一个公开的类,类名必须和文件名(Hello_World.java)完全一致(包括大小写)
public static void main(String[] args):程序的入口方法,所有 Java 程序都从这个方法开始执行
public:公开的,允许外部访问
static:静态的,不需要创建对象就能执行
void:无返回值
main:方法名,固定为main
String[] args:方法参数,接收命令行输入的参数
System.out.println(“Hello World”):打印语句,在控制台输出Hello World,println会自动换行
2. HelloWorld.java
package chuangjian.demo01;public class HelloWorld { public static void main (String[] args) { System.out.println("HelloWorld" ); } }
代码解释:
/* … */:多行注释,注释内容不会被执行,用于说明代码
功能和上面的Hello_World.java一致,只是类名和输出内容少了空格,核心结构完全相同
二、数据类型与变量
1. 数据类型.java
public class 数据类型 { byte a = 1 ; short b = 1 ; int c = 1 ; long d = 1 ; float e = 1.0f ; double f = 1.0d ; boolean g = true ; char h = 'A' ; }
代码解释:
Java 中的基本数据类型分为四大类 8 种:
整数类型:byte(1 字节)、short(2 字节)、int(4 字节,默认)、long(8 字节)
浮点类型:float(4 字节)、double(8 字节,默认)
布尔类型:boolean(1 字节,值为true或false)
字符类型:char(2 字节,存储单个字符,用单引号’包裹)
注意:float类型赋值时需加后缀f(如1.0f),double可加d(也可省略)
2. 字面量.java
package chuangjian.demo01;public class Zimianliang { public static void main (String[] args) { int a=10 ; System.out.println(a); byte b=10 ; System.out.println(b); short c=30 ; System.out.println(c); long d = 9999999999L ; System.out.println(d); float e = 3.14F ; System.out.println(e); double f = 2.718 ; System.out.println(f); String g = "Hello, World!" ; System.out.println(g); char h = 'A' ; System.out.println(h); boolean i = true ; System.out.println(i); boolean j = false ; System.out.println(j); String k = null ; System.out.println(k); } }
代码解释:
字面量:直接写出来的数据值(如10、3.14、“Hello”)
整数字面量:默认是int类型,定义long时需加L(如9999999999L,避免超出int范围)
小数字面量:默认是double类型,定义float时需加F(如3.14F)
字符串字面量:用双引号"包裹(如"Hello, World!"),类型是String(引用类型)
字符字面量:用单引号’包裹单个字符(如’A’)
布尔字面量:只有true(真)和false(假)
null:表示引用类型变量没有指向任何对象(不能用于基本数据类型)
3. 定义变量.java
package chuangjian.demo01;public class 定义变量 { public static void main (String[] args) { String name = "黑马" ; int age = 18 ; char gender = '男' ; double height = 180.2 ; boolean flag = true ; System.out.println(name); System.out.println(age); System.out.println(gender); System.out.println(height); System.out.println(flag); } }
代码解释:
变量定义格式:数据类型 变量名 = 初始值;(如int age = 18;)
作用:变量用于存储数据,方便后续使用和修改
示例中定义了不同类型的变量:
String name:字符串类型,存储姓名
int age:整数类型,存储年龄
char gender:字符类型,存储性别
double height:浮点类型,存储身高
boolean flag:布尔类型,存储真假值
System.out.println(变量名):打印变量存储的值
三、键盘输入
1. 键盘输入.java
package chuangjian.demo01;import java.util.Scanner;public class 键盘输入 { public static void main (String[] args) { Scanner sc=new Scanner (System.in); System.out.println("请输入整数" ); int i=sc.nextInt(); System.out.println(i); } }
代码解释:
import java.util.Scanner;:导入Scanner类(用于获取键盘输入),必须放在类定义之前
Scanner sc = new Scanner(System.in );:创建Scanner对象,关联到键盘输入
System.out.println(“请输入整数”);:提示用户输入
int i = sc.nextInt();:获取用户输入的整数并赋值给变量i
注意:使用完Scanner后最好用sc.close();关闭(避免资源浪费)
2. 键盘输入并求和.java
package chuangjian.demo01;import java.util.Scanner;public class 键盘输入并求和 { public static void main (String[] args) { Scanner sc=new Scanner (System.in); System.out.println("请输入第一个数字:" ); int number1=sc.nextInt(); System.out.println("请输入第二个数字:" ); int number2=sc.nextInt(); System.out.println(number1+number2); } }
代码解释:
流程:创建Scanner → 提示输入 → 读取两个整数 → 计算并输出和
number1 + number2:整数相加,+在这里是算术运算符
扩展:如果要读取其他类型(如小数、字符串),可使用sc.nextDouble()、sc.next()等方法
四、控制流语句(循环与分支)
1. for循环.java
public class for 循环 { public static void main (String[] args) { for (int i=0 ;i<5 ;i++) { System.out.println(i); } int [] numbers = {1 ,2 ,3 ,4 ,5 }; for (int i:numbers) { System.out.println(i); } } }
代码解释:
普通for循环:
格式:for (初始化; 循环条件; 迭代)
示例中for (int i=0; i<5; i++):
初始化:int i=0(定义循环变量并赋值)
循环条件:i<5(条件为true时执行循环体)
迭代:i++(每次循环后变量自增 1)
循环体:System.out.println(i)(打印i的值,会输出0,1,2,3,4)
增强for循环(foreach 循环):
格式:for (元素类型 变量名 : 数组/集合)
作用:简化数组或集合的遍历,无需关注索引
示例中for (int i : numbers):依次取出数组numbers中的元素赋值给i,并打印(输出1,2,3,4,5)
2. 小老虎吃包子.java
package chuangjian.demo01;public class xiaolaohuchibaozi { public static void main (String[] args) { for (int i = 1 ; i <=5 ; i++) { if (i==3 ) { continue ; } System.out.println("小老虎在吃第" +i+"个包子" ); } for (int i = 1 ; i <=5 ; i++) { if (i==3 ) { break ; } System.out.println("小老虎在吃第" +i+"个包子" ); } } }
代码解释:
if (i==3):条件判断,当i等于 3 时执行大括号内的代码
continue:跳过本次循环剩余部分,直接进入下一次循环
第一个循环中,当i=3时跳过,会输出:第 1、2、4、5 个包子
break:直接跳出整个循环
第二个循环中,当i=3时跳出,会输出:第 1、2 个包子
3. switch_case.java
public class switch_case { public static void main (String[] args) { char grade = 'A' ; switch (grade) { case 'A' : System.out.println("A" ); break ; case 'B' : System.out.println("B" ); break ; case 'C' : System.out.println("C" ); break ; case 'D' : System.out.println("D" ); break ; default : System.out.println("Unknown" ); } System.out.println("your grade is " + grade); } }
代码解释:
switch语句:多条件分支判断,根据变量的值匹配对应的case
格式:
switch (变量) { case 值1 : 代码1 ; break ; case 值2 : 代码2 ; break ; ... default : 默认代码; }
执行流程:
变量grade的值为’A’,匹配case ‘A’,执行System.out.println(“A”)
break:跳出switch语句(如果没有break,会继续执行下一个case的代码)
default:当所有case都不匹配时执行(可选)
最终输出:A 和 your grade is A
4. 逢七过.java
package chuangjian.demo01;public class 逢七过 { public static void main (String[] args) { for (int i = 1 ; i <= 100 ; i++) { if (i % 7 == 0 ||i % 10 == 7 ||i / 10 == 7 ) { System.out.println("过" ); } else { System.out.println(i); } } } }
代码解释:
功能:1-100 中,遇到 7 的倍数、个位是 7、十位是 7 的数,输出 “过”,否则输出数字
i % 7 == 0:判断是否是 7 的倍数(%是取余运算符)
i % 10 == 7:判断个位是否是 7(除以 10 的余数是 7)
i / 10 == 7:判断十位是否是 7(除以 10 的商是 7,如 70-79)
||:逻辑或运算符,只要其中一个条件为true,整体为true
五、方法(函数)
1. 方法定义和调用.java
package chuangjian.demo01;public class 方法定义和调用 { public static void playGame () { System.out.println("开始游戏" ); System.out.println("游戏结束" ); } public static void method (int a,int b) { int result=a+b; System.out.println(result); } public static int getSum (int a,int b,int c) { int result=a+b+c; return result; } public static void main (String[] args) { playGame(); method(10 ,20 ); int sum=getSum(10 ,20 ,30 ); System.out.println(sum); } }
代码解释:
方法:一段可重复使用的代码块,用于完成特定功能
方法定义格式:
修饰符 返回值类型 方法名(参数列表) { 方法体; [return 返回值;] }
示例方法解析:
playGame():
修饰符:public static
返回值类型:void(无返回值)
方法名:playGame
参数列表:无参数
功能:打印 “开始游戏” 和 “游戏结束”
method(int a, int b):
参数列表:int a, int b(两个 int 类型参数)
功能:计算a+b并打印结果
getSum(int a, int b, int c):
返回值类型:int(返回整数)
功能:计算a+b+c,并通过return返回结果
方法调用:直接写方法名 + 参数(如playGame();、method(10,20);)
有返回值的方法可以赋值给变量(如int sum = getSum(10,20,30);)
2. 方法.java
import java.util.Scanner;public class 方法 { public static int max (int num1,int num2) { int result; if (num1>num2) { result = num1; } else { result = num2; } return result; } public static void main (String[] args) { Scanner sc = new Scanner (System.in); System.out.println("请输入两个数:" ); int num1 = sc.nextInt(); int num2 = sc.nextInt(); int largest = max(num1,num2); System.out.println(largest); sc.close(); } }
代码解释:
max(int num1, int num2):求两个数中的最大值
逻辑:如果num1 > num2,返回num1,否则返回num2
调用流程:
从键盘输入两个数num1和num2
调用max(num1, num2)得到最大值,赋值给largest
打印最大值
sc.close();:关闭Scanner对象,释放资源
六、数组
1. 数组.java
public class 数组 { public static void main (String[] args) { double [] mylist =new double [10 ]; double [] mylist2 = {1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10 }; mylist[0 ]=1.1 ; mylist[1 ]=1.2 ; mylist[2 ]=1.3 ; mylist[3 ]=1.4 ; mylist[4 ]=1.5 ; mylist[5 ]=1.6 ; mylist[6 ]=1.7 ; mylist[7 ]=1.8 ; mylist[8 ]=1.9 ; mylist[9 ]=2.0 ; double sum=0 ; for (int i=0 ;i<mylist.length;i++) { sum+=mylist[i]; } double sum2=0 ; for (double element:mylist2) { sum2+=element; } System.out.println(sum+" " +sum2); } }
代码解释:
数组:存储多个相同类型数据的容器(长度固定)
数组定义方式:
double[] mylist = new double[10];:声明并创建长度为 10 的 double 数组(初始值为 0.0)
double[] mylist2 = {1,2,3,4,5,6,7,8,9,10};:声明并初始化数组(直接赋值元素)
数组元素访问:通过索引(从 0 开始),如mylist[0] = 1.1;(给第 1 个元素赋值)
mylist.length:获取数组长度(元素个数)
数组遍历求和:
普通 for 循环:for (int i=0; i<mylist.length; i++) { sum += mylist[i]; }
增强 for 循环:for (double element : mylist2) { sum2 += element; }(更简洁)
2. 打乱数组.java
package chuangjian.demo01;import java.util.Random;public class 打乱数组 { public static void main (String[] args) { int [] arr={1 ,2 ,3 ,4 ,5 }; Random r = new Random (); for (int i=0 ;i<arr.length;i++){ int randomIndex=r.nextInt(arr.length); int temp=arr[i]; arr[i]=arr[randomIndex]; arr[randomIndex]=temp; } for (int i=0 ;i<arr.length;i++){ System.out.println(arr[i]+" " ); } } }
代码解释:
功能:将数组元素随机打乱(洗牌算法)
Random r = new Random();:创建随机数生成器对象
r.nextInt(arr.length):生成 0 到arr.length-1之间的随机整数(作为随机索引)
打乱逻辑:循环遍历数组,每次将当前元素arr[i]与随机索引randomIndex的元素交换
int temp = arr[i];:临时存储当前元素
arr[i] = arr[randomIndex];:将随机元素赋值给当前位置
arr[randomIndex] = temp;:将临时存储的当前元素赋值给随机位置
最后遍历打印打乱后的数组
七、类与对象(面向对象基础)
1. 类的定义与对象创建(以手机为例)
Phone.java(类的定义)
package chuangjian.demo01;public class Phone { String brand; double price; public void call () { System.out.println("打电话" ); } public void playGame () { System.out.println("玩游戏" ); } }
代码解释:
类:是对象的模板,定义了对象的属性和方法
Phone类包含:
属性(成员变量):brand(品牌)、price(价格)
方法(成员方法):call()(打电话)、playGame()(玩游戏)
PhoneTest.java(对象的使用)
package chuangjian.demo01;public class PhoneTest { public static void main (String[] args) { Phone p = new Phone (); p.brand = "小米" ; p.price = 1999.99 ; System.out.println("手机品牌:" + p.brand); p.call(); p.playGame(); Phone p2 = new Phone (); p2.brand = "华为" ; p2.price = 2999.99 ; System.out.println("手机品牌:" + p2.brand); p2.call(); p2.playGame(); } }
代码解释:
对象创建:Phone p = new Phone();(new Phone()创建对象,p是对象的引用)
属性访问与赋值:对象名.属性名(如p.brand = “小米”;)
方法调用:对象名.方法名()(如p.call();)
每个对象都是独立的,属性值互不影响(p和p2是两个不同的手机对象)
2. 封装(private 与 get/set 方法)
GirlFriend.java(未封装的类)
package chuangjian.demo01;public class GirlFriend { String name; int age; public void sleep () { System.out.println("女朋友在睡觉" ); } public void eat () { System.out.println("女朋友在吃饭" ); } }
GirlFriendPlus.java(封装的类)
package chuangjian.demo01;public class GirlFriendPlus { private int age; private String name; public void setAge (int a) { if (a>=18 &&a<=50 ){ age=a; } else { System.out.println("你给的年龄不符合要求" ); } } public int getAge () { return age; } public void setName (String n) { name=n; } public String getName () { return name; } public void sleep () { System.out.println("女朋友在睡觉" ); } public void eat () { System.out.println("女朋友在吃饭" ); } }
代码解释:
封装:将属性私有化(private),通过公共方法(get/set)访问和修改,保护数据安全
private int age;:private修饰的属性只能在本类中直接访问,外部无法直接修改
setAge(int a):设置年龄的方法,添加了验证逻辑(年龄必须 18-50),不符合则提示错误
getAge():获取年龄的方法,返回age的值
好处:控制属性的赋值逻辑,避免不合理的数据(如年龄为负数)
GirlFriendTest.java(使用封装类)
package chuangjian.demo01;public class GirlFriendTest { public static void main (String[] args) { GirlFriendPlus gf1=new GirlFriendPlus (); gf1.setName("靓靓" ); gf1.setAge(18 ); System.out.println(gf1.getName()); System.out.println(gf1.getAge()); gf1.eat(); gf1.sleep(); System.out.println("============" ); GirlFriendPlus gf2=new GirlFriendPlus (); gf2.setName("悦悦" ); gf2.setAge(19 ); System.out.println(gf2.getName()); System.out.println(gf2.getAge()); gf2.eat(); gf2.sleep(); } }
代码解释:
外部类不能直接访问private属性(如gf1.age会报错)
必须通过setXxx()方法赋值,通过getXxx()方法获取值
保证了数据的合法性(如设置年龄为 10,setAge会提示不符合要求)
3. 构造方法(对象初始化)
Student.java
package chuangjian.demo01;public class Student { private String name; private int age; public Student () { System.out.println("空参构造器" ); } public Student (String name, int age) { this .name = name; this .age = age; } public String getName () { return name; } public void setName (String name) { this .name = name; } public int getAge () { return age; } public void setAge (int age) { this .age = age; } }
代码解释:
构造方法:用于对象初始化,方法名与类名相同,无返回值(连void都没有)
分类:
空参构造:public Student() { … },无参数,创建对象时调用
有参构造:public Student(String name, int age) { … },有参数,创建对象时直接赋值
this.name = name;:this关键字表示当前对象,用于区分成员变量(this.name )和方法参数(name)
注意:如果定义了有参构造,系统不会再提供默认的空参构造,需手动定义
StudentTest.java
package chuangjian.demo01;public class StudentTest { public static void main (String[] args) { Student s1 = new Student (); s1.setName("张三" ); s1.setAge(20 ); Student s2 = new Student ("李四" , 21 ); System.out.println(s2.getName() + " " + s2.getAge()); } }
代码解释:
调用空参构造:Student s1 = new Student();,创建对象后通过set方法赋值
调用有参构造:Student s2 = new Student(“李四”, 21);,创建对象时直接给name和age赋值
有参构造简化了对象初始化的步骤
4. this关键字
this_girlfriend.java
package chuangjian.demo01;public class this_girlfriend { private int age; public void method () { int age=10 ; System.out.println(age); System.out.println(this .age); } }
this_关键字.java
package chuangjian.demo01;public class this_guanjianzi { public static void main (String[] args) { this_girlfriend gf1 = new this_girlfriend (); gf1.method(); } }
代码解释:
this关键字:代表当前对象的引用
作用:当成员变量和局部变量重名时,用this.成员变量区分成员变量
示例中:
method()方法内有局部变量age=10,成员变量private int age;(默认值 0)
System.out.println(age);:按就近原则,打印局部变量10
System.out.println(this.age);:打印成员变量0
5. 标准 JavaBean(实体类规范)
标准Javabean文件.java
package chuangjian.demo01;public class 标准Javabean文件 { private String username; private String password; private String email; private String gender; private String age; public 标准Javabean文件() { } public 标准Javabean文件(String username, String password, String email, String gender, String age) { this .username = username; this .password = password; this .email = email; this .gender = gender; this .age = age; } public String getUsername () { return username; } public void setUsername (String username) { this .username = username; } public String getPassword () { return password; } public void setPassword (String password) { this .password = password; } public String getEmail () { return email; } public void setEmail (String email) { this .email = email; } public String getGender () { return gender; } public void setGender (String gender) { this .gender = gender; } public String getAge () { return age; } public void setAge (String age) { this .age = age; } public String toString () { return "标准Javabean文件{username = " + username + ", password = " + password + ", email = " + email + ", gender = " + gender + ", age = " + age + "}" ; } }
代码解释:
标准 JavaBean(实体类)规范:
类是公共的(public)
属性私有(private)
提供空参构造方法
提供有参构造方法(可选,通常提供全参构造)
为每个属性提供getter(获取)和setter(设置)方法
重写toString()方法(方便打印对象信息)
toString():返回对象的字符串表示,当打印对象时会自动调用(如System.out.println(对象);)
八、其他常用功能
1. 随机数生成(随机数字.java)
package chuangjian.demo01;import java.util.Random;public class 随机数字 { public static void main (String[] args) { Random r=new Random (); int number=r.nextInt(100 ); System.out.println(number); } }
代码解释:
Random类:用于生成随机数,需导入java.util.Random;
r.nextInt(100):生成[0, 100)之间的整数(即 0-99)
扩展:生成[a, b)之间的随机数:r.nextInt(b - a) + a(如生成 1-10:r.nextInt(10) + 1)
2. 字符串操作(StringTest.java)
package chuangjian.demo01;public class StringTest { public static void main (String[] args) { String s = "berbjsvsjrvbafvfbeabf" ; int len = s.length(); System.out.println("字符串长度为:" + len); String ss=s.toUpperCase(); System.out.println("转换为大写后的字符串为:" + ss); } }
代码解释:
String:字符串类型(引用类型),值不可变
s.length():返回字符串的长度(字符个数)
s.toUpperCase():将字符串中的小写字母转换为大写,返回新字符串(原字符串不变)
3. 日期时间(日期时间.java)
import java.time.LocalDate;import java.time.ZonedDateTime;import java.util.Date;public class 日期时间 { public static void main (String[] args) { LocalDate today = LocalDate.now(); System.out.println(today); ZonedDateTime zonedDateTime = ZonedDateTime.now(); System.out.println(zonedDateTime); Date date = new Date (); System.out.println(date); } }
代码解释:
Java 中常用的日期时间类:
LocalDate:表示日期(年 - 月 - 日),now()获取当前日期
ZonedDateTime:表示带时区的日期时间
Date:旧版日期类(建议使用LocalDate等新版类)
输出示例:
LocalDate:2024-05-20
ZonedDateTime:2024-05-20T15:30:45+08:00[Asia/Shanghai]
4. 算法示例
回文数.java(反转数字)
package chuangjian.demo01;public class 回文数 { public static void main (String[] args) { int x = 12345 ; int result = 0 ; while (x != 0 ) { int shu = x % 10 ; x = x / 10 ; result = result * 10 + shu; } System.out.println(result); } }
代码解释:
功能:将数字12345反转为54321
逻辑:通过循环取出原数字的最后一位,拼接到结果中
x % 10:取最后一位(如12345 % 10 = 5)
x = x / 10:去掉最后一位(如12345 / 10 = 1234)
result = result * 10 + shu:将取出的数字拼接到结果(如010+5=5 → 5 10+4=54 → …)
求素数.java
package chuangjian.demo01;import java.util.Scanner;public class 求素数 { public static void main (String[] args) { Scanner sc=new Scanner (System.in); System.out.println("请输入整数" ); int number=sc.nextInt(); boolean flag=true ; int k=number/2 ; for (int i=2 ;i<=k;i++) { if (number % i == 0 ) { flag = false ; System.out.println(number + "不是素数" ); break ; } } if (flag==true ){ System.out.println("flag语句判断" +number+"是素数" ); } else { System.out.println("flag语句判断" +number+"不是素数" ); } } }
代码解释:
素数:大于 1 的自然数,除了 1 和自身外不能被其他数整除
逻辑:
输入一个整数number
假设是素数(flag = true)
循环判断2到number/2之间的数是否能整除number,如果能则不是素数(flag = false)
最后根据flag的值输出结果
平方根.java
package chuangjian.demo01;import java.util.Scanner;public class 平方根 { public static void main (String[]args) { Scanner sc=new Scanner (System.in); System.out.println("请输入整数" ); int number=sc.nextInt(); for (int i = 1 ; i <=number; i++) { if (i*i==number){ System.out.println(i+"是" +number+"的平方根" ); break ; } else if (i*i>number) { System.out.println((i-1 )+"是" +number+"的平方根的整数部分" ); break ; } } } }
代码解释:
功能:求一个整数的平方根(或整数部分)
逻辑:循环从 1 开始计算平方,直到找到平方等于该数(精确平方根)或平方大于该数(取前一个数为整数部分)
示例:输入16 → 输出4是16的平方根;输入10 → 输出3是10的平方根的整数部分(因为3²=9 < 10,4²=16 > 10)