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
* */
版权声明:本文为m0_45442261原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。