你真的理解面向对象吗?浅谈下那些重载中容易出现的雷区

package cn.kgc.tyl.test0924;
import java.util.Arrays;

/*
 * 	数组的equals
 */
public class TestEquals {
	public static void main(String[] args) {
		int[] nums1 = new int[]{1,2,3};
		int[] nums2 = new int[]{1,2,3};//因为new了对象
		System.out.println(nums1.equals(nums2));//false   调用Object类的equals方法,方法体是nums1==nums2?
		System.out.println(Arrays.equals(nums1, nums2));//true【雷区】    Arrays类的静态方法,会比较nums1和nums2两个数组的元素
	}//
}
*************************************************************
package cn.kgc.tyl.test0924;
public class TestInteger {
	public static void main(String[] args) {
		//==对于两个不一致的类型,会进行类型转换
		int num1 = 300;
		Integer num2 = new Integer(300);
		System.out.println(num1==num2);//true int和Integer,==不是比较地址,还是比数值


		double num3 = 300.0;
		System.out.println(num1==num3);//true int和double两个值类型,==直接比数值

		//==只有两个引用类型才会比较地址
		Integer num4 = new Integer(300);
		System.out.println(num2==num4);//这才是比较地址false



	}//int基本数据类型;integer封装类属于对象,属于引用类型比较的是地址,new 关键字修饰,地址肯定不同除非调用intern()方法
}
******************************************************************************************************
package cn.kgc.tyl.test0924;
class A{
	public void test() {
		System.out.println(1);
	}
}
class B extends A{
	public void test() {
		System.out.println(2);
		method();
	}
	public void method() {
		System.out.println(3);
	}
}
public class TestOveride {
	public static void main(String[] args) {
		new B().test();       //2,3
		A a = new B(); a.test(); //多态2,3父类指向子类的引用,调用a的方法【无参默认构造没有输出语句不考虑】,方法名同,形成多态,输出2,3
		B b = new B(); b.test();//2,3自己调用自己方法输出2,3
		//结果:都是打印2 3,因为实际上实例化的是B类,A类的test方法被覆盖了
		//
	}
}
*******************************************************************************************************************************
package cn.kgc.tyl.test0924;
/*
 * 	方法调用时
 * 		实参跟形参类型兼容就可以
 * 		byte\short\char		->	int		->	long	->	float		->	double
 */
public class TestOverloading {
	public void test(float f) {System.out.println(f);}
	public static void main(String[] args) {
		short num1 = 5;
		int num2 = 5;
		long num3 = 5;
		float num4 = 5;
		double num5 = 5;
		char num6 = 'a';
		boolean num7 = true;
		TestOverloading t = new TestOverloading();
		t.test(num1);
		t.test(num2);
		t.test(num3);
		t.test(num4);
		//t.test(num5);//double类型不能自动转成float类型
		t.test(num6);//char也是可以的
		//t.test(num7);//boolean类型不能自动转成float类型
	}
}
/**
 *运行结果
 5.0
5.0
5.0
5.0
97.0
方法类型不兼容时会报错,char类型由小到大自动转换为float,所以对应97.0
 * */
 * ********************************************************************************************************************
 * package cn.kgc.tyl.test0924;
/*
 * 重载
 * 	若有多个类型兼容的方法,实际调用一个类型更加接近的方法
 */
public class TestOverloading2 {
	public void test(int f) {System.out.println(f);}
	public void test(float f) {System.out.println(f);}
	public void test(float[] f) {System.out.println(f);}

	public static void main(String[] args) {
		TestOverloading2 t = new TestOverloading2();
		short num1 = 5;
		t.test(num1);//调用第一个test (short跟int的类型更加接近) 5

		long num2 = 5;
		t.test(num2);//调用第二个test(long不可以自动转成int,不能调用第一个)5.0

		int[] nums3 = {1};//运行报错
		t.test(nums3);//【雷区】报错(int[]不可以自动类型转换成float[],自动类型转换只能是7种值类型之间)//int类型默认时转换为double,不能转化为float
	//类型TestOverloading2中的方法测试(int)不适用于参数(int[])


	}
}
*************************************************************************************************************************************************
package cn.kgc.tyl.test0924;

import java.util.Arrays;

/*
 * 	重载
 * 	下面代码涉及到如下三个方法
		 * 	println(String str)
		 * 	println(Object obj)
		 * 	println(char[] arr)
 *  
 */
