文章目录

  • 一、理解“万事万物皆对象”
  • 二、匿名对象的使用
  • 三、类的方法
  • 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 方法。

java硅谷 尚硅谷java教程_java硅谷


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;
	}
}

为什么交换失败呢?

java硅谷 尚硅谷java教程_java硅谷_02


在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;
	}
}

此时为什么交换就成功了呢?

java硅谷 尚硅谷java教程_值传递_03


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;
	}
}

具体过程如下图:

java硅谷 尚硅谷java教程_赋值_04

图中s表示在second方法中的变量,f 表示在first方法中的变量。在方法结束后,其内部的变量逐次弹出,其对应的堆空间被回收。


4. 递归方法

定义:一个方法体内调用它自身。