对象类型转换(Casting)
- 基本数据类型的Casting:
- 自动类型转换:小的数据类型可以自动转换成大的数据类型。eg:long g=20; double d=12.0f
- 强制类型转换: 可以把大的数据类型强制转换(casting)成小的数据类型。eg:float f=(float) 12.0 int a=(int) 12000L
- 对Java对象的强制类型转化内称为造型
- 从子类到父类的类型转换可以自动进行
- 从父类到子类的类型转换必须通过造型(强制类型转换)实现
- 无继承关系的引用类型间的转换是非法的
举例:
Person.java
Student.java
Cast.java
总结:
操作符与equals方法
-
==:
- 基本类型比较值:只要两个变量的值相等,即为true int a=5;if(a==6){……}
- 引用类型比较引用(是否指向同一个对象):只有指向同一个对象时,== 才返回true。
Person p1=new Person(); Person p2=new Person(); if(p1==p2){……} //false Person p2=p1;true
- 用“==”进行比较时,符号两边的数据类型必须兼容(可自动转换的基本数据类型除外),否则编译出错
-
equals():所有类都继承了Object,也就获得了equals()方法。还可以重写
- 只能比较引用类型,其作用与“==”相同,比较是否指向同一个对象。
- 格式:obj1.equals(obj2)
Person p1=new Person();
Perosn p2=new Person();
System.ou.println(p1==p2); //false
System.ou.println(p1.equals(p2)); //false
- 特例:当用equals()方法进行比较时,对类File,String,Date及包装类(Wrapper Class)来说,是比较类型及内容而不考虑引用的是否是同一个对象:
- 原因:在这些类中重写了Object类的equals()方法。
String s1=new String("abc");
String s2=new String("abc");
System.out.println(s1==s2); //false
System.out.println(s1.equals(s2)); //ture
//对于对象来说,特殊的类,如String,File,Date,
//使用==比较的是对象(对象的地址)
//equals比较的是内容,
//除了特殊的类之外的其他普通的类的对象==和equals比较的都是对象(对象的内存地址)
//如果你想改变某一个类的equals,不想用equals来比较对象的内存地址,就需要重写equals()方法
String 对象的创建
练习6
1.
2.
3.编写Order类,有int的orderId,String类型的orderName,相应的getter()和setter()方法,两个参数的构造器,重写父类的equals()方法:public boolean equals(Object obj),并判断测试类中创建的两个对象是否相等.
Order.java
Test.java
4.请根据以下代码自行定义能满足需要的MyDate类,在MyDate类中覆盖equals方法,使其判断当两个MyDate类型对象的年月日都相同时,结果为true,否则为false. public boolean equals(Object o)
MyDate.java
另一个重写的方式
Test.java
包装类(Wrapper)
- 针对八种基本定义相应的引用类型——包装类(封装类)
- 有了类的特定,就可以调用类中的方法
基本数据类型 | 包装类 |
---|---|
boolean | Boolean |
byte | Byte |
short | Short |
int | Integer |
long | Long |
char | Character |
float | Float |
double | Double |
-
基本数据类型包装成包装类的实例——装箱
- 通过保包装类的构造器实现:
int i=500; Integer t=new Integer(i); - 还可以通过字符串参数构造包装类对象
Float f=new Float(“4.56”);
Long l=new Long(“asdf”);//要是数字,不然会报错,NumberFormateException
- 通过保包装类的构造器实现:
-
获得包装类对象中包装的基本类型变量——拆箱
- 调用包装类的.xxxValue()方法
boolean b=bObj.booleanValue();
- 调用包装类的.xxxValue()方法
-
JDK1.5之后,支持自动装箱,自动拆箱。但类型必须匹配
-
字符串转换成基本数据类型
- 通过包装类的构造器实现:
int i=new Integer(“12”); - 通过包装类的parseXxx(String s)静态方法:
Float f=Float.parseFloat(“12.1”);
- 通过包装类的构造器实现:
-
基本数据类型转换成字符串
- 调用字符串重载的valueOf()方法:
String str=String.valueOf(2.34f); - 更直接的方式:
String intStr=5+"";
- 调用字符串重载的valueOf()方法:
基本数据类型的包装类
- 主要是为了基本数据类型与字符串之间的转换
- 还有就是将基本数据类型变成了类,有了类的特点,可以调用类中的方法
-toString 源自于object类中
重写toString方法后
关键字:static(静态的)
当我们在编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才能供外部调用。我们有时候希望无论是否产生对象或无论产生多少个对象的情况下,某些特定的数据在内存空间中只有一份,例如所有的中国人都有国家名称,每一个中国人都共享这个国家名称,不必在每一个中国人的实例对象中都单独分配有个用于代表国家名称的变量。
类变量,类方法
类属性,类方法的设计思想
- 类属性作为各个对象之间共享的变量。在设计类时,分析那些类属性不因对象的不同而改变,将这些属性设置为类属性。而有些方法不想因为对象的不同而频繁通过new对象方式去调用方法,方法就写成static,相应的方法设置为类方法。
- 如果方法与调用者无关,则这样的方法通常被声明为类方法,由于不需要创建对象就可以调用类方法,从而简化了方法的调用。类方法,也就是静态方法,
- 适用范围i:
- 在java类中,可用static修饰属性,方法,代码块,内部类
- 被修饰的成员具备以下特点:
- 随着类的加载而加载(类加载之后,静态的方法或者变量就能用了,类名.xxx)
- 优先于对象存在(不用new就能用)
- 修饰的成员,被所有对象所共享
- 访问权限允许时,可不创建对象,直接被类调用
单例(Singleton)设计模式
-
设计模式就是在大量的实践总结和理论化之后优选的代码结构,编程风格,以及解决问题的思考方式。设计模式就像是经典的棋谱,不同的棋局,我们用不同的棋谱,免去我们自己再思考和探索。(设计模式,就是在我们实际编程过程中,逐渐总结出来的一些解决问题的套路)
-
单例:只有一个实例(实例化对象)
-
在整个软件系统运行过程中,这个类只被实例化一次,以后不论在哪都只调用这一个实例,例如这个实例化的对象要消耗大量的时间和资源,
-
所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必须将类的构造方法的访问权限设置为private,这样,就不能用new操作符在类的外部产生类的对象了,但在类内部仍可以产生该类的对象。因此在类的外部开始还无法得到类的对象,只能调用该类的某个静态方法以返回类内部创建的对象,静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象的变量也必须定义成静态的。
-
使用单例模式解决什么样的问题?一般都是new对象太费劲,或者频繁的new新的对象没有必要
饿汉式
懒汉式
-
单例模式:软件的运行有且仅有一个实例化对象(只会new一次)。
-
懒汉式与饿汉式的区别就在于什么时候new这个对象
- 懒汉式在第一个有人调用getInstance方法时,来new对象,以后再有人调用getInstance()方法就返回第一次new好的对象。
- 饿汉式在类加载之后,还没有人调用的时候就先new好一个对象,以后不论谁来调用getInstance()方法,都是直接返回之前new好的那个对象。
理解main方法的语法
TestMain.java