public class TestPrintln {
	public static void main(String[] args) {
		int[] nums1 = {1,2,3};
		char[] nums2 = {97,98,99};
		//以下四个调用的都是println(String str)方法
		System.out.println("nums1="+Arrays.toString(nums1));//[元素,...]
		System.out.println("nums1="+nums1);//地址
		System.out.println("nums2="+Arrays.toString(nums2));//[元素,...]
		System.out.println("nums2="+nums2);//地址
		
		System.out.println(nums1);//地址	调用的是println(Object obj)方法(int[]可以向上转型成Object类型)
		System.out.println(nums2);//元素...	调用的是println(char[] arr)方法
		/**
		 *运行结果:
		 nums1=[1, 2, 3]
nums1=[I@15db9742
nums2=[a, b, c]
nums2=[C@6d06d69c
[I@15db9742
abc

		 * */
	}
}
********************************************************************************************************************
package cn.kgc.tyl.test0924;
/*
 * 	理解String
 */
public class TestString {
	public static void main(String[] args) {
		String str = "abc";//final char[] value= {'a','b','c'};
		String str2 = str + "def";//【雷区】str依然是"abc",不会被改成"abcdef"//对象和字符串相加已经改变了对象
		str = str + "def";//“abc”+"def"后的“abcdef”新字符串,再次给str赋值,覆盖原来的str

		StringBuilder str3 = new StringBuilder("abc");//char[] value= {'a','b','c'};
		str3.append("def");//str3已被修改,{'a','b','c','d','e','f'};
		//根本不用写成str3 = str3.append("def");
	}
}
**********************************************************************************************************************************8
package cn.kgc.tyl.test0924;
/*
 * 	继续理解String
 */
public class TestString2 {
	public static void main(String[] args) {
		String str1 = "abc";//直接将"abc"加载到内存的方法区(字符串常量池),然后将地址给str1(存在栈区)
		String str2 = "abc";//直接用刚才的地址,给str2
		System.out.println(str1==str2);//true
		String str3 = new String("abc");//在堆区分配内存,将地址给str3(存在栈区)
		String str4 = new String("abc");//又在堆区分配内存,将地址给str4(存在栈区)
		System.out.println(str3==str4);//false
	}
}//new了,改变的时堆内的内存地址
*******************************************************************************************************************8
package cn.kgc.tyl.test0924;
import java.util.Arrays;

public class TestStringAndArrays {
	public void swap(int[] arr1,int[] arr2) {//引用类型
		int t = arr1[0];
		arr1[0] = arr2[0];
		arr2[0] = t;
		//交换了形参的两个数组中的0号元素,实际上实参的两个数组也被改变了
	}
	
	public void swap2(int n1,int n2) {//值类型
		int t = n1;
		n1 = n2;
		n2 = t;
		//此时打印n1和n2是交换了的
		//但是因为是值类型,实参不会被改变
	}
	
	public void swap3(String str1,String str2) {
		String t = str1;
		str1 = str2;
		str2 = t;
		//此时打印str1和str2也是交换了的
		//但是String是无法修改内容的,所以方法体中会让形参str1和str2改地址,实参不会改变
	}
	public static void main(String[] args) {//重点
		int[] nums1 = {1,2,3};
		int[] nums2 = {4,5,6};
		TestStringAndArrays tm = new TestStringAndArrays();
		System.out.println("调用之前:nums1="+Arrays.toString(nums1)+",nums2="+Arrays.toString(nums2));
		tm.swap(nums1, nums2);//传递的是两个地址
		System.out.println("调用之后:nums1="+Arrays.toString(nums1)+",nums2="+Arrays.toString(nums2));
	
		tm.swap2(nums1[1], nums2[1]);//不是引用类型,传递的是两个int
		System.out.println("\nswap2调用之后:nums1="+Arrays.toString(nums1)+",nums2="+Arrays.toString(nums2));
	
		
		String str1 = "aaa";
		String str2 = "bbb";
		System.out.println("\nswap3调用之前,str1="+str1+",str2="+str2);
		tm.swap3(str1, str2);//虽然传递的是地址,但是这个地址的内容是无法改变的
		System.out.println("\nswap3调用之后,str1="+str1+",str2="+str2);
	}
}
/**
 *运行结果如下
 调用之前:nums1=[1, 2, 3],nums2=[4, 5, 6]
调用之后:nums1=[4, 2, 3],nums2=[1, 5, 6]

swap2调用之后:nums1=[4, 2, 3],nums2=[1, 5, 6]

swap3调用之前,str1=aaa,str2=bbb

swap3调用之后,str1=aaa,str2=bbb
 * */

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

m0_45442261

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

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

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

打赏作者

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

抵扣说明:

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

余额充值