java 面向对象二

来源:互联网 发布:成本会计 知乎 编辑:程序博客网 时间:2024/05/16 00:26
基本数据类型的相等判断

基本数据类型使用“==”来进行判断
如:
[java] view plaincopyprint?
  1. int in1 = 22;  
  2. int in2 = 22;  
  3. System.out.println(in1 == int2);//输出true  


String类的相等判断

[java] view plaincopyprint?
  1. String str1 = "Lixing Hua";  
  2. String str2 = new String("Lixing Hua");  
  3. System.out.println(str1 == str2);  //输出false  
  4. System.out.println(Str1.equals(str2));  //输出为true  



解释:使用"=="判断是的变量内存地址空间是否相等。如果判断内容相等,则使用equals()方法。


String类实例化使用直接赋值好还是new String()类好呢?

demo1:
[java] view plaincopyprint?
  1. String str1 = "Hello";  
  2. String str2 = "Hello";  
  3. String str3 = str2;  
  4.   
  5. System.out.println(str1 == str2); //输出true  
  6. System.out.println(str2 == str3); //输出true  
  7. System.out.println(str1 == str3); //输出true  



解释:表明直接赋值的方式以上三个变量的堆内存地址相同,即使用直接赋值的方式节省内存。
使用直接赋值的方式只需要一个实例化对象即可同,而使用new String()的方式则意味着要开辟两个内存对象,开发中最好使用直接赋值的方式完成。

字符串内容不可变

[java] view plaincopyprint?
  1. String str1 = "Hello";  
  2. str1 = str1 + "World";  
  3. System.out.println(str1);  //输出Hello World  



虽然输出的值变化了,但实际上字符串内容没有改变,而改变的是内存地址的引用关系。所以实际开发中应该避免使用以下操作:

[java] view plaincopyprint?
  1. String str1 = "Lixing Hua";  
  2. for(int i=0;i<100;i++){  
  3. str1+=i;  
  4. }  
  5. System.out.println(str1);  



String类的常用方法:
一门语言除其本身优秀外,还要有比较全面的文档。String类中提供了大量的操作方法。

Split()和replaceAll()需正则支持:

1.length():求字符串的长度
int len = str1.length();
System.out.println("字符串的长度:"+len);
运行结果:

字符串的长度:4


2.charAt(int index):取字符串中指定下标的一个元素
for (int i=0;i<len;i++){
char c =str1.charAt(i);
System.out.println("下标"+i+"的值:"+c);
}
运行结果:
下标0的值:a
下标1的值:b
下标2的值:c

下标3的值:d


3. codePointAt(int index):index 处字符的代码点值
for (int i=0;i<len;i++){
int k = str1.codePointAt(i);
System.out.println("下标"+i+"的值:"+k);
}
运行结果:
下标0的值:97
下标1的值:98
下标2的值:99

下标3的值:100


4. codePointBefore(int index):给定索引前面的 Unicode 代码点
int k = str1.codePointBefore(0);
System.out.println("下标"+0+"之前的值:"+k);
java.lang.StringIndexOutOfBoundsException
int k = str1.codePointBefore(1);
System.out.println("下标"+1+"之前的值:"+k);
运行结果:
下标1之前的值:97
int k = str1.codePointBefore(2);
System.out.println("下标"+2+"之前的值:"+k);
运行结果:
下标2之前的值:98
int k = str1.codePointBefore(3);
System.out.println("下标"+3+"之前的值:"+k);
运行结果:
下标3之前的值:99
int k = str1.codePointBefore(len);
System.out.println("下标"+len+"之前的值:"+k);
运行结果:

下标4之前的值:100


5. codePointCount(int beginIndex, int endIndex): 返回此 String 的指定文本范围中的 Unicode 代码点数
int k = str1.codePointCount(0, len);
System.out.println("0到"+len+"之前的值:"+k);
运行结果:
0到4之前的值:4
int k = str1.codePointCount(0, len-2);
System.out.println("0到"+(len-2)+"之前的值:"+k);
运行结果:
0到2之前的值:2

6. compareTo(String anotherString)
先看下面API文档的介绍:

int i = str1.compareTo("abd");
System.out.println(i);
int k = str1.compareTo("abf");
System.out.println(k);
int t = "abd".compareTo(str1);
System.out.println(t);
int j = "abf".compareTo(str1);
System.out.println(j);
int g = str1.compareTo(str1);
System.out.println(g);
int f = str1.compareTo("abcdefg");
System.out.println(f);
int r = "abcdefg".compareTo(str1);
System.out.println(r);
运行结果:
-1
-3
1
3
0
-3
3

7. compareToIgnoreCase(String str)
先看下面API文档的介绍:

int i = str1.compareToIgnoreCase("ABCD");
System.out.println(i);
int f = str1.compareTo("ABCD");
System.out.println(f);
运行结果:
0
32

