1.class Xxx{field字段 constructor构造器 method方法}
class Employee { //实例字段 private String name; private double salary; private LocalDate hireDay; //构造器,总是和new操作符一起调用 public Employee(String n,double s,int year,int month,int day) { name=n; salary=s; hireDay=LocalDate.of(year,month,day); } //方法 public String getName() { return name; } public void raiseSalary(double byPercent) { double raise=salary*byPercent/100; salary+=raise; } }2.使用多个源文件:把不同的类写进不同的.java文件里,然后让它们互相调用。
同一个包下(package)不用import,不同包下用import。
3.PS:
(1)为什么说String是一个类?
在 Java 中,String被定义在java.lang包中,源码开头就是public final class String(意味着这个类是最终版,不能有子类)。它和我们自己写的class Person本质一样,都是“引用数据类型”。
关键颠覆认知点:Java 给
String开了“语法外挂”(你可以直接用双引号"abc"写字符串,而不用new),这让你误以为它是基本类型。但它在内存中依然是堆里的对象,和LocalDate毫无区别。
(2)
int、double:是基本数据类型(基本类型),直接存数值,存在栈中,没有方法可调用(你不能写int a = 5; a.toString();)。(基本类型只有八种:整数类:byte(字节)、short(短整)、int(整型)、long(长整);小数类:float(单精度)、double(双精度);字符类:char(单个字符);真假类:boolean(布尔值:true/false))String、LocalDate:是引用数据类型,存的是堆内存地址,拥有丰富的方法(你可以写"abc".length())。
4.var
var关键字只能用于方法中的局部变量,参数和字段的类型必须声明。我们不会对数值类型使用var,如int、long、double,这样你就不用当心0,0L,0.0之间的区别。
局部变量:
public void myMethod() { // ✅ 正确:方法内部,立即赋值 var name = "张三"; // 推断为 String var today = LocalDate.now(); // 推断为 LocalDate var list = new ArrayList<String>(); // 推断为 ArrayList<String> }参数:
public void setInfo(var id, var name) {}//不行字段:
public class Person { var name; //不行 private String address;//可以 }5.null
如果对null值应用一个方法,会产生一个NullPointerException异常
解决方法:requireNonNullElse、requireNonNull
6.隐式参数、显示参数
public void raiseSalary(double byPercent) { double raise=salary*byPercent/100; salary+=raise; }隐式参数:salary,关键字this指示隐式参数形式:this.salary
显示参数:byPercent(局部变量)
7.封装(即类)
字段访问器方法,字段更改器方法
注意不要编写返回可变对象引用(可变类)的访问器方法(如Date类型)(存在更改器方法,对其调用更改器方法会改变对象的私有状态),首先应该对它进行克隆,return (Date)hireDay.clone();
P113
8.final(差不多对应其它语言中的常量,但是每个对象都存一份相同的字符串)
不可变类:类中的方法都是访问器方法
(1)final变量可以不赋初值,但必须在构造器(Constructor)中给它赋值。
private final int id=12138;//赋初值,且之后不能再改 private final int id; // 没有赋初值 public Person(int id) { this.id = id; // 必须在构造器里赋值,且之后不能再改 }(2)final修饰变量
final int MAX_SPEED = 120; final LocalDate date = LocalDate.now();基本类型:变量数值不能再做修改;引用类型:变量不能再指向其他对象,但“遥控器”指向的对象本身,内部是可以被修改的(如果它是可变类的话)。
(eg:由于LocalDate类是不可变类,即类中方法均为访问器方法,对于值的修改是基于对象的值计算出新值,并以新对象的形式返回,不是对原对象的修改。date = LocalDate.of(2026, 8, 7);不行。
而Date类这种可变类,可以使用date.setTime();修改这个对象的值。)
(3)final修饰方法
禁止子类重写
public class Parent { public final void criticalLogic() { System.out.println("核心算法"); } }(4)final修饰类:无法被继承
public final class Math { // 你无法 extends Math // ... }