09.方法的参数传递、递归、封装和隐藏、构造器、this

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. 相关练习

在这里插入图片描述

  • 内存解析:
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值