8. concat(String str):将指定字符串连接到此字符串的结尾
String s1 = str1.concat("ABCD");
System.out.println(s1);
String s2 = str.concat("");
System.out.println(s2);
运行结果:
abcdABCD
abcd

9. copyValueOf(char[] data):返回指定数组中表示该字符序列的 String
静态方法
char[] data = {'a','b','c','d','e','f'};
String s1 = String.copyValueOf(data);
System.out.println(s1);
运行结果:

abcdef


10. copyValueOf(char[] data, int offset, int count):返回指定数组中表示该字符序列的 String
char[] data = {'a','b','c','d','e','f'};
String s1 = String.copyValueOf(data,3,3);
System.out.println(s1);
运行结果:

def


11. endsWith(String suffix):测试此字符串是否以指定的后缀结束
boolean isd = str1.endsWith("d");
System.out.println("此字符串是否以d结尾:"+isd);
boolean isf = str1.endsWith("f");
System.out.println("此字符串是否以f结尾:"+isf);
运行结果:
此字符串是否以d结尾:true
此字符串是否以f结尾:false
而与endsWith(String suffix)类似的方法有下面两个:
startsWith(String prefix)
startsWith(String prefix, int toffset)

这两个的方法是测试此字符串是否以指定的后缀开始


12. equals(Object anObject):将此字符串与指定的对象比较
boolean iseq1 = str1.equals("abcd");
System.out.println(iseq1);
boolean iseq2 = str1.equals("abc");
System.out.println(iseq2);
运行结果:
true

false


13. equalsIgnoreCase(String anotherString):将此 String 与另一个 String 比较,不考虑大小写
boolean iseq1 = str1.equalsIgnoreCase("ABCD");
System.out.println(iseq1);
运行结果:
true

14. getBytes():将字符串转化为字节数组
byte[] data = str1.getBytes();
for (int i=0;i<data.length;i++){
System.out.print(data[i]+"\t");
}
运行结果:

97 98 99 100


15. indexOf(int ch):返回指定字符在此字符串中第一次出现处的索引
int t = str1.indexOf(96);
System.out.println(t);
int i = str1.indexOf(97);
System.out.println(i);
int k = str1.indexOf(99);
System.out.println(k);
int f = str1.indexOf(101);
System.out.println(f);
运行结果:
-1
0
2

-1


16. indexOf(int ch, int fromIndex):返回在此字符串中第一次出现指定字符处的索引,从指定的索引开始搜索
int i = str2.indexOf(97, 3);
System.out.println(i);
int t = str2.indexOf(99, 1);
System.out.println(t);
int k = str2.indexOf(97,5);
System.out.println(k);
运行结果:
4
2

-1


17. indexOf(String str):返回指定子字符串在此字符串中第一次出现处的索引
int t = str2.indexOf("a");
System.out.println(t);
int i = str2.indexOf("c");
System.out.println(i);
int k = str2.indexOf("d");
System.out.println(k);
int f = str2.indexOf("e");
System.out.println(f);
运行结果:
2
3
-1

18. indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始
int i = str2.indexOf("a", 3);
System.out.println(i);
int t = str2.indexOf("c", 1);
System.out.println(t);
int k = str2.indexOf("a",5);
System.out.println(k);
运行结果:
2
-1

19. isEmpty():当且仅当 length() 为 0 时返回 true
boolean isempty1 = str1.isEmpty();
System.out.println(isempty1);
boolean isempty2 = "".isEmpty();
System.out.println(isempty2);
运行结果:
false
true

下面几个方法与上面indexOf()是相对应的,只不过是返回最后一次出现的索引


20. lastIndexOf(int ch)
int i = str2.lastIndexOf(97);
System.out.println(i);
int k = str2.lastIndexOf(101);
System.out.println(k);
运行结果:
4
-1
lastIndexOf(int ch, int fromIndex)
lastIndexOf(String str)
lastIndexOf(String str, int fromIndex)

21. substring(int beginIndex):返回一个新的字符串,它是此字符串的一个子字符串。该子字符串从指定索引处的字符开始,直到此字符串末尾
String s1 = str2.substring(4);
System.out.println(s1);
String s2 = str2.substring(2);
System.out.println(s2);
运行结果:
abcd

cdabcd


22. substring(int beginIndex, int endIndex):返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的 beginIndex 处开始,直到索引 endIndex - 1 处的字符
String s1 = str2.substring(4,7);
System.out.println(s1);
String s2 = str2.substring(2,7);
System.out.println(s2);
运行结果:
abc

cdabc


23. toCharArray():将此字符串转换为一个新的字符数组
char[] c = str1.toCharArray();
for (int i=0;i<c.length;i++){
System.out.print(c[i]+"\t");
}
运行结果:

