JAVA基础知识——方法的参数,特殊数据类型,装箱和拆箱...


一、方法的参数

我们常见的参数有:
(1)基本数据类型作为参数
(2)可变参数(三个点…)
(3)引用类型作为参数:数组,类类型,接口类型…
以下举几个例子方便大家理解:
1.可变参数

public class T02 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String[] names = {"谭维维","易烊千玺","周杰伦"};
		myPrint(names);
		
		//假如不喜欢任何歌星,传个空数组;
		String []names1 = {};
		myPrint(names1);
		
		//下面是可变参数的调用
		System.out.println("................");
		myPrint1(names);
		myPrint1();//可以不传参数
		myPrint1("金智秀");
	}
	//数组
	public static void myPrint(String[] names) {
		for (String name:names) {
			System.out.println(name);
		}
	}
	//打印用void,数组用String//把参数的数组[]改为...可变参数
	//因为数组具有局限性,它必须传入一个数组,哪怕是个空数组,用可变参数来解决
	public static void myPrint1(String... names) {
		for(String name:names) {//数组不会越界
			System.out.println(name);//逐个输出遍历结果
		}
	}
	//方法重载:在同一个类里面,同名不同参
	public static void myPrint() {
		
	}
	
}

2.基本数据类型和引用数据类型
提示:通过改变数字的值,读者可以发现两者的不同并总结出规律

public class E0401 {

	public static void main(String[] args) {
		//调用方法
		int i = 12;//声明实参,它是个局部变量
		changeNumber(i);//实参的值是12
		System.out.println("实参i的值:"+i);
		
		System.err.println("...............");
		//以下是关于引用类型的操作
		Number num = new Number();
		num.setI(12);
		changeNumber(num);
		System.out.println("实参Number.i的值"+num.getI());

	}
	//以下两个方法是重载,同名不同参
	//改变数字的值
	public static void changeNumber(int i) {//这里的参数是基本数据类型
		i = 10;
		System.out.println("形参i的值:"+i);
	}
	public static void changeNumber(Number num) {//这里是引用类型(类类型),常见的还有数组,接口类型
		num.setI(10);//赋值
		System.out.println("形参Number.i的值:"+num.getI());//得值
	}

}
//声明一个类类型
class Number{
	private int i;//可读可写get(),set()

	public int getI() {
		return i;
	}

	public void setI(int i) {
		this.i = i;
	}
	
}

在这里插入图片描述
规律总结:
(1)当基本数据类型作为参数的时候,形参改变,实参不改变。(值数据的Copy)
(2)当引用类型作为参数的时候,形参改变,实参也改变。(String除外,它是不可变的,第二部会详细说明)

二、特殊的数据类型

特殊的数据类型意思就是参数是引用类型,但是不符合形参改变,实参也改变的这条规律的数据类型,这种特殊的数据类型有String和包装类型。
虽然是引用类型,但是他们是引用类型的按值传递。
1.String类型举例

public class E05 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String name = "张三";
		changeString(name);
		System.out.println("实参名字:"+name);

	}
	public static void changeString(String name) {
		name = "李四";
		System.out.println("形参名字:"+name);
	}

}

运行结果如下图所示:
在这里插入图片描述
2.包装类型
Java为基本数据类型提供对应的包装类型,例如:
int —> Integer
short —> Short
byte —> Byte
long —> Long
char —> Character
boolean —> Boolean
这些类型都是形参改变,实参不发生改变。

三、装箱和拆箱

1.装箱
基本数据类型引用类型的隐式转换,叫做装箱。

int i  = 0;
Integer j = i;

2.拆箱
引用类型基本数据类型的转换,叫做拆箱。

Integer i = 0;
int j = i;

三、Object

Object:对象类型,所有类型的超类。如下图所示是它的方法
在这里插入图片描述
1.toString方法:继承过来的toString如果不重写的话,返回的是全类名 + 根地址相关的一个值。所以我们经常会重写该方法,让它变得有意义。

public class E06 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Object i = 0;//这是个装箱操作
		i = new E0601();//向上转型
		System.out.println(i.toString());
	}

}
class E0601{
	
}

运行结果如下图所示:
在这里插入图片描述
toString()的重写,可以快速自动生成,右键source—>generate toString()
2.equals()和hashcode()
(1)基本数据类型用==来判断,引用类型用equals()来判断。
(2)如果我们想改写两个对象是否相等的规则,我们要重写equals()和hashCode()。
(3)hashCode是什么?这个值跟地址相关的,意味着不同的对象应该有不同的hashcode,相同的对象应该有一样的hashcode值。
(4)equals:判断对象相等的逻辑规则;
hashCode:一个对象就应该有一样的hashcode值。
(5)举例:比如通过比较教师编号和教师名判断两个老师是否是一个人:

public class E06 {

	public static void main(String[] args) {
		// toString 方法的使用
		Teacher t = new Teacher(1001);
		System.out.println(t.toString());
		
		System.out.println(".....................");
		Teacher t1 = new Teacher(1002);
		t1.setTname("张三");
		Teacher t2 = new Teacher(1002);//逻辑上是一个老师,规则是判断地址是否一致
		t2.setTname("李四");
		boolean bln = t1.equals(t2);//引用类型判断两个对象是否相等用equals方法
		System.out.println(bln);
	}

}
class Teacher {
	// 属性(字段) 编号,姓名,年龄 ,课程 |
	private int tid; // 设置成 可读 不可写 只写get方法
	private String tname; // 可以写入,但是不可以读
	private int age; // 可读 可写
	private String courseName; // 可读 可写

	public Teacher()
	{
		Teacher t = new Teacher();
		
	}

	public Teacher( int tid )
	{
		this.tid = tid;
	}

	public String getTname() {
		return tname;
	}

	public void setTname(String tname) {
		this.tname = tname;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getCourseName() {
		return courseName;
	}

	public void setCourseName(String courseName) {
		this.courseName = courseName;
	}

	public int getTid() {
		return tid;
	}

	// 行为 (方法) 授课
	public void teach() {
		System.out.println(this.tname + "教师需要授课!");
	}

	@Override
	public String toString() {
		return "Teacher [tid=" + tid + ", tname=" + tname + ", age=" + age + ", courseName=" + courseName + "]";
	}
	//重写equals,修改了equals的规则,自动生成
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + tid;
		result = prime * result + ((tname == null) ? 0 : tname.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Teacher other = (Teacher) obj;
		if (tid != other.tid)
			return false;
		if (tname == null) {
			if (other.tname != null)
				return false;
		} else if (!tname.equals(other.tname))
			return false;
		return true;
	}
 
	}

四、思维导图

在这里插入图片描述
谢谢阅读,希望对你的学习有帮助。下期会介绍Object类里的字符串类String

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全宇宙无敌最靓的仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值