值传递和引用传递、可变参数、作用域、构造函数、this关键字、对象的定义和使用

1.对象的定义和调用
  1. 定义格式为 class + 类名 此时的类名就相当于新定义的一个数据类型(作用如同 int)
  2. 创建一个class对象,格式:类名 + 类变量名 = new 类名();
  3. 用变量名.属性的方法,可以改变属性值,不改变为默认值(String 为null,int 为0)
  4. 在对象内定义方法(或者称函数)格式为:关键字 + 返回值类型 + 函数名 +(参数)+函数体
public class dx1
{
	public static void main(String args[])
	{
		Person p1 = new Person();
		p1.name = "小明";
		p1.age = 99;
		p1.changename(p1);
		System.out.print("名字是:" + p1.name + "\n年龄是:" +p1.age);
	}
}

class Person   //Person类/对象
{
	String name;
	int age;
	public void changename(Person p)  //可以在类定义里面写方法,参数为自己
	{
		p.name = "小红";
	}
}


2.值传递和引用传递

值传递和引用传递的基本区别就是当调用函数时,实参传入形参中,形参的改变是否会造成实参的改变。

  • 值传递形参不会改变实参。

当函数发生调用时,实参传入形参。调用函数实质上是在程序栈中新开辟了一段临时空间,而指向这部分临时空间的是一个临时地址。在这部分空间中,形式参数a,b的地址也是被重新指定的与实际参数地址不一样,只是他们被赋予了实际参数的值。而内存中的存储空间与地址相对应。因此此时改变形式参数的值,改变的是形式参数地址所指向的、刚开始被赋予实际参数的值。其实并不是改变实际参数地址所指向的值。因此,此时形式参数改变,而实际参数不改变。当函数调用完成返回时,这段临时空间又被系统自动回收,临时变量(也就是形参)的地址也被回收,因此称他们为临时,他们的作用域随着函数的调用而存在,随着函数的返回而销毁。

  • 引用传递

调用时同上,引用传递的参数并非普通数据类型,而是引用数据类型,也可以认为此时传递的是实参对应的地址,把地址传递给了形参变量。这样传递后。虽然也是在程序中开辟了一段新空间,但是此时引用传递的引用类型变量的地址与实参的地址是相同的,指向的是同一片存储空间,因此,此时对形参做出的改变与对实参做出的改变等价。当然,形参的变量也并不是与实参变量就是一个东西了,他们只是两个不同的变量,但是所指向同一片存储空间罢了,如果修改形参变量的地址指向,然后再对形参变量所存储的是数据做出改变,那么此时是不会影响实参变量的数据。

public class dx2
{
	public static void main(String args[])
	{
		Person p1 = new Person();
		p1.name = "小红";
		p1.age = 99;
		p1.fn1(p1);
		System.out.println("外" + p1 ); //外 有地址
	}
}

class Person
{
	String name;
	int age;
	public void fn1(Person p)
	{
		p = null;	//形参改变了指向,此时p.name,p.age的改变不会影响p1了
		System.out.println("里" + p); //里地址为null
	}
}

3.可变参数

基本语法 访问修饰符+返回类型+函数名+(数据类型 …形参名)

  1. 可变参数对应的实参可以是0个或多个
  2. 可变参数本质为数组,可直接接受数组传参
  3. 参数列表中普通数据类型放在前,可变参数放最后
  4. 参数列表中最多只能出现一个可变参数
public class chongzai
{
	public static void main(String[] args)
	{
		cjlmethod c1 = new cjlmethod();
		c1.show("小明",90.0,80.0);
	}
}

class cjlmethod
{
	public void show(String name,double ...nums)
	{
		double totals = 0.0;
		for(int i = 0 ;i < nums.length;i++ )
		{
			totals += nums[i];
		}
		System.out.println("姓名为:" + name + "\n总成绩为:" + totals + "分");
	}
}
/*输出结果为:姓名为:小明
			总成绩为170.0分*/

4.作用域
  1. 全局变量也称属性,在函数外声明,声明时可以不赋初始值(有默认值)。局部变量声明必须赋初值(无默认值)。
  2. 局部变量随着函数的调用而生成,随着函数的结束而销毁。全局变量在类的范围一直存在
  3. 全局变量和局部变量可以重名,调用时按就近原则
  4. 全局变量前可加修饰符,局部变量不可加修饰符

5.构造器(构造函数)

构造函数用来完成对新对象的初始化(而不是创建对象)

  • 函数名与类名相同
  • 无返回值
  • 创建对象时系统自动调用
  • 若没有定义构造函数,系统会自动生成一个默认构造函数,若定义则会覆盖默认构造函数,若需要无参构造函数,需要自己再重载一个显示构造函数(类一定有构造函数的原因)

6.this关键字

使用细节

  • this指向当前类,用以区分全局变量和局部变量
  • this可用在构造函数中(而且必须放在第一条语句中):this(参数列表)
  • 哪个类变量调用该类,this就指向哪个类变量
  • this只能在类定义的函数内使用,不可在外部使用
  • this可访问当前类的变量、函数。
public class ex03
{
	public static void main(String[] args)
	{
		book bk = new book("数据结构",199);
		System.out.println("书名为:" + bk.name + "\n价格为" + bk.price );
		bk.updateprice();
		System.out.println("书名为:" + bk.name + "\n价格为" + bk.price );
	}
		/*书名为:数据结构
		  价格为199
		  书名为:数据结构
		  价格为150
		*/
}

class book
{
	String name;
	int price;
	public book(String name ,int price )
	{
		this.name = name;   //构造函数
		this.price = price;
	}

	public void updateprice()
	{
		if(this.price >= 150)
			this.price = 150;
		else if(this.price >= 100)
			this.price =100; 
	}
}
  • 33
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值