一、方法参数
- Java总是按值调用,方法不能修改一个基本数据类型的参数
double percent=10;
harry.raiseSalary(percent);
//percent的值还是10;(相当于形参)
2.对象引用作为参数就不同了,对象引用相当于指针,对象引用变量引用的那个实例对象,会变化。
public static void triplesalary(employee x)
{
x.raisesalary(200);
}
harry=new Employee(...);
tripSalary(harry)
- x被初始化为harry值的拷贝,这里是一个对象的引用。
- raisesalary方法引用于这个对象引用x,x和Harry同时引用的那个employee对象的薪资提高了200%
- 方法结束后,参数变量x不再使用,harry继续引用那个已经被提高两倍薪资的对象。
相当于指针作为函数参数
public static void swap(Employee x, Employee y)
{
Employee temp=x;
x=y;
y=temp;
}
注意,这里调用的只是x和y互相引用的对象,而不是把两个对象的值调换。
二、构造器
1.重载
StringBuilder message=new StringBuilder();
StringBuilder todoList=new StringBuilder("toto");
一个类有多个构造器方法,名字相同,不同参数。就产生了重载。
2.默认域初始化
如果构造器中没有给域赋予初值,那么会被自动赋予默认值:数值为0,布尔值为false,对象引用为null;但是应该明确地对域初始化。
3.无参数的构造器
class employee{
public employee(){
a=" ";
salary=0;
}
}
这是一个无参数构造器,当编写一个类时没有写构造器,系统会提供一个无参数构造器,并且将所有实例域设置为默认值。
但是如果类中提供了至少一个构造器,却没有无参数构造器,那么在new出一个对象实例时没有提供参数,会不合法。
4.显式域初始化 参数名
class employee{
int a=1;
Sting name;
public employee(String name){
this.name=name;
}
}
//这样所有创造出的对象,a的值都是1
//而name可以根据提供的参数值变化
//方法中的name引用的是String name这个参数,不是实例域
this.name才是实例域,this是隐式参数,也就是构造出的对象
5.调用另一个构造器
class ListNode {
int a;
String name;
public ListNode(int a){
this("殷家乐",1);
}
public ListNode(String name, int a){
this.name=name;
}
public static void main(String[] args) {
ListNode aa=new ListNode(2);
System.out.print(aa.name);
}
}
公共的代码部分;
也就是说你创建多个对象时,name总是“殷家乐”,a的值根据你提供的参数产生。
6.初始化块
class employee{
int a;
Sting name;
private static next=0;
{
a=next;
next++;
}
}
当创建对象时,初始化块会被执行。也就是说,每创建一个对象,a的值就是next此时的值,再创建第一个对象,a的值就是next+1的值。
三、包
包部分的知识看不太懂。
- 首先一个类可以使用所属包的所有类,以及其他包的共有类(public class)
有两种方法,在一个类中使用另一个包的共有类
第一种:
java.time.LocaDate today=java.time.LocaDate.now();
java.time.Date nextday=new java.time.Date();
第二种:
import java.util.* //这样就可以使用java.util包中的所有类了
import java.time.LocaLDate;
//这样就可以使用java.time包中的LocalDate类
//import语句在package语句后面,在源文件顶部。
只能使用*号导入一个包,不能import java.*
或者import java.*.*
但是如果两个包中都有一个名字相同的类,解决方法如下:
import java.util.*;
import java.sql.Date;
Date today=new Date();
//这样导入的类是sql包中的Date类
如果两个类都需要使用
java.util.Date deadline=new Date();
java.sql.Date today=new Date();
分割线
不仅可以导入包,还可以导入静态方法和静态域
import static java.lang.Sytem.*;
//就可以使用System类的静态方法和静态域
out.print(a);
四、类设计技巧
- 一定要保证数据私有
- 一定要对数据初始化
- 不要再类中使用过多的基本类型
- 不是所有域都需要独立的域访问器和域更改器
- 类名和方法名要能够体现他们的职责
- 优先使用不可变的类
- 将职责过多的类进行分解
例如
class nums{
int a=0;
String name="";
public ret(int a,String name){
this.a=a;
Sting name=name;
}
}
class toge{
nums[] a;
public cardDeck()
{...}
}