1. 方法参数的值传递机制
1.针对于方法内变量的赋值举例:
//基本数据类型的情况
int n1 = 10;
int n2 = n1;
//引用数据类型的情况
//情况1
int[] arr1 = new int[]{1,2,3};
int[] arr2 = arr1;
System.out.println(Arrays.toString(arr1));
arr2[0] = 10;
System.out.println(Arrays.toString(arr1));
//情况2
User u1 = new User();
u1.name = "Tom";
u1.id = 1001;
User u2 = u1;
u2.id = 1002;
规则:
1.针对于基本数据类型的变量:将基本数据类型的变量保存的真实的数据值赋给另外的变量。
2.针对于引用数据类型的变量:将引用数据类型的变量a赋值给引用数据类型的变量b,实际上是将变量a保存的地址值赋给变量b。
2.针对于方法的参数概念
形参:方法在声明时,一对()内声明的变量
实参:在方法调用时,实际传递给形参的值。
3.java中参数传递机制:
规则:
形参是基本数据类型:传递的是基本数据类型变量保存的数据值。
形参是引用数据类型:传递的是引用数据类型变量保存的对象(或数组的地址值)
推广:
① 针对于基本数据类型的变量:将基本数据类型的变量保存的真实的数据值赋给另外的变量。
② 针对于引用数据类型的变量:将引用数据类型的变量a赋值给引用数据类型的变量b,实际上是将变量a保存的地址值赋给变量b。
4.典型例题与内存解析:
【例题1】
public class ValueTransferTest1 {
public static void main(String[] args) {
int m = 10;
int n = 20;
System.out.println("m = " + m + ", n = " + n);
// 交换两个变量的值
// int temp = m;
// m = n;
// n = temp;
ValueTransferTest1 test = new ValueTransferTest1();
test.swap(m, n);
System.out.println("m = " + m + ", n = " + n);
}
public void swap(int m,int n){
int temp = m;
m = n;
n = temp;
}
}
【例题2】
public class ValueTransferTest2 {
public static void main(String[] args) {
Data data = new Data();
System.out.println("m = " + data.m + ", n = " + data.n);
//交换对象的两个属性值
// int temp = data.m;
// data.m = data.n;
// data.n = temp;
ValueTransferTest2 test = new ValueTransferTest2();
test.swap(data);
System.out.println("m = " + data.m + ", n = " + data.n);
}
public void swap(Data data){
int temp = data.m;
data.m = data.n;
data.n = temp;
}
}
class Data{
int m = 10;
int n = 20;
}
2. 递归方法
2.1 定义:
递归方法:一个方法体内调用它自身。
2.2 如何理解递归方法?
方法递归包含了一种隐式的循环,它会重复执行某段代码,但这种重复执行无须循环控制。
递归一定要向已知方向递归,否则这种递归就变成了无穷递归,类似于死循环。
2.3 举例:
举例1:求1-100自然数的和
public int getSum(int number){
if(number == 1){
return 1;
}else{
return number + getSum(number - 1);
}
}
举例2:求n!
public int getSum(int number){
if(number == 1){
return 1;
}else{
return number * getSum(number - 1);
}
}
举例3:
//已知一个数列:f(0) = 1,f(1) = 4,f(n+2)=2*f(n+1) + f(n),其中n是大于0的整数,求f(10)的值。
public int f(int n){
if(n == 0){
return 1;
}else if(n == 1){
return 4;
}else{
return 2 * f(n - 1) + f(n - 2);
}
}
举例4:斐波那契数列
举例5:快速排序
举例6:汉诺塔问题
3. 面向对象特征之一:封装和隐藏
1.1 为什么要引入封装性?
我们程序设计追求“高内聚,低耦合”。
高内聚 :类的内部数据操作细节自己完成,不允许外部干涉;
低耦合 :仅对外暴露少量的方法用于使用。
隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提高系统的可扩展性、可维护性。通俗的说,把该隐藏的隐藏起来,该暴露的暴露出来。这就是封装性的设计思想。
1.2 问题引入:
我们在创建了对象以后,可以通过"对象.属性"或"对象.方法"的方式,调用类中的内部结构。在调用属性时,由于属性类型和储值范围的要求,使得我们在赋值时要格外注意。但是,在实际问题中,给属性的赋值往往更严格。比如:Animal类的legs属性的赋值就不能为负数等条件。但是此条件不能通过声明属性的方式进行限制,那么只能通过方法对属性赋值,同时加入赋值的限制条件。(比如:setLegs)。同时,我们还应该禁止用户再通过"对象.属性"的方式给legs属性的方式赋值。则需要将属性声明为private。
1.3 封装性思想具体的代码体现:
体现一:我们可以私有化(private)类的属性,同时,提供公共的(public)方法:get()和set(),对类的属性进行调用。
体现二:类中如果有不希望对外暴露的方法时,可以将此方法声明为private的。对外暴露的方法,声明为public。
体现三:如果我们不希望在类的外部创建对象。我们就可以将类中所有的构造器声明为private
体现四:如果创建的类只希望在本包内被调用,则可以将此类声明为缺省权限的。
1.4 Java规定的四种权限修饰符
1.4.1 权限从小到大顺序为:
private < 缺省 < protected < public
1.4.2 具体的修饰范围:
1.4.3 权限修饰符可用来修饰的结构说明:
可以使用4种权限修饰符来修饰类的内部结构:属性、方法、构造器、内部类
可以修饰类的权限修饰符:public 、 缺省
权限修饰符的使用:使用不同的权限修饰符来修饰类及类的内部结构,体现这些结构被调用时的可见性的大小。
4. 类的成员之三:构造器(构造方法)
4.1 构造器(或构造方法):类的成员之三
构造器的作用:
- 创建类的对象
- 属性的初始化
4.2 使用说明:
① 当我们在类中没显示的定义构造器时,系统会默认提供一个空参的构造器
② 构造器的定义格式:权限修饰符 类名(形参列表){}
③ 一个类的多个构造器之间构成重载
④ 当我们在类中显示的声明了类的构造器时,系统就不再提供默认的空参构造器
⑤ 一个类中,一定会有构造器的声明。
4.3 举例:
//构造器
public Person(){
System.out.println("Person()....");
}
public Person(int a){
age = a;
}
public Person(String n){
name = n;
}
public Person(String n,int a){
name = n;
age = a;
}
5. JavaBean、UML类图
JavaBean是一种Java语言写成的可重用组件。
所谓javaBean,是指符合如下标准的Java类:
- 类是公共的
- 一个无参的公共的构造器
- 属性,且对应的get、set方法
用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用Java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。用户可以认为JavaBean提供了一种随时随地的复制和粘贴的功能,而不用关心任何改变。
6. 关键字this
6.1 可以调用的结构:
属性、方法、构造器
6.2 this调用属性、方法:
- 理解为:当前对象 或 当前正在创建的对象
我们可以在类的构造器或方法中,使用"this.属性"或"this.方法"的方式,显示的调用当前对象(或当前正在创建的对象)的属性或方法。只是大部分情况下,我们选择省略此"this."。但是,如果方法或构造器的形参与属性同名,此时,我们必须显式的使用"this.变量"的方式表明调用的是当前类中的属性,而非形参。
6.3 this调用构造器:
① 格式:在类的构造器中可以通过"this(形参列表)"的方式显式的调用当前类中指定的其它的构造器
② "this(形参列表)" 必须声明在构造器的首行!
③ 在一个构造器中,最多只能声明一个"this(形参列表)"的结构
④ 如果一个类中有n个构造器,最多有n - 1个构造器中使用了"this(形参列表)"
7. 相关练习
- 内存解析: