对象的属性和方法

**“理解万事万物皆对象”
1、在Java语言范畴中,我们都将功能、结构等封装到类中,通过类的实例化,来调用具体的功能结构。
2、涉及Java语言与前端Html、后端数据库交互时,前后端的结构在Java层面交互时,都体现为类、对象。
匿名对象
理解:我们创建的对象,没有显式的赋给一个变量名。即为匿名对象
特征:匿名对象只能调用一次。
使用:一般赋给方法形参使用,如下

public class InstanceTest {
	public static void main(String[] args) {
		Phone p = new Phone();
//		p = null;
		System.out.println(p);
		p.sendEmail();
		p.playGame();
		//匿名对象
//		new Phone().sendEmail();
//		new Phone().playGame();
		new Phone().price = 1999;
		new Phone().showPrice();//0.0
		//**********************************
		PhoneMall mall = new PhoneMall();
//		mall.show(p);
		//匿名对象的使用
		mall.show(new Phone());
	}
}
class PhoneMall{
	public void show(Phone phone){
		phone.sendEmail();
		phone.playGame();
	}
}
class Phone{
	double price;//价格
	public void sendEmail(){
		System.out.println("发送邮件");
	}
	public void playGame(){
		System.out.println("玩游戏");
	}
	public void showPrice(){
		System.out.println("手机价格为:" + price);
	}
}

属性(成员变量) vs 局部变量
1.相同点:
1.1 定义变量的格式:数据类型 变量名 = 变量值
1.2 先声明,后使用
1.3 变量都有其对应的作用域
2.不同点:
2.1 在类中声明的位置的不同
属性:直接定义在类的一对{}内
局部变量:声明在方法内、方法形参、代码块内、构造器形参、构造器内部的变量

2.2 关于权限修饰符的不同
属性:可以在声明属性时,指明其权限,使用权限修饰符。
常用的权限修饰符:private、public、缺省、protected —>封装性
目前,大家声明属性时,都使用缺省就可以了。
局部变量:不可以使用权限修饰符。
2.3 默认初始化值的情况:
属性:类的属性,根据其类型,都有默认初始化值。
整型(byte、short、int、long):0
浮点型(float、double):0.0
字符型(char):0 (或’\u0000’)
布尔型(boolean):false
引用数据类型(类、数组、接口):null
局部变量:没有默认初始化值。
意味着,我们在调用局部变量之前,一定要显式赋值。
特别地:形参在调用时,我们赋值即可。
2.4 在内存中加载的位置:
属性:加载到堆空间中 (非static)
局部变量:加载到栈空间
重载方法
在同一个类中,同名不同参的两个方法构成了重载。
(不同参包括了参数的个数,类型,顺序,但不包括参数的变量名称)
可变个数的形参
1、可变个数形参的格式:数据类型 … 变量名
2、当调用可变个数形参的方法时,传入的参数个数可以是:0个,1个,2个,。。。
3、可变个数形参的方法与本类中方法名相同,形参不同的方法之间构成重载
4、可变个数形参的方法与本类中方法名相同,形参类型也相同的数组之间不构成重载。换句话说,二者不能共存。

public void show(String ... strs){
		System.out.println("show(String ... strs)");
		for(int i = 0;i < strs.length;i++){
			System.out.println(strs[i]);
		}
	}
	//不能与上一个方法同时存在
//	public void show(String[] strs){
//		
//	}

由于可变个数的形参是jdk 5.0新增的内容,之前都是以数组的方式表示 。

public static void main(String[] args) {
		MethodArgsTest test = new MethodArgsTest();
		//以可变个数的形参表示的方法用下面两种方式调用都行
		test.show("AA","BB","CC");
//		test.show(new String[]{"AA","BB","CC"});		
	}

5、可变个数形参在方法的形参中,必须声明在末尾。

	//The variable argument type String of the method 
	//show must be the last parameter
//	public void show(String ...strs,int i){//String ...strs必须放在int i后面
//		
//	}

6、可变个数形参在方法的形参中,最多只能声明一个可变形参。

可变个数形参举例在工作中哪里用到?
在数据库查询中,select…from…where(
id=?,name=?,age=?,…
)
?,?,?占用符所组成的数据根据用户的需求具有不确定性,可以用到可变个数形参。

方法形参的传递机制:值传递
1、形参:方法定义时,声明的小括号内的参数
2、实参,方法调用时,实际传递给形参的数据
如果参数是基本数据类型,此时实参赋给形参的是实参真实存储的数据值。
如果参数是引用数据类型,此时实参赋给形参的是实参存储数据的地址值。

基本数据类型
在这里插入图片描述
引用数据类型在这里插入图片描述
递归方法
递归方法:一个方法体内调用它自身。
注意:方法递归包含了一种隐式的循环,它会重复执行某段代码,但这种重复执行无须循环控制。递归一定要向已知方向递归,否则这种递归就变成了无穷递归,类似于死循环。

public class RecursionTest {

	public static void main(String[] args) {

		// 例1:计算1-100之间所有自然数的和
		// 方式一:
		int sum = 0;
		for (int i = 1; i <= 100; i++) {
			sum += i;
		}
		System.out.println(sum);
		// 方式二:
		RecursionTest test = new RecursionTest();
		int sum1 = test.getSum(100);
		System.out.println(sum1);
		
		System.out.println("*****************");
		int value = test.f(10);
		System.out.println(value);

	}

	// 例1:计算1-n之间所有自然数的和
	public int getSum(int n) {// 3

		if (n == 1) {
			return 1;
		} else {
			return n + getSum(n - 1);
		}

	}

	// 例2:计算1-n之间所有自然数的乘积:n!
	public int getSum1(int n) {

		if (n == 1) {
			return 1;
		} else {
			return n * getSum1(n - 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 f(n + 2) - 2 * f(n + 1);
			return 2*f(n - 1) + f(n - 2);
		}
	}

	//例4:斐波那契数列
	
	//例5:汉诺塔问题
	
	//例6:快排

}
发布了25 篇原创文章 · 获赞 0 · 访问量 635

猜你喜欢

转载自blog.csdn.net/CGB1804Great/article/details/103707911