a b c d


24. toLowerCase():将此 String 中的所有字符都转换为小写
String str3 = "ABCDABCD";
String str4 = "AcbdABcD";
String s1 = str3.toLowerCase();
System.out.println(s1);
String s2 = str4.toLowerCase();
System.out.println(s2);
运行结果:
abcdabcd
acbdabcd


引用传递三大实例:


实例一:int类型数据传递

[java] view plaincopyprint?
  1. public class Test {  
  2.     public static void main(String[] args) {  
  3.         Demo d1=new Demo();//实例化Demo对象,实例化之后里面的temp=30  
  4.         d1.temp=50;//修改属性的内容  
  5.         System.out.println("调用fun()方法之前:"+d1.temp);  
  6.         fun(d1);  
  7.         System.out.println("调用fun()方法之后:"+d1.temp);  
  8.     }  
  9.     public static void fun(Demo d2){//此方法由主方法直接调用  
  10.         d2.temp=1000;//修改temp值  
  11.     }  
  12. }  
  13. class Demo{  
  14.     int temp=30;//此处为了方便,属性暂时不封装  
  15. }  



实例二:String类型直接赋值的传递

[java] view plaincopyprint?
  1. public class Test {  
  2.     public static void main(String[] args) {  
  3.         String str1="hello";  
  4.         System.out.println("调用fun()方法之前:"+str1);//输出的结果是hello  
  5.         fun(str1);//指向同一个堆内存  
  6.         System.out.println("调用fun()方法之后:"+str1);//输出的结果还是hello  
  7.     }  
  8.     public static void fun(String str2){  
  9.         str2="xzlmark";//str2会重新开辟一个对内存存放str2的内容,但是str1的内容不会变  
  10.     }  
  11. }  



实例三:String类型new String()的传递

[java] view plaincopyprint?
  1. public class Test {  
  2.     public static void main(String[] args) {  
  3.         Demo d1=new Demo();  
  4.         d1.temp="world";  
  5.         System.out.println("fun()方法调用之前:"+d1.temp);  
  6.         fun(d1);  
  7.         System.out.println("fun()方法调用之后:"+d1.temp);  
  8.     }  
  9.     public static void fun(Demo d2){  
  10.         d2.temp="xzlmark";  
  11.     }  
  12. }  
  13.   
  14. class Demo{  
  15.     String temp="hello";  
  16. }  





接收本类的引用
本类的引用,即本类调用本类的方法或把自己实例化的对象传回自己的类中.

本类引用的基本实例

[java] view plaincopyprint?
  1. public class Test {  
  2.     public static void main(String[] args) {  
  3.         Demo d=new Demo();  
  4.         d.setAge(30);//只能通过setter方法进行设置  
  5.         d.age;//这样会报错,因为是封装类,不能直接访问  
  6.     }  
  7. }  
  8.   
  9. class Demo{  
  10.     private int age=20;  
  11.     public void setAge(int a){  
  12.         age=a;  
  13.     }  
  14.     public int getAge(){  
  15.         return age;  
  16.     }  
  17. }  



只要符合引用传递的语法,则可以在任意地方使用。
使用引用传递可以用作一对一的关系
如:人与书

[java] view plaincopyprint?
  1. public class Test{  
  2.     public static void main(String [] args){  
  3.         Person per=new Person("张三",30);  
  4.         Book bk=new Book("JAVA开发",56.0f);  
  5.         per.setBook(bk);//设置两个对象间的关系,一个人有一本书  
  6.         bk.setPerson(per);//设置两个对象间的关系,一本书属于一个人  
  7.         System.out.println("从人找到书--->姓名:"+per.getName()+";年龄:"  
  8.         +per.getAge()+";书名:"+per.getBook().getTitle()+";价格:"  
  9.         +per.getBook().getPrice());//可以通过人找到书  
  10.   
  11.   
  12.         System.out.println("从书找到人:---->书名:"+bk.getTitle()+";价格:"  
  13.         +bk.getPrice()+"姓名:"+bk.getPerson().getName()+";年龄:"  
  14.         +bk.getPerson().getAge());  
  15.     }  
  16. }  
  17. class Person{//定义Person类  
  18.     private String name;//name属性  
  19.     private int age;//age属性  
  20.     private Book book;//一个人有一本书  
  21.       
  22.     public Person(String name,int age){//构造方法  
  23.         this.setName(name);  
  24.         this.setAge(age);  
  25.     }  
  26.   
  27.     public void setName(String n){  
  28.         name=n;  
  29.     }  
  30.     public void setAge(int a){  
  31.         age=a;  
  32.     }  
  33.     public void setBook(Book b){  
  34.         book=b;  
  35.     }  
  36.   
  37.     public String getName(){  
  38.         return name;  
  39.     }  
  40.     public int getAge(){  
  41.         return age;  
  42.     }  
  43.     public Book getBook(){  
  44.         return book;  
  45.     }  
  46. }  
  47.   
  48. class Book{  
  49.     private String title;//书名属性  
  50.     private float price;//书的价格属性  
  51.     private Person person;//一本书属于一个人  
  52.   
  53.     public Book(String title,float price){  
  54.         this.setTitle(title);  
  55.         this.setPrice(price);  
  56.     }  
  57.     public void setTitle(String t){  
  58.         title=t;  
  59.     }  
  60.     public void setPrice(float p){  
  61.         price=p;  
  62.     }  
  63.     public void setPerson(Person p){  
  64.         person=p;  
  65.     }  
  66.   
  67.     public String getTitle(){  
  68.         return title;  
  69.     }  
  70.     public float getPrice(){  
  71.         return price;  
  72.     }  
  73.     public Person getPerson(){  
  74.         return person;  
  75.     }  
  76. }  




