day10
理解"万事万物皆对象"
再谈方法:
匿名对象只能调用一次
new Phone().sendEmail();
new Phone().playGame();

new Phone().price = 1999;
new Phone().showPrice();//0.0

应用场景:
PhoneMall mall = new PhoneMall();

//匿名对象的使用
mall.show(new Phone());
其中
class PhoneMall{
public void show(Phone phone){
Phone.sendEmail();
Phone.playGeame();
}
}

4.6.1方法的重载
/*
 * 关于变量的赋值
 * 
 *    如果变量是基本数据类型,此时赋值的时变量所保存的数据值。
 *    如果变量是引用数据类型,此时赋值的时变量所保存的数据的地址值。
 */
public class ValueTransferTest {
    
	public static void main(String[] args) {
		
		int m = 10;
		int n = m;
		
		System.out.println("m = " + m + "n = " + n);
		
		n = 20;
		
		System.out.println("m =" + m + ", n = " + n);
		
		System.out.println("*************引用数据类型*************");
		
		Order o1 = new Order();
		o1.orderId = 1001;
		
		Order o2 = o1;//赋值以后,o1和o2的地址值相同,都指向
		
		System.out.println("o1.orderId = " + o1.orderId + ",o2.orderId = " +o2.orderId);
		
		o2.orderId = 1002;
		
		System.out.println("o1.orderId = " + o1.orderId + ",o2.orderId = " +o2.orderId);
	}
}

class Order{
	int orderId;
}

方法的重载(overload) loading...:在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。
1.定义:在同一类中,允许存在一个以上同名方法,只要它们的参数个数或者参数类型不同即可。
"两同一不同:同一类"
2.举例
Arrays类中重载sort() / binarySearch()

3.判断是否是重载:
      跟方法的权限修饰符、返回值类型、形参变量名、方法体都美好还有关系!
4. 在通过对象调用方法是,如何确定某一个指定的方法;
     方法名 --->  参数列表
public class OverLoadTest {
     //如下的4个方法构成了重载
     public void getSum(int i,int j){
         System.out.println("1");
     }
     public void getSum(double d1,double d2){
         System.out.println("2");
     }
     public void getSum(String s,int i){
         System.out.println("3");
     }
     public void getSum(int i,String s){
          System.out.println("4");
     }
      //下面三个不能跟上面的方法构成重载关系的
   //  public void getSum(int i,int j){
   //       return 0;
   //  }

   // public void getSum(int m,int n){
   // 
   //}
   // public void getSum(int i,int j){
   //  
   //}
}

public class OverloadExer {
     public void mOL(int i){
          System.out.println(i * i);
     }
     public void mOL(String s){
          System.out.println(i * j);
     }
}
如何判断是否构成方法的重载?
严格按照定义:两同一不同 
跟方法的权限修饰符、返回值类型、形参变量名、方法体都没有关系!
如何确定类中某一个方法的调用:
方法名 ---> 参数列表
拓展知识:方法的重载与重写的区别?
重载:两同一不同
重写:将该方法重写
throws/throw
String\StringBuffer\StringBuilder
Collection\Collections
final\finally\finalize
...
抽象类、接口
sleep()/wait()
4.6.2可变形参的方法
可变形参的方法:
/*
 * 可变个数形参
 * JavaSE5.0中提供了Varargs(variable number of arguments)机制,
 * 允许直接定义能和多个实参相匹配的形参,从而,可以用一种更简单的方式,来传递个数可
 * 变的实参。 
 * 
 * 1.Jdk 5.0新增的内容
 * 2.具体使用
 *    2.1 可变个数形参的格式,数据类型...变量名
 *    2.2 当调用可变个数形参的方法式,传入的参数个数可以是 0、1、2
 *    2.3 可变个数形参的方法与本类中方法
 *    2.4 可变个数形参的方法与本类中方法名相同,形参
 *    2.5 可变个数形参在方法的形参中,必须声明在末尾
 *    2.6 可变个数形参在方法的形参中,最多只能声明一个可变形参。
 */
//	public void show(String[] strs) {
//
//}
    //此为可变个数形参的使用规则
    public void show(String ... strs){}
  
   public void show(int i){

   }

   public void show(String s){
       System.out.println("show(String)"); 
   }
   
   public void show(String ... strs){
       System.out.println("show(String ... strs)");
   
       for(int i = 0;i < strs.length;i++){
            System.out.println(strs[i]);
       }
   }
   //不能与上一个方法同时存在
   //public void show(String[] strs){
   //
   //}
