一、方法的参数
我们常见的参数有:
(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