本帖最后由 流氓 于 2012-8-23 23:07 编辑
多态的表现形式:方法的重载、方法的覆盖(重写)、对象转型(父类引用指向子类对象)、接口回调(接口应用指向实现接口类对象) - 方法覆盖:类继承的过程中,子类方法跟父类方法名字相同,并且传递的参数完全一样,称为子类覆盖父类方法,覆盖父类方法通常是为了对其进行修改,并添加新的功能,当一个被覆盖方法通过父类引用被调用时,根据当前被引用对象的类型来决定执行哪个方法
- 在子类覆盖父类某个方法,不能降低方法的访问权限
- 子类不能覆盖父类中声明为final或static的方法
- 可以通过super关键字条用父类中被覆盖的成员
- super使用:通常使用super引用父类成员
- super调用父类构造方法,必须在子类构造方法中的第一条语句使用super调用父类的构造方法:super([参数])
- super调用父类被覆盖的方法:super.方法名([参数])
- super调用父类被隐藏的成员变量:super.变量名
- Object类
- equals()方法: equals()方法用于判断一个对象是否等于另外一个对象,实际上是比较两个引用是否指向同一个对象。在实际编程中,更关心被比较的两个引用所指向的对象的状态(或属性)是否相同。许多Java类都重写了这个方法,如String、Data、基本数据类型的包装类。
- 运算符“= =”用来比较两个运算对象是否相等,这两个运算对象既可以是基本类型,也可以是引用类型。当两个运算对象都是引用类型时,那么这两个引用变量必须都引用同一个对象才返回true
- “= =”用于String对象表示比较的是否是同一个串对象,当用于比较两个字符串是否相等时,应使用equals()方法
- hashCode()方法:散列码(hash code)是由对象导出的一个整型值,主要是将对象作为key,用于Hash表中,通常需要子类对该方法进行重写。常见的String类及基本数据类型的包装类如Integer、Long类等都已对HashCode()和equals()方法进行了重写,保证:若obj1.equals(obj2),则obj1.hashCode()==obj2.hashCode()。其含义是:若对象obj1和对象obj2按对象的状态(或属性或内容)是相等的,则它们的hashCode值应相同。即对象的hashCode值应由对象的状态决定的。例如,两个不同的String对象只要包含相同的字符序列,其hashCode值就相同
- toString()方法: toString()方法返回对象的字符串表示,默认时,其格式为“类名@对象的十六进制哈希码”
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); } - 当Java系统处理对象时,每当需要将对象转成串时,都会自动调用该方法。当定义自己对象时,应该重写该方法,以返回自己对象有明确含义串的表示。许多Java类,如Date、String、StringBuffer和包装类都重写了toString()方法,返回有实际意义的内容
- System.out.println(new Object().toString()); // 显示java.lang.Object@10b30a7
- System.out.println(new Integer(56).toString()); // 显示56
- System.out.println(new String ("hello").toString());
- // 显示hello
- 以上语句等价于:
- System.out.println(new Object());
- // 显示java.lang.Object@10b30a7
- System.out.println(new Integer(56)); // 显示56
- System.out.println(new String("hello")); // 显示hello
- 字符串类
- 一个字符串常量是用双引号括住的一串字符,如"Hello"。一个字符串常量是一个String对象。Java.lang.String类代表只读的不可修改的字符序列,两个字符串对象使用“+”或“+=”运算符,会产生新的字符串对象。若Java程序中有多处出现字符串常量"Hello",则Java编译程序只创建一个String对象,所有的字符串常量"Hello"将使用同一个String对象
- int length():返回字符串的长度
- char charAt(int index):返回指定索引处的char值,其中index的取值范围是0~字符串长度-1
- int compareTo(String another):按Unicode码值的大小逐字符比较两个字符串的大小。如果源串较小,则返回一个小于0的值,如果相等则返回0,否则返回一个大于0的值
- String concat(String str):把字符串str附加在当前字符串的末尾
- equals(Object obj)和equalsIgnoreCase(String str):判断两个字符串对象的内容是否相同。两个方法的区别在于:equals()方法区分字母的大小写,而 equalsIgnoreCase()方法不区分字母的大小写
- int indexOf(int ch): 返回指定字符在此字符串中第一次出现处的索引
- int indexOf(String str): 返回指定子字符串在此字符串中第一次出现处的索引
- int lastIndexOf(int ch): 返回指定字符在此字符串中最后一次出现处的索引
- int lastIndexOf(String str): 返回指定子字符串在此字符串中最右边出现处的索引
- String toUpperCase():将此String 中的所有字符都转换为大写
- String toLowerCase():将此String中的所有字符都转换为大写
- String trim():返回字符串的副本,忽略前导空白和尾部空白
- String substring(int beginIndex):返回一个新的字符串,该子字符串从指定索引处的字符开始,直到此字符串末尾
- String substring(int beginIndex,int endIndex):返回一个新字符串,该子字符串从指定的beginIndex处开始,直到索引endIndex -1处的字符
- static String valueOf():把基本数据类型转换为String类型
- String[] split(String regex):将一个字符串按照指定的分隔符分隔,返回分隔后的字符串数组
- StringBuffer类
- StringBuffer对象表示字符串缓存时,有两个基本概念,一个是容量,另一个是字符串的长度。长度是StringBuffer对象所表示的字符串的长度,容量是StringBuffer对象为存放字符串所拥有的空间大小
- StringBuffe append():向缓冲区内添加新的字符串
- StringBuffe insert(int offset,String str):在字符串的offset位置插入字符串str
- StringBuffer delete(int start,int end):移除此序列的子字符串中的字符,该子字符串从指定的start 处开始,一直到索引end - 1处的字符
- StringBuffer reverse():将字符序列逆序
- String类与StringBuffer类的区别如下:
- 1)String类代表字符串,Java 程序中的所有字符串字面值(如"abc")都作为此类的实例实现,字符串是常量,它们的值在创建之后不能更改,因此,String类的对象都是线程安全的。StringBuffer代表线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,通过某些方法调用可以改变该字符序列的长度和内容。如append()、insert()、delete()、replace()方法等
- String类与StringBuffer类的区别如下:
- 2)String类重写了从Object类所继承的equals()方法,而StringBuffer类没有重写该方法
- 3) String对象之间可以用操作符“+”进行连接,而StringBuffer对象之间不能通过操作符进行连接,但可使用append()方法
- 4) StringBuffer或StringBuilder是不能比较大小的,而String是可以比较大小的。因此可以方便地将StringBuffer转成String再比较大小
- String类与StringBuffer类的区别如下:
- 5)若一个字符串有频繁的插入、删除、修改等操作,则适宜使用StringBuffer(线程安全)或StringBuilder,否则可使用String类进行大小比较、字符串结构分析等。若对一个String对象进行频繁的插入、删除、修改等操作,会产生大量的临时String对象,内存空间消耗较大。因此应按操作需求随时在StringBuffer与String之间互相转换
- 6) String类“+”运算符实际上是由StringBuilder的append()方法来实现的
- 包装类
- Java 既提供了基本数据类型,也提供了相应的包装类。使用基本数据类型,能够满足大多数应用需求,但基本数据类型不具有对象的特性,不能满足特殊需求。Java中的很多类的不少方法的参数类型是Object类型,即,这些方法接受的参数都是对象,而又需要用这些方法处理基本数据类型的数据,这时包装类就很有用了
- 包装类特点
- 1)所有的包装类都是final类型,不能创建它们的子类
- 2)包装类是不可变类,一个包装类的对象创建后,它所包含的基本数据类型就不能被改变。因此,所有包装类的对象都是线程安全的
- 3)从JDK5.0版本开始,提供自动装箱和自动拆箱机制
- Integer oi = 3;// 自动装箱,等价于Integer oi = Integer.valueOf(3);
- int i =oi; // 自动拆箱,等价于int i = oi.intValue();
- int v = oi + 1;// 混合运算,等价于int v = Integer.valueOf(oi.intValue()+1);
- 包装类特点
- 4)将字符串转换为基本值的parseType方法,例如,Integer.parseInt(args[0])
- 5)可生成该对象基本值的typeValue方法( a.intValue() ), Character类和Boolean类直接继承Object类,除此以外,其他包装类都是java.lang.Number的直接子类,因此都继承或者重写了Number类的方法
- 包装类特点
- 6)所有的包装类都可以用和它对应的基本数据类型作为参数,来构造它们的实例
- Boolean b = new Boolean(true); // 或: Boolean b = true;
- Byte bt = new Byte((byte)10); // 或: Byte b = 10;
- Character c = new Character('b'); // 或: Character c = ‘b’;
- Integer i = new Integer(1);// 或: Integer i =1;
- Float f = new Float(3.14f); // 或: Float f = 3.14 f;
- 7)包装类都重写了Object类的toString()方法,以字符串的形式返回包装类对象所表示的基本数据类型
- 包装类特点
- 8)除Character类和Boolean类以外,包装类都有valueOf(String str)静态工厂方法,可以根据String类型的参数来创建包装类对象。参数字符串str不能为null,而且该字符串必须可以解析为相应的基本数据类型包装
- 9)除Character类以外,包装类都有parseType(String str)静态方法,把字符串转换为相应的基本数据类型数据,且该字符串必须是可以解析为相应的基本数据类型的数据
- 日期类Date
- Date类用以毫秒数表示特定的日期和时间。在Java中有两个Date类,一个是java.util.Date,另一个是java.sql.Date类,java.util.Date 是 java.sql.Date 的父类。java.sql.Date有一个valueOf()方法用于将 JDBC日期转义形式的字符串转换成Date值
- DataFormat类:
- Calendar类:
|