Java核心技术卷Ⅰ-第四章对象和类-创新互联
1.使用预定义类
10年积累的成都网站建设、成都网站制作经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有桦川免费网站建设让你可以放心的选择与我们合作。2.方法参数
3.对象构造
4.包
5.类设计技巧
1.使用预定义类
- 一个源文件只能有一个公共类,可以有任意数目的非公共类
- 可以使用通配符调用Java编译器:
javac Test*.java
- 使用
var
声明局部变量就不用担心0
、0L
和0.0
之间的区别,因为可以从变量的初始值推导出它们的类型,但是该关键字只能用于方法的局部变量,参数和字段的类型必须声明具体类型
class Test{var a; // 报错
public void test(var a){// 报错
var a = 1; // 不报错
}
}
为了避免出现空指针异常,有以下两个方式处理:
- 把
null
参数转换为非null
值:
if(n == null){name = "psj"; }else{name = n; }
- 使用
API
拒绝null
参数:
String name; public Test(String n){name = Objects.requireNonNull(n, "not null") }
- 把
不要编写返回可变对象引用的
getter
方法,如果要返回可变对象的引用,可以进行clone
// 错误示范
public class Employee{private Date hireDay;
public Date getHireDay(){return hireDay;
}
}
Employee e = ...;
Date d = e.getHireDay();
// 本来只想修改d对象的值,但是因为引用d和引用e的属性hireDay指向同一个Date对象,所以也把e中的hireDay修改了
d.setTime(...);
// 正确示范
public class Employee{private Date hireDay;
public Date getHireDay(){return (Date)hireDay.clone();
}
}
final
实例字段用于确保每个构造器执行后,该字段的值已设置并且不能修改;但是final
修饰的是一个类,该类的引用不会改变,但是类中的内容可以改变:
class Test {private final String ss = "psj";
private final A aa = new A();
public void test() {ss = "psj2"; // 报错
aa.setA(3); // 可以修改
}
}
class A {private int a = 1;
public void setA(int a) {this.a = a;
}
}
2.方法参数将参数传递给方法存在两个概念:
按值引用:方法接受的是调用者提供的值,即方法得到所有参数的副本,并且不能修改传递给它的参数变量的内容
按引用调用:方法接受的是调用者提供的变量位置,方法可以修改按引用传递的变量值
Java中采用按值引用,对于对象的引用也属于按值引用
public static void changeValue1(int x){// 基本类型参数
x = 3 * x;
}
public static void changeValue2(Person x){// 对象类型参数
x.add(100); // add方法是Person类中修改salary字段的方法
}
// 调用上述方法:
int a = 10;
Person p = new Person(200);
changeValue1(a); // a不会变
changeValue2(p); // p对象中的salary=200+100=300
Java中对方法参数能做什么和不能做什么:
- 方法不能修改基本数据类型的参数
- 方法可以改变对象参数的状态
- 方法不能让一个对象参数引用一个新的对象
public static void swap(Person x, Person y){Person temp = x; x = y; y = temp; } Person a = new Person(200); Person b = new Person(300); swap(a, b); // 此时对象a不会改为指向对象b,因为在swap方法中x和y只是a和b的副本,x和y会交换引用,但是a和b不会
- 重载指多个方法有相同的方法名但是有不同的参数,Java允许重载任何方法(包括构造器方法)
- 在构造器中没有显式为一个字段设置值,则会自动设置默认值(局部变量未设置值的话是不存在默认值)
- 不同的构造器可以认为是采用多种形式设置实例字段的初始状态:
- 无参构造器会将所有实例字段设置默认值
- 如果类中提供了有参构造器没提供无参的,就只能使用有参的,否则报错(即类中没有任何构造器时才会获得一个默认无参构造器)
- 存在三种初始化实例字段的方法,执行顺序为
实例字段初始化为默认值->初始化块->构造器
:- 在构造器中设置值
- 在声明中赋值
- 使用初始化块
- 为了保证包名的唯一性,使用因特网域名逆序的形式作为包名,如
com.psj.Spring
- 一个类可使用所属包(即该类所在包)中所有类和其他包中的公共类(因为类只能用
public
修饰或者不加修饰符) - 如果要直接使用其他包中的静态方法和静态字段:
import static java.lang.System.*;
out.println("xxx"); // System.out是静态方法
如果在源文件中的第一行加上
package
语句,则该文件中的类属于无名包下;如果运行无名包下的类就会将基目录下所有类进行编译(因为无名包和其他包的公共父目录为基目录);如果运行com.psj.A
下的类,此时还有com.psj2.B
这样的包,也同样会把com
目录下所有类编译(因为com.psj.A
和com.psj2.B
的公共父目录com
)假设在
com.psj
包下创建Test.java
,但是该文件开头为com.psj2
,这个文件也是可以编译的(要分辨一个文件在哪个包下就看第一行在哪个package
中,当然也可能属于无名包)修饰符的访问权限:
public
修饰的部分(类、方法和变量)可以由任意类使用private
修饰的部分(类、方法和变量)只能由定义它们的类访问- 没有修饰符则这些部分(类、方法和变量)由同一个包中所有方法访问
类路径列出的目录和归档文件(如
xxx.jar
,包含了多个压缩格式的类文件和子目录)是搜索类的起始点,假设要搜索com.psj.A
的类文件:- 先查看
Java API
类 - 找不到再去查看类路径
- 先查看
编译器的两个主要任务:
- 如果从当前包中导入一个类,编译器要搜索当前包中所有的源文件,查看哪个文件定义了该类
- 查看源文件是否比类文件新,如果是则自动重新编译
一定保证数据私有:最好保持实例字段的私有性
一定要初始化数据:最好不要依赖于系统默认值,而是显式初始化所有变量(提供默认值或构造器中设置)
不要在类中使用过多基本类型
不是所有字段都需要单独的
getter
和setter
方法分解过多指责的类
类名和方法名要体现它们的职责
优先使用不可变的类(使用
final
修饰的类):- 不可变类有
LocalDate
等,比如它的plusDays
方法不会更改对象,而是返回状态修改的新对象 - 如果类不可变,则可安全在多个线程间共享该对象
- 不可变类有
对象变量不实际包含一个对象,只是引用一个对象,它类似于C++的对象指针(不能类比于C++的引用,因为C++中没有
null
引用,而且引用不能赋值)在C++中如果使用一个没有初始化的指针会创建一个错误指针,在Java中会报错,所以无需担心指针问题
静态方法不能访问实例字段,但是可以访问静态字段
不存在两个同名同参但是返回值不同的方法
对于布尔类型字段使用的是
isXXX
方法而不是getXXX
方法每个JAR文件包含一个清单文件,名为
MAINIFEST.MF
,用于描述归档文件的特殊特性,它存在于META-INF
子目录中
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
名称栏目:Java核心技术卷Ⅰ-第四章对象和类-创新互联
网站链接:http://myzitong.com/article/ecjij.html