本文共 5474 字,大约阅读时间需要 18 分钟。
(1)byte->short,char->int->long->float->double可自动类型转换;反方向须强制类型转换
(2)char/byte/short参与运算后,结果为int型。【byte、short、char在储存前会转换为int,boolean也被转换为int,0表示false,非0表示true】
package com.fupng3.str;public class CharDemo { public static void main(String[] args) throws Exception { byte chr='A'; short n=2; //若m申明为非int型,则编译报错 short m1=n+chr;//编译报错 int m2=n+chr; }}
char型只能表示unicode编码范围在\u0000至\uffff之间的汉字,超过2个字节的无法表示,如“𣡕”
package com.fupng3.str;public class CharDemo { public static void main(String[] args) throws Exception { char chr1='A'; char chr2='我'; char chr3='\uD84E\uDC55';//对应汉字𣡕,该行编译报错 }}
(1)局部变量不会默认初始化,只有类的属性才会默认初始化
(2)局部变量和属性的区别
属性 | 局部变量 | |
定义位置 | 类的{}中 | 方法体或形参 |
权限修饰符 | private/默认/protected/public | 无 |
默认初始化 | new对象时,各属性进行默认初始化 | 不进行默认初始化 |
存放位置 | 堆/常量池 | 栈 |
(1)==:基本数据类型比较值是否相等;引用类型默认用于比较地址是否相等
//Object类equals方法,用于比较地址值是否相等(所有引用类型默认继承Object) public boolean equals(Object obj) { return (this == obj); }
(2)equals默认同==【equals方法不能用于比较基本数据类型】
//Object类中equals源码 public boolean equals(Object obj) { return (this == obj); }
(3)某些类会重写equals方法,用于比较值是否相等,如String、Date、ArrayList
//String类的equals方法public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
(1)向上转型<多态>:子类调用父类的属性或方法。【自动类型转换】
(2)向下转型:父类调用子类的属性或方法。【强制类型转换,且为父子类关系】
(1)8中基本数据类型都有对应的包装类,包装类的目的是使基本数据类型与类能相互转换(基本数据类型能有类的属性,类能参与运算),如java集合类中,只能使用包装类
(2)基本数据类型、包装类、String的相互转换
(3)Integer中有内部类IntegerCache,用于缓存-128至127之间的数据
package com.fupng3.wrapper;public class TestBz { public static void main(String[] args) { int int1 = 12; int int2 = 12; System.out.println(int1==int2);//true,基本数据类型比较值 Integer integer1 = new Integer(12); Integer integer2 = new Integer(12); System.out.println(int1==integer1);//true,自动拆箱,当Integer与int进行==比较时,Integer就会拆箱成一个int类型 System.out.println(integer1==integer2);//false,2个new的对象,在堆中地址不同 Integer a1 = 12; //或者写成Integer a1 = Integer.valueOf(12); Integer a2 = 12;//或者写成Integer a2 = Integer.valueOf(127); System.out.println(integer2==a1);//false,integer2在堆中,a1在常量池 System.out.println(a1==a2);//true,Integer a1 = 12这种方式定义,相当于valueof方法获取,如果值在-128至127之间,则在常量池中取,反之new Integer a3 = 200; Integer a4 = 200; System.out.println(a3==a4);//false }}
(4)Integer.valueof方法源码
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
定义方法格式: 权限修饰符 返回值 函数名(形参) 异常;
(1)函数重载须满足:一同+三不同(三不同种满足其一即可)
(2)方法重写须满足:
(a)更好的访问:权限修饰符不小于父类
(b)有兼容的返回:返回类型若为基本数据类型,则重写方法返回类型不可变;返回类型若为引用数据类型,则重写方法返回类型为该类或该类子类;
(c)同名同形参;
(d)不能比父类抛出更多的异常。
(3)注意点
(a)重载与重写的区别与联系:方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性(类内的多态性),而后者实现的是运行时的多态性(父子类间的多态性<重写是对父类方法的重定义>)。
(b)构造函数须与类同名+重写是对父类方法的重定义,所以:构造函数可以重载,构造函数不可以重写
(1)方法名相同
(2)参数个数不同
(3)参数类型不同
(4)参数顺序不同
(1) 方法重载例子
package com.fuping3.ioc;public class UserDao{ public void ov(String name){ System.out.println("1"); } private void ov(String name,int age){ System.out.println("2"); } public int ov(int age,String name){ System.out.println("3"); return 3; }}
(2) 非方法重载例子
//权限修饰符不同 public void ov(String name){ System.out.println("1"); } private void ov(String name){ System.out.println("1"); }
//返回值不同 public void ov(int age,String name){ System.out.println("3"); } public int ov(int age,String name){ System.out.println("3"); }
//不同方法名 public void ov(int age,String name){ System.out.println("3"); } public int ov2(int age,String name){ System.out.println("3"); }
//抛出不同异常 public int ov2(int age,String name){ System.out.println("3"); return 3; } public int ov2(int age,String name) throws Exception{ System.out.println("3"); return 3; }
可变形参类似于数组
(1)可变形参可传可不传(不传值时:不为空且长度为0),数组形参一定要传;
(2)可变形参只能有一个且在最后
package com.fuping3.aop;public class AopTestDemo { public static void main(String[] args) { aa("1",2,new String[]{"3","4"}); aa("5",6); System.out.println("*********"); bb("1",2,new String[]{"3","4"}); //bb("5",6);//编译报错:形参为数组时,不传会编译不通过 } public static void aa(String i,int j,String ...k){ System.out.println(i); System.out.println(j); //未传可变参数时,k.length等于0 for(int m=0;m< k.length;m++){ System.out.println(k[m]); } } public static void bb(String i,int j,String[] k){ System.out.println(i); System.out.println(j); for(int m=0;m< k.length;m++){ System.out.println(k[m]); } }}
转载地址:http://barm.baihongyu.com/