人如果有孩子,那孩子该怎么办?

这时就需要设置内部引用。
先建立child变量
使person与child建立关系

[java] view plaincopyprint?
  1. public class Test{  
  2.     public static void main(String [] args){  
  3.         Person per=new Person("张三",30);//初始化Person  
  4.         Book bk=new Book("JAVA开发",56.0f);//初始化Book  
  5.         Person cld=new Person("小MARK",10);//初始化一个孩子  
  6.         Book b=new Book("JAVA核心开发",20.0f);  
  7.   
  8.         per.setBook(bk);//设置两个对象间的关系,一个人有一本书  
  9.         bk.setPerson(per);//设置两个对象间的关系,一本书属于一个人  
  10.         cld.setBook(b);//设置对象间的关系,一个孩子有一本书  
  11.         b.setPerson(cld);//设置对象间的关系,一本书属于一个孩子  
  12.         per.setChild(cld);//设置对象间的关系,一个人有一个孩子  
  13.         System.out.println("从人找到书--->姓名:"+per.getName()+";年龄:"  
  14.         +per.getAge()+";书名:"+per.getBook().getTitle()+";价格:"  
  15.         +per.getBook().getPrice());//可以通过人找到书  
  16.   
  17.   
  18.         System.out.println("从书找到人:---->书名:"+bk.getTitle()+";价格:"  
  19.         +bk.getPrice()+"姓名:"+bk.getPerson().getName()+";年龄:"  
  20.         +bk.getPerson().getAge());  
  21.   
  22.         //通过人找到孩子,并找到孩子所拥有的书  
  23.         System.out.println(per.getName()+"的孩子-->姓名"  
  24.         +per.getChild().getName()+";年龄:"+per.getChild().getAge()  
  25.         +";书名:"+per.getChild().getBook().getTitle()+";价格:"  
  26.         +per.getChild().getBook().getPrice());  
  27.     }  
  28. }  
  29. class Person{//定义Person类  
  30.     private String name;//name属性  
  31.     private int age;//age属性  
  32.     private Book book;//一个人有一本书  
  33.     private Person child;//一个人有一个孩子  
  34.       
  35.     public Person(String name,int age){//构造方法  
  36.         this.setName(name);  
  37.         this.setAge(age);  
  38.     }  
  39.   
  40.     public void setName(String n){  
  41.         name=n;  
  42.     }  
  43.     public void setAge(int a){  
  44.         age=a;  
  45.     }  
  46.     public void setBook(Book b){  
  47.         book=b;  
  48.     }  
  49.     public void setChild(Person p){  
  50.         child=p;  
  51.     }  
  52.   
  53.     public String getName(){  
  54.         return name;  
  55.     }  
  56.     public int getAge(){  
  57.         return age;  
  58.     }  
  59.     public Book getBook(){  
  60.         return book;  
  61.     }  
  62.     public Person getChild(){  
  63.         return child;  
  64.     }  
  65. }  
  66.   
  67. class Book{  
  68.     private String title;//书名属性  
  69.     private float price;//书的价格属性  
  70.     private Person person;//一本书属于一个人  
  71.   
  72.     public Book(String title,float price){  
  73.         this.setTitle(title);  
  74.         this.setPrice(price);  
  75.     }  
  76.     public void setTitle(String t){  
  77.         title=t;  
  78.     }  
  79.     public void setPrice(float p){  
  80.         price=p;  
  81.     }  
  82.     public void setPerson(Person p){  
  83.         person=p;  
  84.     }  
  85.   
  86.     public String getTitle(){  
  87.         return title;  
  88.     }  
  89.     public float getPrice(){  
  90.         return price;  
  91.     }  
  92.     public Person getPerson(){  
  93.         return person;  
  94.     }  
  95. }  




构造函数不需要返回值,如果写成public void Person()那就错了!

0 0
原创粉丝点击