JAVA-Class

1.深度拷贝,使用clone()方法。
4.2.2 LocalDate Class
使用工厂方法创建对象

LocalDate now=LocalDate.now();
LOcalDate new YearsEve=LocalDate.of(1999,12,31)

;

调用方法获得年月日

int year=newYearsEve.getYear();
int month=newYearsEve.getMonthValue();
int year=newYearsEve.getDayOfMonth();
LocalDate aThousandDaysLater=newYearEve.plusDays(1000);
year=aThousandDaysLater.getYear();

String n;
使用Objects.requireNonNullElse(n,"unknown);

 String name;
name=Objects.requireNonNull(n,"The name cannot be null");

当遇到mutable field时,使用clone()函数返回拷贝。
4.3.9同类的对象可以访问同类对象的私有数据。

4.3.11final作用域
类中定义final常量,需要在每个构造器中初始化
如果是可变对象,不要使用final
对可变对象使用final,仅仅表示它会指向一个引用,不能改变指向。

private final StringBuilder evaluations;
evaluations=new StringBuilder();

4.4静态域和方法
private static int nextId=1;
该变量为static,仅有一份拷贝,供所有该类的对象所共有。
4.42静态常量

public class Math{
  public static final double PI=3.1415926;
}

可以通过Math.PI访问该静态常量。
如果没有static关键字,那么每个Math类的对象都有一份该值的拷贝。且必须创建了对象才能访问该值。
静态方法
Math.pow(x,a)
静态方法不用创建对象就可执行。
4.4.4 工厂方法
LocalDate和NumberFormat使用工厂方法创建对象。另举一例

NumberFormat currencyFormatter=NumberFormat.getCurrencyInstance();
NumberFormat percentFormatter=NumberFormat.getPercentInstance();
double x=0.1;
System.out.println(currencyFormatter.format(x));
System.out.println(percentFormatter.format(x));

为什么NumberFormat不使用构造函数创建对象呢?
1.你不能给构造函数命名,构造函数名是和类名一样的。这里我们需要两个名字,一个CurrencyInstance和percentInstance。
2.使用构造函数无法改变对象的类型。工厂函数可以返回一个其他类型的类。

Java的值传递
1.方法修改不能修改传入的基本数据类型的数据(值传递,虽然更改了数据但是更改的是拷贝)
2.方法可以修改对象的属性
3.方法不能修改对象的引用指向,不能让它指向新的对象(值传递,传过来的是对象引用的拷贝)

初始化块
任何对象被创建时,初始化块都会执行,他们执行在构造函数调用前。
使用初始化块必须把类成员变量的定义放在初始化块之前。

class Employee{
  private static int nextId;
  private int id;
  private String name;
  private double salary;
  //下面是初始化块,它在对象被创建时就执行
  {
      id=nextId;
      nextId++;  
  }

  public Employee(String n,double s){
      name=n;
      salary=s;
  }

  public Employee(){
      name="";
      salary=0;
  }
}

初始化块不建议使用,建议使用构造函数。

静态域的初始化

  private static Random generator=new Random();
  static{
    nextId=generator.nextInt(10000);
}

静态域会在类第一次加载时调用。静态域的默认值为0,null,false其中之一。除非你显示初始化。

4.7.1Record概念
record是一种特殊的类,是不可变的且是公开可读(immutable and readable by the public),例
record Point(double x,double y){}

相当于

   Class Point{
    Point(double x,double y);
    public double x();
    public double y();
}

使用

 var p=new Point(3,4);
  System.out.println(p.x()+" "+p.y());

每个record都有toString(),equals(),hashCode()方法被自动定义。

你可以给record添加方法

record point(double x,double y){
  public double distanceFromOrigin(){return Math.hypot(x,y);}
}

record可以有静态值和静态方法。

record Point(double x,double y){
  public static Point ORIGIN=new Point(0,0);
  public static double distance(Point p,Point q){
    return Math.htpot(p.x-q.x,p.y-q.y);
  }
}

但不能有实例(instance)

record Point(double x,double y){
  private double r;//ERROR
}

4.8.2Class Importation
import java.time.*;
4.8.3静态 imports
可以使用静态方法和静态量

import static java.lang.System.*;
out.println("Goodbye,World");

4.8.4添加类到包中

package com.horstmann.corejava;
public class Employee{

}

存储路径

/home/user/classdir//根目录
com.horstmann.corejava.Employee

则类应该存放在
/home/user/classdir/com/horstmann/corejava/Employee
如果发现多个类会报运行时错误。

4.10.5一般评论

@author name
@version text
@see com.horstmann.corejava.Employee#raiseSalary(double)
{@link package.class#deature label}
posted @ 2024-12-22 15:03  zhongta  阅读(11)  评论(0)    收藏  举报