Java 面向对象编程
1. 类和对象
1.1 引用
new关键字创建该类的对象,这个过程叫做类的实例化
创建对象的本质是在内存的堆区中申请一块存储区域
引用数据类型定义的变量叫做引用变量,引用变量记录对象在堆区中的内存地址信息
可变长参数:返回值类型 方法名(参数的类型... 参数名)参数个数为0~n个
一个方法的形参列表最多只能声明一个可变长参数,并需要放到参数列表的末尾
1.2 方法传参的过程
class m{
int max (int ia, int ib) {}
public static void main(String[] args) {
int a = 5;
int b = 6;
int res = max(a, b);
}
}
为main方法的变量a, b,res 分配空间并初始化
调用max方法为max方法的形参变量 ia, ib分配空间
将实参变量的数值(a,b)赋值到形参变量(ia,ib)的内存空间中
max()方法执行完毕后返回,形参变量(ia,ib)的空间释放
main()方法中res变量得到max()方法的返回值
main()方法结束后释放相关变量的内存空间
方法传参的注意事项
public class ArgumentTest {
void show (int ia) {
System.out.println(ia);
}
public static void main(String[] args) {
ArgumentTest at = new ArgumentTest();
int ib = 10;
at.show(ib);
System.out.println(ib);
}
}
//ia = ib = 10;
public class ArgumentTest {
void show (int ia) {
ia = 200;
System.out.println(ia);
}
public static void main(String[] args) {
ArgumentTest at = new ArgumentTest();
int ib = 10;
at.show(ib);
System.out.println(ib);
}
}
//ia = 200, ib = 10;
基本数据类型的变量作为方法的参数传递时,形参变量数值的改变通常不会影响到实参变量的数值,因为两个变量有各自独立的内存空间
public class ArgumentTest {
void show (int[] arr) {
System.out.println(arr[0]);
}
public static void main(String[] args) {
ArgumentTest at = new ArgumentTest();
int[] arr1 = new int[]{10,20};
at.show(arr1);
System.out.println(arr1[0]);
}
}
//arr[0] = arr1[0] = 10;
public class ArgumentTest {
void show (int[] arr) {
arr[0] = 200;
System.out.println(arr[0]);
}
public static void main(String[] args) {
ArgumentTest at = new ArgumentTest();
int[] arr1 = new int[]{10,20};
at.show(arr1);
System.out.println(arr1[0]);
}
}
//arr[0] = arr1[0] = 200;
引用数据类型变量作为方法的参数传递时,形参变量指向内容的改变会影响到实参变量指向内容的数值,两个变量指向同一块内存空间
public class ArgumentTest {
void show (int[] arr) {
arr = new int[2];
arr[0] = 200;
System.out.println(arr[0]);
}
public static void main(String[] args) {
ArgumentTest at = new ArgumentTest();
int[] arr1 = new int[]{10,20};
at.show(arr1);
System.out.println(arr1[0]);
}
}
//arr[0] = 200, arr1[0] = 10;
引用数据类型变量作为方法的参数传递时,若形参变量改变指向后再改变指定的内容,则通常不会影响实参变量指向内容的改变,因为两个变量指向不同的内存空间
2. 方法和封装
2.1 构造方法
构造方法与类名完全相同并且没有返回值类型(包括viod)
默认/缺省构造方法,当一个类没有定义任何构造方法编译器会自动添加一个无参的构造方法
构造方法的作用是在new关键字创建对象时自动调用构造方法实现成员变量的初始化工作
2.2 方法的重载(overload)
方法名相同,参数列表不相同:
参数的个数不同
参数的类型不同
参数的顺序不同
与返回值类型和形参变量名无关
重载的实际意义:记住一个方法名就可以调用不同的版本来实现不同的功能
System.out.print(int i);
System.out.print(String s);
System.out.print(float l);
System.out.print(Double b);
2.3 this 关键字
若在构造方法中出现了this关键字,则代表当前正在构造的对象
若在成员方法中出现了this关键字,则代表当前正在调用的对象
this关键字本质就是当前类类型的引用变量
工作原理
构造方法和成员方法访问成员变量时,编译器会加上this.前缀
不同的对象调用同一个方法时,由于调用方法的对象不同导致this关键字不同,因此this.访问的结果也不同
使用方式
当局部变量名与成员变量名相同时,在方法体中会优先使用局部变量(就 近原则),若希望使用成员变量,则需要在成员变量的前面加上this.的前 缀,明确要求该变量是成员变量
this关键字除了可以通过this.的方式调用成员变量和成员方法外,还可以 作为方法的返回值
class Person {
Person getPerson() {
return this; //返回当前正在调用此方法的对象本身
}
public static void main(String[] args) {
Person p = new Person();
p.getPerson();
}
}
在构造方法的第一行可以使用this()的方式来调用本类中的其它构造方法
引用变量注意事项
引用类型变量用于存放对象的地址,可以给引用类型赋值为null,表示不 指向任何对象
当某个引用类型变量为null时无法对对象实施访问(因为它没有指向任何 对象)。此时,如果通过引用访问成员变量或调用方法,会产生 NullPointerException 异常
2.4 封装
对成员变量进行处理隐藏成员变量的细节以及保证数值的合理性
封