抽象方法
抽象方法是使用abstract修饰的方法。将一个方法声明为抽象方法,从而要求子类必须重写该方法。
注意:
1.抽象方法没有方法实现,即没有方法体{},只有定义。
2.类中如果有抽象方法,该类必须是抽象类,必须使用abstract
3.对于抽象方法,abstract不能与private、static同时使用。为父类添加抽象方法,然后让子类实现,一个主要目的就是实现多态的效果,而实现多态效果需要两个前提:一是子类重写父类中的方法,二是使用父类引用调用子类重写后的方法,根据父类实际指向的对象调用相应的重写方法。如果将抽象方法声明为private,则子类中就无法重写该抽象方法;如果方法为static方法,则该方法属于类,而不属于某个对象,从而也就无法根据实际的指向的对象调用想用的方法。
抽象类
类定义中使用abstract修饰的类为抽象类。
注意:
1.从语法上讲,抽象类中可以没有抽象方法,但是没有实际意义
2.有抽象方法的类必须是抽象类
3.不能创建抽象类的对象,即不能new对象
4.抽象类可以当做一种引用类型来使用,声明变量
5.继承自抽象类的类,必需重写抽象类中的所有抽象方法,否则自身也使用abstract修饰,即也是抽象类。
抽象类的子类,会继承抽象类中的所有抽象方法,子类要么重写所有的抽象方法。如果有一个抽象方法的没有重写的话,子类中也有抽象方法。
说明:
抽象类只定义被其所有子类共享的一般形式,而让每个子类填充其细节。这种类确定了子类必需实现的方法。
注意:
有抽象方法的一定是抽象类。错误,因为接口中的也有抽象方法,而且接口中的所有方法都是抽象方法。
第十一章:常用类
包装类
一方面出于性能方面的考虑,java为数值使用基本类型,而不是对象。基本类型不是对象层次的组成部分,它们不继承Object。
另一方面有时需要创建表示基本类型的对象,例如集合类只处理对象。为了在类中存储基本类型,需要将基本类型包装到一个类中,为此Java为8种基本数据类型分别提供了对应的包装类。本质上这些类将基本类型包装到一个类中,因此通常将它们称为类型包装器。包装器类位于Java.lang包中。
八个包装类
Byte Short Integer Long Float Double Character Boolean
Character包装器
Character是char类型的包装器。Character的构造函数为:
Character(char ch)
其中,ch指定了将由即将创建的Character对象包装的字符。
为了获取Character对象中的char数值,可以调用charValue(),如下所示:
char charValue( )
该方法返回封装的字符。
Boolean包装器
Boolean是包装boolean值的包装器。它定义了以下构造函数:
Boolean(boolean boolValue) Boolean(String boolString)
在第一个版本中,boolValue必须是true或false。在第二个版本中,如果boolString包含字符串“true”(大写或小写形式都可以),则新的Boolean对象将为真,否则,将为假。
为了从Boolean对象获取boolean值,可以使用booleanValue(),如下所示:
boolean booleanValue( )
该方法返回与调用对象等价的boolean型值。
数值类型的包装器类
1、构造器
所有数值类型包装器都定义了用于从给定数值或数值的字符串表示形式构造对象的构造函数,例如,下面是为Integer定义的构造器:
Integer(int num) Integer(String str)//a123 “123”
如果str没有包含有效的数字值,则会抛出NumberFormatException异常。
2、从包装器对象中提取数值
最常用类型的包装器是那些表示数值的包装器。包括Byte、Short、Integer、Long、Float以及Double。所有这些数值类型包装器都继承自抽象类Number。Number声明了以不同数字格式从对象返回数值的方法,如下所示:
byte byteValue( ) double doubleValue( ) float floatValue( ) int intValue( ) long longValue( ) short shortValue( )
3、将包装器对象转换成字符串
类型包装器都重写了toString()方法,该方法可以将数值转换成字符串形式。
String str = Integer.toString(100);
自动装箱与自动拆箱
自动装箱是这样一个过程,只要需要基本类型的对象,就自动将基本类型自动封装(装箱)进与之等价的类型包装器中,而不需要明确地构造对象。自动拆箱是当需要时自动抽取(拆箱)已装箱对象数值的过程。不需要调用intValue()或doubleValue()这类方法。
自动装箱和自动拆箱特性极大地简化了一些算法的编码,移除了单调乏味的手动装箱和拆箱数值操作。它们还有助于防止错误。此外,它们对于泛型非常重要,因为泛型只能操作对象。最后,集合框架需要利用自动装箱特性进行工作。
数值与字符串形式之间的转换
最常见的编程杂务之一是将数值的字符串表示形式转换成数值。数值类型的包装器类为此提供了相应的方法。例如:
(1)Int类的parseInt()方法
(2)Long类的parseLong()方法
(3)Double类的parseDouble()方法
为了将数值转换成字符串形式,可以调用相应包装类的toString()方法。
String.valueOf() Int.toString(); Double.toString(); int I = 100; String str = I + “”;
字符分类
Character类提供一些静态方法用于判断字符属于哪一类。
static boolean isDigit(char ch) | 如果ch是数字,则返回true。 |
---|---|
static boolean isLetter(char ch) | 如果ch为字母,则返回true。 |
static boolean isLetterOrDigit(char eh) | 如果ch为字母或数字,则返回true。 |
static boolean isLowerCase(char ch) | 如果ch为小写字母,则返回true; |
static boolean isUpperCase(char ch) | 如果ch为大写字母,则返回true。 |
static boolean isSpaceChar(char ch) | 如果ch为空格字符,则返回true。 |
static boolean isWhitespace(char ch) | 如果ch为空白字符,则返回true。 |
包装器类中其他常用的常量和方法
Integer.MAX_VALUE//***\*表示int数据类型的最大取值数:2 147 483 647\**** Integer.MIN_VALUE//***\*表示int数据类型的最小取值数:-2 147 483 648\**** Integer.SIZE //长度,多少bit Integer.valueOf(100); //根据整数创建Integer对象 Integer. valueOf("100"); //根据字符串创建Integer对象
String
String类介绍
(1)创建的每个字符串实际上都是String类的对象。即使是字符串字面值实际上也是String对象。
(2)String类型的对象是不可变的;一旦创建了一个String对象,其内容就不能再改变。即,一旦创建了一个String对象,就不能改变该字符串包含的字符。
所谓Stirng类型对象中的字符串是不可改变的,是指创建了String实例后不能修改String实例的内容。但是可以修改String引用变量,使其指向其他String对象。
当每次需要已存在字符串的修改版本时,会创建包含修改后内容的新String对象。原始字符串仍然没有改变。使用这种方法的原因是,实现固定的、不能修改的字符串与实现能够修改的字符串相比效率更高。
(3)对于那些需要能够修改的字符串的情况,Java提供了两个选择:StringBuffer和StringBuilder。这两个类都包含在创建之后可以进行修改的字符串。
(4)String、StringBuffer和StringBuilder类都是在java.lang包中定义的。这三个类都实现了CharSequence接口。
String类的构造方法
-
String(); //创建不包含内容的字符串对象
-
String(char[ ] chars)
-
String(char[ ] chars, int startIndex, int numChars)
-
String(String strObj)
-
还可以直接使用字符串字面创建String对象:String str = “abc”;
注意:没有使用单位字符作为参数的构造器。
//String(char c);
说明:
因为会为字符串字面值创建String对象,所以在能够使用String对象的任何地方都可以使用字符串字面值。
System.out.println("abc".length());
字符串比较
字符串相等性比较
String类重写了equals()方法,重写后的方法比较两个字符串对象的内容是否相同。
运算符“==”比较两个String引用是否指向同一个String对象。
示例:StringCompareDemo
其他比较方法
-
boolean equalsIgnoreCase(String str)
将此String与另一个String比较,不考虑大小写。
将此 String 与另一个 String 比较,不考虑大小写。如果两个字符串的长度相同,并且其中的相应字符都相等(忽略大小写),则认为这两个字符串是相等的。
-
boolean endsWith(String suffix)
测试此字符串是否以指定的后缀结束。
-
boolean startsWith(String prefix)
测试此字符串是否以指定的前缀开始。
-
int compareTo(String str)
按照字典顺序比较两个字符串。
其中,str是将要与调用String对象进行比较的String对象。返回的比较结果及其解释如下所示:
值 | 含 义 |
---|---|
小于0 | 调用字符串小于str。 |
大于0 | 调用字符串大于str。 |
0 | 两个字符串相等。 |
-
int compareToIgnoreCase(String str)
按字典顺序比较两个字符串,不考虑大小写。
字符串连接
String str1 = “abc” ; String str2 = “def”; String str3 = “hij”; String str1 = str1 + str2;
String类型的引用,指向的字符串对象是不能修改的。
String表示不可变的字符串,只要创建了字符串对象,那么这个对象的内容就不能再改变。
字符串查找
案例:StringSearchDemo
1.boolean contains(CharSequence s)
当且仅当此字符串包含指定的char值序列时,返回true。
CharSequence 表示字符串序列,是String的父类
2.int indexOf(int ch)和int indexOf(String str)
返回指定字符/子串第一次出现处的索引。
3.int lastIndexOf(int ch)和int lastIndexOf(String str)
返回指定字符/子串最后一次出现处的索引。
说明:
(1)当没有字符/子串没有出现时,返回值为-1。可以使用该方法判断字符/子串是否存在。
(2)可以使用下面这些重载形式指定查找的开始位置:
int indexOf(int ch, int startIndex) int lastIndexOf(int ch, int startIndex) int indexOf(String str, int startIndex) int lastIndexOf(String str, int startIndex)
字符串修改
1.String concat(String str)
将指定字符串连接到此字符串的结尾,concat()与“+”执行相同的功能。
2.String replace(char oldChar, char newChar)
返回一个新的字符串,它是通过用newChar替换此字符串中出现的所有oldChar得到的。
3.String toLowerCase()
使用默认语言环境的规则将此String中的所有字符都转换为小写。
4.String toUpperCase()
使用默认语言环境的规则将此String中的所有字符都转换为大写。
5.String trim( )
返回字符串的副本,删除前导空白和尾部空白。
提取字符与子串
1.char charAt(int index)
返回指定索引处的char值。
2.char[ ] toCharArray()
将此字符串转换为一个新的字符数组。
3.String substring(int beginIndex)
返回一个新的字符串,它是此字符串的一个子字符串。该子字符串始于指定索引处的字符,一直到此字符串末尾。
4.String substring(int beginIndex, int endIndex)
返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的beginIndex处开始,一直到索引endIndex-1处的字符。
其他字符串常用方法
1.int length()
返回此字符串的长度
注意:数组的长度为数组对象.length 属性
2.String[] split(String regex)
根据给定正则表达式的匹配拆分此字符串。最简单的使用方法是为参数regex
3.static String valueOf( int i)
将数据从内部格式转换成人类可读的形式。它是一个静态方法。
StringBuffer和StringBuilder
StringBuffer与StringBuilder类介绍
StringBuffer是String的对等类,提供了许多字符串功能。您可能知道,String表示长度固定、不可修改的字符序列。与之相对应,StringBuffer表示可增长、可写入的字符序列。StringBuffer允许在中间插入字符和子串,或在末尾追加字符和子串。StringBuffer能够自动增长,从而为这类添加操作准备空间,并且通常预先分配比实际所需更多的字符空间,以允许空间增长。
StringBuilder类是由JDK 5引入的,以增加Java的字符串处理能力,提供与StringBuffer相同的功能。
StringBuffer与StringBuilder的区别:
-
StringBuffer类是线程安全的,而StringBuilder则不是,即不保证其对象的同步性,在多线程环境中是不安全的。
-
StringBuilder在性能上要比StirngBuffer好一些。
StringBuffer类的构造方法
StringBuffer( ) //默认预留16个字符的空间
StringBuffer(int size) //size指定预留的字符空间
StringBuffer(String str) //额外预留16个字符的空间 abc+16
StringBuffer(CharSequence chars) //额外预留16个字符的空间
提示:
再次分配内存空间是很耗时的操作。此外,频繁分配空间会产生内存碎片。
StringBuffer类的常用方法
1.append ()
append()方法将各种其他类型数据的字符串表示形式连接到调用StringBuffer对象的末尾。该方法有多个重载版本,下面是其中的几个:
StringBuffer append(String str)
StringBuffer append(int num)
StringBuffer append(Object obj)
2.insert ()
在指定位置插入参数提供的内容,返回修改后的该StringBuffer对象引用。该方法有多个重载版本,下面是其中的几个:
StringBuffer insert(int index, String str)
StringBuffer insert(int index, char ch)
StringBuffer insert(int index, Object obj)
3.StringBuffer delete (int start,int end) 10 包含5 不包含10
删除从start开始到end-1为止的一段字符序列,返回修改后的该StringBuffer对象引用。
4.StringBuffer deleteCharAt(int index) 8
移除指定位置的字符,返回修改后的该StringBuffer对象引用。
5.StringBuffer reverse()
将字符序列逆序,返回修改后的该StringBuffer对象引用。
6.StringBuffer setCharAt( (int index,char ch) 5 a
将指定索引处的字符设置为 ch,返回修改后的该StringBuffer对象引用。
public static void main(String[] args){ StringBuffer sb = new StringBuffer(); sb += “I”; sb.append(“am”); sb.append(true); System.out.println(sb); }
几点说明
(1)StringBuffer对象不能使用 += 赋值
(2)注意使用StringBuffer的append()方法连接字符串与使用“+”运算符直接连接String对象的区别。
长度与容量的概念
长度是指StringBuffer中实际保存的字符的个数,容量是指已经分配的空间大小。
1.int length()
获取StringBuffer对象的当前长度
2.void setLength(int len) 50 20 6 50 10
设置StringBuffer对象中字符串的长度。当增加字符串的大小时,会向末尾添加空字符。如果调用setLength()时使用的值小于length()返回的当前值,则超出新长度的字符将丢失。
3.int capacity( )
获取StringBuffer对象的当前容量
4.void ensureCapacity(int minCapacity)
设置缓存的大小。minCapacity指定了缓存的最小尺寸。(出于效率考虑,可能会分配比minCapacity更大的缓存。)
扩容后的数组长度为字节数组定长*2 +2 ,扩容不够时直接扩容 到最大(指定大小)。