第五章:
1.面向对象的特征
(1):封装性
(2):多态
(3):继承
Java多态分为:方法重载和对象多态两种
这里说下对象多态:子类对象可以和父类对象互转
2.对象的创建
例如: Person p=new Person()
类是一种引用的数据类型,所以在穿件也需要分配内存空间,类名称存在栈内存中,是对象存在堆内存中
3.封装
记住对象中的所有属性都必须封装,就是(private),通过getter,setter来访问
4.构造方法
在创建对象的时候,你会看见new Person(),这个Person()是一个方法,这个方法就是构造方法,构造方法的作用就是用来初始化数据。在创建对象的时候,如果类中没有构造方法,系统会自动分配一个默认的不带参数构造方法。
5.匿名对象
匿名对象就是没有明确的给出名字的对象,new Person()就是一个匿名对象。匿名对象只在堆内存中分配内存来存储对象,而不在栈内存中开辟空间来装对象的引用。一般匿名类值使用一次。
6.String(这个非常重要,非常频繁的用到,要百分百的掌握)
(1).String类用equals来比较两个对象是否值相等(如果用==就必须保证地址也一致才OK)
(2).String类两种实例化
a. String s="abc";
b. String s=new String("abc");
这两种实例化有什么不同?
在弄清楚这个之前一定要弄清楚一点,就是一个字符串就是一个String类的匿名对象。
@Test
public void test(){
//验证一个字符串就是一个匿名对象
System.out.println("hello".equals("hello"));
}
结果:
true
实际上String s="abc",就是把一个已经在堆内存中开辟好的辅助给一个名称而已,这样做的目的:看代码
public void test1(){
//验证一个字符串就是一个匿名对象
String s="abc";
String f="abc";
System.out.println("是否相等"+(s.equals(f)));
System.out.println("是否相等"+(s==f));
}
结果:
是否相等true
是否相等true
这说明,一个堆内存存在的对象,即使被赋值给多个名称,但是地址,值不变。。。
补充一下:
对于以上String类的操作,在java中成为共享设计,这种设计思路就是,在java中形成一个对象池,在这个对象池中保存多个对象,新实例化一个对象,如果在对象池中已经开辟了空间,则不再新开辟,而是直接取出使用,String类就是采用这样的设计
看看下面的代码:
public void test2(){
String s=new String("abc");
String f=new String("abc");
System.out.println("是否相等"+(s.equals(f)));
System.out.println("是否相等"+(s==f));
}
结果:
是否相等true
是否相等false
(3)字符串类容的不可改变性
其实理解这个看下代码就很容易理解了
public void test3(){
String a="abc";
String b="abc";
a=a+b;
System.out.println(a);
}
结果:
abcabc
看到结果你是不是想说,这不是改变了吗,但是你想想一个字符串就是一个匿名对象,输出的a是abcabc,那说明在堆中就有一个abcabc的索引(或者就是有这个的空间,而刚开始创建的a="abc",并没有改变)
(4)String 类常用的方法
下面就是对这些常用方法使用的代码:
public void test4(){
//字符串和数组的互转
String s="hello";
char c[]=s.toCharArray();//将字符串变为字符数组
for(char i :c){
System.out.print(i+"\t");
}
System.out.println("");
String a=new String(c);//将全部的字符数组变为String
String st=new String(c,0,4);//将部分的字符数组变为字符串
System.out.println(a);
System.out.println(st);
}
结果:
h e l l o
hello
hell
public void test5(){
//取出指定位置的字符串
String s="abcde";
System.out.println(s.charAt(2));//取出第3个字符,这里是根据索引来取得,索引是从0开始
}
结果:
c
public void test6(){
//字符串与byte数组间的互相转换
String s="abcde";
byte a[]=s.getBytes();//将字符串变为byte数组
System.out.println(new String(a));//将byte数组转为字符串
System.out.println(new String(a,0,3));//将byte数组转为字符串
}
结果:
abcde
abc
补充:写个数组与byte的转换,是因为后期再IO流中经常会使用到
public void test7(){
String s="abcde";
System.out.println(s.length());//取一个字符串的长度
char a[]=s.toCharArray();
System.out.println(a.length);//取一个数组的长度
}
结果:
5
5
补充:看看取得数组的长度的方法和字符串长度的方法用说明不同?
字符串取长度的length()是有括号的
public void test8(){
String s="abcde";
System.out.println(s.indexOf("a"));//查找一个指定的字符串是否存在
System.out.println(s.indexOf("ac"));
}
结果:
0
-1
补充:如果存在就返回索引值,不存在就返回-1
public void test9(){
String s=" abcde ";
System.out.println(s.trim());//去掉左右空格
String a="abc dd dd dd";
System.out.println(a.trim());
}
结果:
abcde
abc dd dd dd
补充:是去掉左右空格,不会去掉中间的空格
public void test10(){
String s="abcde";
System.out.println(s.substring(1));//字符串的截取,冲索引值为1的地方开始到末尾
System.out.println(s.substring(1, 3));//索引1开始,3结束
}
结果:
bcde
bc
public void test11(){
String s="ab cde";
String a[]=s.split(" ");//按指定的方式拆分,这里是按空格的方式(拆分必须是字符串正有的)
for(int i=0;i<a.length;i++){
System.out.println(a[i]);
}
for(String b:a){
System.out.println(b);
}
}
结果:
ab
cde
ab
cde
public void test12(){
String s="abcde";
String a="ABCDE";
System.out.println(s.toUpperCase());//转大写
System.out.println(a.toLowerCase());//转小写
}
结果:
ABCDE
abcde
public void test13(){
String s="abcde";
System.out.println(s.startsWith("abc"));//判断是否已什么开头
System.out.println(s.endsWith("de"));//判断是否以什么结尾
}
结果:
true
true
public void test14(){
String s="abcde";
String a="ABCDE";
System.out.println(s.equalsIgnoreCase(a));//不区分大小写比较
}
结果:
true
public void test15(){
String s="aaade";
System.out.println(s.replaceAll("a", "m"));//替换
System.out.println(s.replace("a", "d"));
}
1.面向对象的特征
(1):封装性
(2):多态
(3):继承
Java多态分为:方法重载和对象多态两种
这里说下对象多态:子类对象可以和父类对象互转
2.对象的创建
例如: Person p=new Person()
类是一种引用的数据类型,所以在穿件也需要分配内存空间,类名称存在栈内存中,是对象存在堆内存中
3.封装
记住对象中的所有属性都必须封装,就是(private),通过getter,setter来访问
4.构造方法
在创建对象的时候,你会看见new Person(),这个Person()是一个方法,这个方法就是构造方法,构造方法的作用就是用来初始化数据。在创建对象的时候,如果类中没有构造方法,系统会自动分配一个默认的不带参数构造方法。
5.匿名对象
匿名对象就是没有明确的给出名字的对象,new Person()就是一个匿名对象。匿名对象只在堆内存中分配内存来存储对象,而不在栈内存中开辟空间来装对象的引用。一般匿名类值使用一次。
6.String(这个非常重要,非常频繁的用到,要百分百的掌握)
(1).String类用equals来比较两个对象是否值相等(如果用==就必须保证地址也一致才OK)
(2).String类两种实例化
a. String s="abc";
b. String s=new String("abc");
这两种实例化有什么不同?
在弄清楚这个之前一定要弄清楚一点,就是一个字符串就是一个String类的匿名对象。
@Test
public void test(){
//验证一个字符串就是一个匿名对象
System.out.println("hello".equals("hello"));
}
结果:
true
实际上String s="abc",就是把一个已经在堆内存中开辟好的辅助给一个名称而已,这样做的目的:看代码
public void test1(){
//验证一个字符串就是一个匿名对象
String s="abc";
String f="abc";
System.out.println("是否相等"+(s.equals(f)));
System.out.println("是否相等"+(s==f));
}
结果:
是否相等true
是否相等true
这说明,一个堆内存存在的对象,即使被赋值给多个名称,但是地址,值不变。。。
补充一下:
对于以上String类的操作,在java中成为共享设计,这种设计思路就是,在java中形成一个对象池,在这个对象池中保存多个对象,新实例化一个对象,如果在对象池中已经开辟了空间,则不再新开辟,而是直接取出使用,String类就是采用这样的设计
看看下面的代码:
public void test2(){
String s=new String("abc");
String f=new String("abc");
System.out.println("是否相等"+(s.equals(f)));
System.out.println("是否相等"+(s==f));
}
结果:
是否相等true
是否相等false
(3)字符串类容的不可改变性
其实理解这个看下代码就很容易理解了
public void test3(){
String a="abc";
String b="abc";
a=a+b;
System.out.println(a);
}
结果:
abcabc
看到结果你是不是想说,这不是改变了吗,但是你想想一个字符串就是一个匿名对象,输出的a是abcabc,那说明在堆中就有一个abcabc的索引(或者就是有这个的空间,而刚开始创建的a="abc",并没有改变)
(4)String 类常用的方法
下面就是对这些常用方法使用的代码:
public void test4(){
//字符串和数组的互转
String s="hello";
char c[]=s.toCharArray();//将字符串变为字符数组
for(char i :c){
System.out.print(i+"\t");
}
System.out.println("");
String a=new String(c);//将全部的字符数组变为String
String st=new String(c,0,4);//将部分的字符数组变为字符串
System.out.println(a);
System.out.println(st);
}
结果:
h e l l o
hello
hell
public void test5(){
//取出指定位置的字符串
String s="abcde";
System.out.println(s.charAt(2));//取出第3个字符,这里是根据索引来取得,索引是从0开始
}
结果:
c
public void test6(){
//字符串与byte数组间的互相转换
String s="abcde";
byte a[]=s.getBytes();//将字符串变为byte数组
System.out.println(new String(a));//将byte数组转为字符串
System.out.println(new String(a,0,3));//将byte数组转为字符串
}
结果:
abcde
abc
补充:写个数组与byte的转换,是因为后期再IO流中经常会使用到
public void test7(){
String s="abcde";
System.out.println(s.length());//取一个字符串的长度
char a[]=s.toCharArray();
System.out.println(a.length);//取一个数组的长度
}
结果:
5
5
补充:看看取得数组的长度的方法和字符串长度的方法用说明不同?
字符串取长度的length()是有括号的
public void test8(){
String s="abcde";
System.out.println(s.indexOf("a"));//查找一个指定的字符串是否存在
System.out.println(s.indexOf("ac"));
}
结果:
0
-1
补充:如果存在就返回索引值,不存在就返回-1
public void test9(){
String s=" abcde ";
System.out.println(s.trim());//去掉左右空格
String a="abc dd dd dd";
System.out.println(a.trim());
}
结果:
abcde
abc dd dd dd
补充:是去掉左右空格,不会去掉中间的空格
public void test10(){
String s="abcde";
System.out.println(s.substring(1));//字符串的截取,冲索引值为1的地方开始到末尾
System.out.println(s.substring(1, 3));//索引1开始,3结束
}
结果:
bcde
bc
public void test11(){
String s="ab cde";
String a[]=s.split(" ");//按指定的方式拆分,这里是按空格的方式(拆分必须是字符串正有的)
for(int i=0;i<a.length;i++){
System.out.println(a[i]);
}
for(String b:a){
System.out.println(b);
}
}
结果:
ab
cde
ab
cde
public void test12(){
String s="abcde";
String a="ABCDE";
System.out.println(s.toUpperCase());//转大写
System.out.println(a.toLowerCase());//转小写
}
结果:
ABCDE
abcde
public void test13(){
String s="abcde";
System.out.println(s.startsWith("abc"));//判断是否已什么开头
System.out.println(s.endsWith("de"));//判断是否以什么结尾
}
结果:
true
true
public void test14(){
String s="abcde";
String a="ABCDE";
System.out.println(s.equalsIgnoreCase(a));//不区分大小写比较
}
结果:
true
public void test15(){
String s="aaade";
System.out.println(s.replaceAll("a", "m"));//替换
System.out.println(s.replace("a", "d"));
}