main()
由于Java虚拟机需要调用类的main()方法,所以该方法的访问权限必须是public,又因为Java虚拟机在执行main()方法时不必创建对象,而是通过当前main()方法所在类名调用,所以该方法必须是static的,该方法接收一个String类型的数组参数,该数组中保存执行Java命令时传递给所运行的类的参数。
又因为main() 方法是静态的,我们不能直接访问该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象去访问类中的非静态成员。例如:需要先创建实例对象,再去访问类内的非静态方法。
jvm调用某个类的main()方法时,会首先先加载当前类(先父类,后子类)。因为调用静态方法会触发类加载。
注:一个类文件中可以有多个类/接口,但是只能有一个类声明为public,且声明为public的类必须与文件名同名。
JavaBean
JavaBean是一种Java语言写成的可重用组件。符合如下标准的Java类:
类是公共的;
有一个无参的公共的构造器;我通常也会定义一个带参构造器,方便测试。
有属性,且有对应的get、set方法,方便框架利用getter setter方法注入以及获取属性。属性一般定义为private。
对象类型转换 (Casting )
基本数据类型的Casting:
自动类型转换:小的数据类型可以自动转换成大的数据类型
强制类型转换:可以把大的数据类型强制转换(casting)成小的数据类型
如 float f=(float)12.0; int a=(int)1200L
对Java对象的强制类型转换称为造型:
从子类到父类的类型转换可以自动进行
从父类到子类的类型转换必须通过造型(强制类型转换)实现;在造型前可以使用instanceof操作符测试一个对象的类型。
Object类
java.lang.Object类是所有Java类的根父类。
所有类都继承了Object,也就获得了equals()方法。
如果一个类的equals()未被重写,只能比较引用类型,其作用与“==”相同,比较是否指向同一个对象。
特例:当用equals()进行比较时,对类File、String、Date及包装类(Wrapper Class)来说,是比较类型及内容而不考虑引用的是否是同一个对象。
重写equals()方法的原则:
正确性、对称性、传递性、自反性、一致性
==操作符:
对于基本数据类型比较值:只要两个变量的值相等,即为true。(15 == 15.0;
//true 'A' == 65
//true)
重写一个对象的equals方法:
@Override
public boolean equals(Object o){
if (this == o) return true;
if (!(o instanceof Boy)) return false;
Boy boy = (Boy)o;
return this.age == boy.age &&
Objects.equals(this.name,boy.name);
}
Objects是一个工具类,可以计算hashcode等
在进行String与其它类型数据的连接操作时(“aaa” + obj),自动调用其他数据类型的toString()方法。
特殊:
char[] arr = new char[] { 'a', 'b', 'c' };
System.out.println(arr);//abc
包装类
基本数据类型包装成包装类的实例 —装箱
获得包装类对象中包装的基本类型变量 —拆箱
支持自动装箱,自动拆箱。但类型必须匹配。
包装类在实际开发中用的最多的在于字符串变为基本数据类型。
//三元运算符这里做了一个类型提升,并且包装类重写了toString方法,由于多态性,调用的是子类对象的toString方法。
Object o1 = true ? new Integer(1) : new Double(2.0);
System.out.println(o1);//1.0
Object o2;
if (true)
o2 = new Integer(1);
else
o2 = new Double(2.0);
System.out.println(o2);//1
解释一下包装类的缓存技术:
Java 基本类型的包装类的大部分都实现了常量池技术,在常量池中缓存一些数值。
如果以字面量的形式创建的包装类对象(Integer i = 30 自动装箱)在这些数值范围内,就无需再堆中创建新的对象,直接返回常量池的引用即可。
如果超出对应范围仍然会去创建新的对象,缓存的范围区间的大小只是在性能和资源之间的权衡。
但是,如果以new方式创建的包装类对象,无论在不在缓存区,都会在堆中分配内存。
Byte,Short,Integer,Long 这 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据,
Character 创建了数值在 [0,127] 范围的缓存数据,
Boolean 直接返回 True Or False。
两种浮点数类型的包装类 Float,Double 并没有实现常量池技术。
//字面量定义包装类对象,在缓存区范围内
Integer m = 1;
Integer n = 1;
System.out.println(m == n);//true
//超出常量池中缓存区范围
Integer x = 128;
Integer y = 128;
System.out.println(x == y);//false
Integer i = new Integer(1);
Integer j = new Integer(1);
System.out.println(i == j);//false