文章目录
- 一、理解“万事万物皆对象”
- 二、匿名对象的使用
- 三、类的方法
- 1. 方法的重载
- 2. 可变形参的方法
- 3. 方法参数的值传递机制
- 1. 关于变量的赋值
- 2.关于方法形参的传递机制:值传递
- 3.例题
- 4. 递归方法
一、理解“万事万物皆对象”
- 在Java语言范畴中,我们都将功能、结构等封装到类中,通过类的实例化,来调用具体的功能结构。
- 涉及到Java 语言与前端HTML、后端的数据库交互时,前后端的结构在Java层面交互时,都体现为类、对象。
二、匿名对象的使用
先创建一个类:
class Phone
{
double price;
public void sendEmail()
{
System.out.println("发邮件");
}
public void playGame()
{
System.out.println("打游戏");
}
}一般情况下要创建对象来调用类的属性和方法:
public class Phonemall
{
public static void main(String[] args)
{
Phone p=new Phone();
p.price=1999;
p.sendEmail();
}
}在匿名情况下,new出来的对象没有用一个变量名来承接:
public class Phonemall
{
public static void main(String[] args)
{
new Phone().sendMail(); //①
new Phone().playGame(); //② ①和②是两个不同的对象
}
}总结:
- 创建的对象没有显式的赋给一个变量名,即为匿名对象;
- 匿名对象只能调用一次。
三、类的方法
1. 方法的重载
(1)定义:在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数、参数顺序或者参数类型不同即可。(这部分可以参考C#)
(2)特点:与返回值类型无关,只看参数列表,且参数列表必须不同。(参数个数或参数类型)。调用时,根据方法参数列表的不同来区别。
搜索API发现Arrays类中有很多重载的 sort 方法。

2. 可变形参的方法
(1)JDK 5.0 新增内容。
(2)使用:采用可变个数形参来定义方法,传入多个同一类型变量 。public static void test(String…books); 假设在main 方法里有个对象p,那么:
p.test("hello");
p.test();
p.test("hello","world","how");都是正确的。
- 但是注意此时如果再定义
public static void test(String books[] );就会出错,编译器会认为这两个是相同的。不构成重载,不能共存。
(3)可变个数形参在方法的形参中,必须声明在末尾。
- 此时如果再定义
public static void test(String books[],int a );就会出错,但是public static void test(int a ,String books[]);是可以的。
(4)可变个数形参在方法的形参中,最多只能声明一个可变个数形参(由(3)知只能放末尾,所以只能声明一个)。
3. 方法参数的值传递机制
1. 关于变量的赋值
-
对于基本数据类型:此时赋值将变量保存的数据值传递给新的变量。
public class ValueTanserferTest
{
public static void main(String[] args)
{
int m=10;
int n=m;
System.out.println(n+","+m); //此时输出m=n=10;
n=20; //改变n的值
System.out.println(n+","+m); //此时输出m=10,n=20,改变n并不能改变m的值;
}
}-
对于引用数据类型:此时赋值时将变量保存的地址值传递给新的变量。
public class ValueTanserferTest
{
public static void main(String[] args)
{
Order o1=new Order();
o1.orderId=1001;
Order o2=o1; //并未开辟新的堆空间
System.out.println(o1.orderId+","+o2.orderId); //此时o1.orderId=o2.orderId=1001;
o2.orderId=1002; //改变o2.orderId的值
System.out.println(o1.orderId+","+o2.orderId); //此时o1.orderId=o2.orderId=1002,o1.orderId的值被同时改变,o1和o2的地址值相同。
}
}
class Order
{
int orderId;
}2.关于方法形参的传递机制:值传递
-
对于基本数据类型:此时赋值,实参赋给形参的是,实参真实存储的数据值。
交换两个变量的值:
public class ValueTanserferTest
{
public static void main(String[] args)
{
int m=10,n=20;
//直接写:
int temp=m;
m=n;
n=temp;
System.out.println(n+","+m); //此时输出m=20,n=10,交换成功;
}
}
//若把交换过程写为一个方法:
public class ValueTanserferTest
{
public static void main(String[] args)
{
int m=10,n=20;
ValueTanserferTest test=new ValueTanserferTest();
test.swap(m,n);
System.out.println(n+","+m); //此时输出m=10,n=20,交换失败;
}
public void swap(int m,int n)
{
int temp=m;
m=n;
n=temp;
}
}为什么交换失败呢?

在swap()函数里是交换成功的,但是交换结束后,swap()中的值依次出栈。所以只剩main()函数里的初始值,所以交换失败。若把输出语句加到swap()函数里,就可输出交换后的结果。
-
对于引用数据类型:此时赋值,实参赋给形参的是,实参存储数据的地址值。
交换两个变量的值:
public class ValueTanserferTest2
{
public static void main(String[] args)
{
Data data=new Data();
data.m=10;
data.n=20;
//直接写:
int temp=data.m;
data.m=data.n;
data.n=temp;
System.out.println(data.n+","+data.m); //此时输出m=20,n=10,交换成功;
}
class Data
{
int m;
int n;
}
}
//若把交换过程写为一个方法:
public class ValueTanserferTest2
{
public static void main(String[] args)
{
ValueTanserferTest2 test=new ValueTanserferTest2();
test.swap(data);
System.out.println(data.n+","+data.m); // //此时输出m=20,n=10,交换成功;;
}
public void swap(Data data) //Data类型的参数
{
int temp=data.m;
data.m=data.n;
data.n=temp;
}
}此时为什么交换就成功了呢?

main()的实参data给swap()中的形参data传递的是一个地址值,当交换结束后,swap()中的值依次出栈。但是此时还有其他指针指向堆空间的值,所以不会被当做垃圾回收,这也是交换成功的理由。
3.例题
public class TransferTest3
{
public static void main(String args[])
{
TransferTest3 test = new TransferTest3();
test.first();
}
public void first()
{
int i = 5;
Value v = new Value();
v.i = 25;
second(v, i);
System.out.println(v.i); //结果是20
}
public void second(Value v, int i)
{
i = 0;
v.i = 20;
Value val = new Value();
v = val;
System.out.println(v.i + " " + i); //结果是15,0
}
class Value
{
int i = 15;
}
}具体过程如下图:

图中s表示在second方法中的变量,f 表示在first方法中的变量。在方法结束后,其内部的变量逐次弹出,其对应的堆空间被回收。
4. 递归方法
定义:一个方法体内调用它自身。
















