引言:
Java提倡的万物皆对象,但是数据类型的划分出现了基本数据类型和引用数据类型,那么我们怎么能把基本数据类型称为对象呢?在java中,除了Integer和Character定义的名称和对应的基本类型差异大,其他六种都是将首字母大写就可以了。
Integer,Byte,Float,Double,Short,Long都是Number类的子类。Character和Boolean都是Object直接子类;这8个类都是final修饰的(不可被继承)。
boolean bool = false;Boolean b2 = new Boolean(bool);Integer i = new Integer(3);int i2 = i.intValue();Boolean b1 = new Boolean("TRue");//trueboolean b2 = b1.booleanValue();Float f = new Float("3.14");//3.14Integer i2 = new Integer("123s");//NumberFormatException
jdk1.5开始出现的特性:
Integer i = 3;//装箱int i2 = i;//拆箱
Object flag = new Boolean(false);if(flag instanceof Boolean){ Boolean b = (Boolean)flag; boolean b2 = b;}
注:包装类可以为null,而基本数据类型不可以为null。
String str = "17";int i = Integer.parseInt(str);//String --> 基本类型String s1 = String.valueOf(i);//基本类型 --> String
基本类型转String,简易方式:int ii = 10;
String iiStr = 10 + "";
定义
classOOXXextendsObject{}
等价于 classooXX{}
常见方法 publicbooleanequals(Objectobj)
:默认实现比较两个对象的地址值是否相同 publicinthashCode()
:取得该对象的Hash码 publicStringtoString()
:对象描述,默认输出 全限定类名+@+十六进制的hashCode值
toString()
方法:
equals()
方法:判断是否指向同一个对象,根据实际需求判定是否重写。publicbooleanequals(Objectobj){}
String类覆写了 Object的equals方法:只比较字符的内容是否相同
equals()
和 ==
的区别equals()
在String来中,是比较两个字符串内容是否相等。==
对于引用类型来说,是比较两个对象的地址值是否相等。
public class EqualsDemo {
public static void main(String[] args) { String s1 = "HelloWorld"; String s4 = new String("HelloWorld");
System.out.println(s1.equals(s4));//true System.out.println(s1 == s4);//false }}
代码块指的是使用"{}"括起来的一段代码,根据代码块存在的位置可以分为4种:
代码块里变量的作用域:只在自己所在区域(前后的{})内有效;
普通代码块就是直接定义在方法或语句中定义的代码块:
public void show(){ 普通代码块}
直接写在类中的代码块:
优先于构造方法执行,每次实例化对象之前都会执行构造代码块。
public class Demo { { System.out.println("我是构造代码块"); } public Demo(){ System.out.println("我是构造方法"); } public static void main(String[] args) { Demo d1 = new Demo(); Demo d2 = new Demo(); }}
/*打印结果:我是构造代码块我是构造方法我是构造代码块我是构造方法
*/
使用static 修饰的构造代码块:
优先于主方法执行,优先于构造代码块执行,不管有创建多少对象,静态代码块只执行一次,可用于给静态变量赋值;
测试各代码块的优先级
/** * * 优先级顺序:静态代码块 > 构造代码块 > 普通代码块 * 备注:无论创建几个对象,静态代码块只执行一次! */
public class Demo13 { Demo13(){ System.out.println("我是构造方法!"); } { System.out.println("我是构造代码块!");//实例化对象的时候才会去调用! } static{ System.out.println("我是静态代码块!"); }
public static void main(String[] args) { new Demo13(); new Demo13();//再次创建对象,证明无论创建几次对象,静态代码块都只执行一次 System.out.println("我是普通代码块!"); }}
输出:我是静态代码块!我是构造代码块!我是构造方法!我是构造代码块!我是构造方法!我是普通代码块!
有的时候我们为了避免外界创建某类的实例,就将某类的构造方法私有化,即将它的构造方法用private修饰;例如昨天谈到的单例模式,就是将构造方法进行私有化
外界如何用到?
我们在来中提供静态的get方法!不提供的话外界就没法创建对象!(对反射无效)
class Stu{ //将构造方法私有化 private Stu(){
}
public static Stu getInstance(){ return new Stu(); }}
public class Demo15 { public static void main(String[] args) { //这里编译报错 Stu s = new Stu(); //我们可以使用getInstance方法获取Stu的对象 Stu s1 = Stu.getInstance(); }}
final class Name {}
class NewName extends Name {//ERROR,报错,因为Name有final修饰}
public class Demo15 { final int COUNT = 10; int index = 0;
public void fun() { //报错 final修饰变量时,初值就是其值,不可以变化,就是常量 COUNT = 200; }
}