调用时:
    test.show("hello");
    test.show("hello",world");
    test.show();

    test.show(new String[]{"AA","BB","CC"});

4.6.3方法参数的值传递机制
package com.atguigu.java1;
/*
 * 关于变量的赋值
 * 
 *    如果变量是基本数据类型,此时赋值的时变量所保存的数据值。
 *    如果变量是引用数据类型,此时赋值的时变量所保存的数据的地址值。
 */
public class ValueTransferTest {
    
	public static void main(String[] args) {
		
		int m = 10;
		int n = m;
		
		System.out.println("m = " + m + "n = " + n);
		
		n = 20;
		
		System.out.println("m =" + m + ", n = " + n);
		
		System.out.println("*************引用数据类型*************");
		
		Order o1 = new Order();
		o1.orderId = 1001;
		
		Order o2 = o1;//赋值以后,o1和o2的地址值相同,都指向
		
		System.out.println("o1.orderId = " + o1.orderId + ",o2.orderId = " +o2.orderId);
		
		o2.orderId = 1002;
		
		System.out.println("o1.orderId = " + o1.orderId + ",o2.orderId = " +o2.orderId);
	}
}

class Order{
	int orderId;
}

规则:如果变量是基本数据类型,此时赋值的时变量所保存的数据值。
    如果变量是引用数据类型,此时赋值的时变量所保存的数据的地址值。
/*
 * 方法的形参的传递机制:值传递
 * 
 * 1.形参:方法定义时,声明的小括号内的参数
 *   实参:方法调用时,实际传递给形参的数据
 *   
 * 2.值传递机制:
 * 如果参数是基本数据类型,此时实参赋给形参的是,实参真实存储的数据值。
 * 
 * 
 */
public class ValueTransferTest1 {
public static void main(String[] args) {
int m = 10;
int n = 20;

System.out.println("m = "+ m + ",n = " + n);
//交换两个变量的值的操作
//int temp = m;
//m = n;
//n = temp;

ValueTransferTest1 test = new ValueTransferTest1();
test.swap(m, n);

System.out.println("m = " + m + ",n = " + n);

}

//交换数组中指定两个位置
public void swap(int m,int n) {
int temp = m;
m = n;
n = temp;
 }
}
/* 
示例代码:
方法参数的值传递机制(*):
 * 如果参数时基本数据类型,此时实参赋给形参的是实参真实存储的数据值。
 * 如果参数时引用数据类型,此时实参赋给形参的时实参存储数据的地址值。
//交换数组中指定两个位置元素的值
public class ValueTransferTest {
    public static void main(String[] args) {
        
         String s1 = "hello";
         
         ValueTransferTest test = new ValueTransferTest();
         test.change(s1);//hi~~
      
    }
   
    public void change(String s){
          s = "hi~~";
    }
}
将变量进行了赋值

将对象指向了同一地址
public static void main(String[] args){
    Data data = new Data();
    data.m = 10;
    data.n = 20;
    v.swap(data);
    System.out.println(data.m,data.n);
}
   swap(arr[],arr[i],arr[j]){
     int temp = arr[i];
     arr[i]  = arr[j];
     arr[j] = temp;
}

class Data{
  int m;
  int n;
}

*/
main(){
    int m = 10;
    int n = 20;
    v.swap(m,n);
    System.out.println(m,n); 
}

swap(int m,int n){
    int temp = m;
    m = n;
    n = temp;
    System.out.println(m,n);
}

/*
 * 递归方法的使用(了解)
 * 1.递归方法:一个方法体内调用它自身。
 * 2 方法递归包含了一种隐式的循环,它会重复执行某段代码,但这种重复执行必循循环控制 。
 * 递归一定要向已知方向递归,否则这种递归就变成了无穷递归,类似于死循环。
 */
	public class RecursionTest {
	public static void main(String[] args) {
		
		//例1:计算1-100之间所有自然数的和
		//方式一:
		int sum = 0;
		for(int i = 1;i <= 100;i++) {
			sum += i;
		}
		System.out.println(sum);
		//方式二:
        RecursionTest test = new RecursionTest();
        int sum1 = test.getSum(100);
        System.out.println(sum1);
        
        System.out.println("***********");
        int value = test.f(10);
        System.out.println(value);
	}
	
	public int getSum(int n) {
		
		if(n == 1) {
			return 1;
		}else {
			return n + getSum(n - 1);
		}
	}
	
	//例二:计算1-100之间所有自然数的乘积:n!
	public int getSum1(int n) {
		
		if(n == 1) {
			return 1;
		}else {
			return n * getSum(n - 1);
		}
	}
	
	//例子3:已知有一个数列:f(0) = 1,f(1) = 4,f(n+2)=2*f(n+1) + f(n),
	//其中n是大于0的整数,求f(10)的值。
	public int f(int n) {
		if(n == 0) {
			return 1;
		}else if(n == 1) {
			return 4;
		}else {
			//return f(n + 2) - 2 * f(n + 1);
		    return 2*f(n - 1) + f(n - 2);
		}
	}
	
	//例4:菲波那契数列
	
	//例5:汉诺塔问题
	
	//例6:快排
	
	//递归算法让我理解深刻,虽然很复杂但是可以用最简单的算法来解决所有问题。
	}

什么是方法的重载?
"两同一不同":同一个类、相同方法名;参数列表不同。
如何调用确定的方法:方法名 -> 参数列表
2.说明Java方法中的参数传递机制的具体体现?
基本数据类型:数据值
引用数据类型:地址值()
Person p1 = new Person();
User u1 = p1;//编译错误 (逆向思维、反证法)
u1.eat() u1.age
3.成员变量和局部变量在声明的位置上、是否有默认初始化值上、是否能有权限修饰符上、内存分配的位置上有何不同?
4.谈谈return关键字的使用、
1.结束方法
2.针对于有返回值的方法,return + 返回数据
5.提供如下代码的内存解析
pubilc class TransferTest3 {
public static void main(String[] args) {
TransferTest3 test = new TransferTest3();
test.first();
}
pubilc void first() {
int i = 5;
Value v = new Value();
v.i = 25;
second(v,i);
System.out.println(Value v,int i);
}
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和20。
1.内存结构:栈(局部变量)、堆(new出来的结构:对象、数组)
2.变量:成员变量 vs 局部变量 (方法内、方法形参、构造器、代码块内)

难点重重需要理解,后期继续学习后我会继续完善更新

posted on 2025-10-09 18:02  超哥进阶之路  阅读(6)  评论(0)    收藏  举报