java 面向对象二

基本数据类型的相等判断

基本数据类型使用“==”来进行判断

如:

[java] view
plain
copyprint?

  1. int in1 = 22;
  2. int in2 = 22;
  3. System.out.println(in1 == int2);//输出true
String类的相等判断

[java] view
plain
copyprint?

  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
plain
copyprint?

  1. String str1 = "Hello";
  2. String str2 = "Hello";
  3. String str3 = str2;
  4. System.out.println(str1 == str2); //输出true
  5. System.out.println(str2 == str3); //输出true
  6. System.out.println(str1 == str3); //输出true

解释:表明直接赋值的方式以上三个变量的堆内存地址相同,即使用直接赋值的方式节省内存。

使用直接赋值的方式只需要一个实例化对象即可同,而使用new String()的方式则意味着要开辟两个内存对象,开发中最好使用直接赋值的方式完成。

字符串内容不可变

[java] view
plain
copyprint?

  1. String str1 = "Hello";
  2. str1 = str1 + "World";
  3. System.out.println(str1);  //输出Hello World

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

[java] view
plain
copyprint?

  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
plain
copyprint?

  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
plain
copyprint?

  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
plain
copyprint?

  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. class Demo{
  14. String temp="hello";
  15. }
接收本类的引用

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

本类引用的基本实例

[java] view
plain
copyprint?

  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. class Demo{
  9. private int age=20;
  10. public void setAge(int a){
  11. age=a;
  12. }
  13. public int getAge(){
  14. return age;
  15. }
  16. }

只要符合引用传递的语法,则可以在任意地方使用。

使用引用传递可以用作一对一的关系

如:人与书

[java] view
plain
copyprint?

  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. System.out.println("从书找到人:---->书名:"+bk.getTitle()+";价格:"
  11. +bk.getPrice()+"姓名:"+bk.getPerson().getName()+";年龄:"
  12. +bk.getPerson().getAge());
  13. }
  14. }
  15. class Person{//定义Person类
  16. private String name;//name属性
  17. private int age;//age属性
  18. private Book book;//一个人有一本书
  19. public Person(String name,int age){//构造方法
  20. this.setName(name);
  21. this.setAge(age);
  22. }
  23. public void setName(String n){
  24. name=n;
  25. }
  26. public void setAge(int a){
  27. age=a;
  28. }
  29. public void setBook(Book b){
  30. book=b;
  31. }
  32. public String getName(){
  33. return name;
  34. }
  35. public int getAge(){
  36. return age;
  37. }
  38. public Book getBook(){
  39. return book;
  40. }
  41. }
  42. class Book{
  43. private String title;//书名属性
  44. private float price;//书的价格属性
  45. private Person person;//一本书属于一个人
  46. public Book(String title,float price){
  47. this.setTitle(title);
  48. this.setPrice(price);
  49. }
  50. public void setTitle(String t){
  51. title=t;
  52. }
  53. public void setPrice(float p){
  54. price=p;
  55. }
  56. public void setPerson(Person p){
  57. person=p;
  58. }
  59. public String getTitle(){
  60. return title;
  61. }
  62. public float getPrice(){
  63. return price;
  64. }
  65. public Person getPerson(){
  66. return person;
  67. }
  68. }

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

这时就需要设置内部引用。

先建立child变量

使person与child建立关系

[java] view
plain
copyprint?

  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. per.setBook(bk);//设置两个对象间的关系,一个人有一本书
  8. bk.setPerson(per);//设置两个对象间的关系,一本书属于一个人
  9. cld.setBook(b);//设置对象间的关系,一个孩子有一本书
  10. b.setPerson(cld);//设置对象间的关系,一本书属于一个孩子
  11. per.setChild(cld);//设置对象间的关系,一个人有一个孩子
  12. System.out.println("从人找到书--->姓名:"+per.getName()+";年龄:"
  13. +per.getAge()+";书名:"+per.getBook().getTitle()+";价格:"
  14. +per.getBook().getPrice());//可以通过人找到书
  15. System.out.println("从书找到人:---->书名:"+bk.getTitle()+";价格:"
  16. +bk.getPrice()+"姓名:"+bk.getPerson().getName()+";年龄:"
  17. +bk.getPerson().getAge());
  18. //通过人找到孩子,并找到孩子所拥有的书
  19. System.out.println(per.getName()+"的孩子-->姓名"
  20. +per.getChild().getName()+";年龄:"+per.getChild().getAge()
  21. +";书名:"+per.getChild().getBook().getTitle()+";价格:"
  22. +per.getChild().getBook().getPrice());
  23. }
  24. }
  25. class Person{//定义Person类
  26. private String name;//name属性
  27. private int age;//age属性
  28. private Book book;//一个人有一本书
  29. private Person child;//一个人有一个孩子
  30. public Person(String name,int age){//构造方法
  31. this.setName(name);
  32. this.setAge(age);
  33. }
  34. public void setName(String n){
  35. name=n;
  36. }
  37. public void setAge(int a){
  38. age=a;
  39. }
  40. public void setBook(Book b){
  41. book=b;
  42. }
  43. public void setChild(Person p){
  44. child=p;
  45. }
  46. public String getName(){
  47. return name;
  48. }
  49. public int getAge(){
  50. return age;
  51. }
  52. public Book getBook(){
  53. return book;
  54. }
  55. public Person getChild(){
  56. return child;
  57. }
  58. }
  59. class Book{
  60. private String title;//书名属性
  61. private float price;//书的价格属性
  62. private Person person;//一本书属于一个人
  63. public Book(String title,float price){
  64. this.setTitle(title);
  65. this.setPrice(price);
  66. }
  67. public void setTitle(String t){
  68. title=t;
  69. }
  70. public void setPrice(float p){
  71. price=p;
  72. }
  73. public void setPerson(Person p){
  74. person=p;
  75. }
  76. public String getTitle(){
  77. return title;
  78. }
  79. public float getPrice(){
  80. return price;
  81. }
  82. public Person getPerson(){
  83. return person;
  84. }
  85. }

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

时间: 2024-10-06 10:43:41

java 面向对象二的相关文章

JavaSE入门学习21:Java面向对象之接口(interface)(二)

一接口实现的多态 在上一篇博文:JavaSE入门学习20:Java面向对象之接口(interface)(一)中提到了接口的实现存在多态性,那么 这一篇主要就要分析接口实现的多态. 实例一 Test.java源文件代码: public class Test{ public static void main(String[] args){ //实现接口Singer Singer s1 = new Student("Amy"); s1.sing(); s1.sleep(); s1.study

Java程序设计 实验二 Java面向对象程序设计

北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计 班级:1353  姓名:李海空  学号:20135329 成绩:             指导教师:娄嘉鹏      实验日期:2015.5.7 实验密级:         预习程度:         实验时间: 仪器组次:          必修/选修:            实验序号: 实验名称:       Java面向对象程序设计 实验目的与要求:实验内容 1. 初步掌握单元测试和TDD 2.

Java实验二实验报告:java面向对象程序设计

java实验二实验报告 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计模式 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> 课程 2.完成实验.撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等).解决办法(空洞的方法如“查网络”.“问

20135234马启扬 实验二 Java面向对象程序设计

北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计  班级:1352  姓名:马启扬  学号:20135234 成绩:             指导教师:娄嘉鹏    实验日期:2015.5.7 实验密级:         预习程度:         实验时间:15:50--22:50 仪器组次:34         必修/选修: 选修            实验序号:02 实验名称:实验二 Java面向对象程序设计 实验内容 1. 初步掌握单元测试和T

【Java面向对象基础(二)】细说String、StringBuffer和StringBuilder

[喵"的Android之路][基础篇(二)][Java面向对象基础]细说String.StringBuffer和StringBuilder 1.String String是Java中的一个final类,主要用于字符串的处理. 1.1 不可变性 String内的字符串是不可变的,每一次修改都会重新生成一个新的String对象实例. 例: 1 // 在堆中会创建一个"Hello"字符串实例,把地址赋给对象a 2 String a = new String("Hello&

2062326 齐力锋 实验二《Java面向对象程序设计》实验报告

北京电子科技学院(BESTI) 实     验    报     告 课程:   程序设计与数据结构           班级:      1623           姓名:  齐力锋      学号: 20162326 成绩:             指导教师:   娄嘉鹏/王志强             实验日期: 2017年4月14日 实验密级:非密级         预习程度:   优良      实验时间: 2 Hours 仪器组次:          必修/选修:   必修    

20145301《Java程序设计》实验二报告:Java面向对象程序设计

20145301<Java程序设计>实验二报告:Java面向对象程序设计 课程:Java程序设计 实验名称:Java面向对象程序设计 实验目的与要求: 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验内容: 使用TDD的方式设计关实现复数类Complex 程序设计思路: 需求分析: 复数运算需要分:实部和虚部. 需要运行四则运算,即加.减.乘.除四种运算.  需要用户有输入,所以调用了Scanner实例,i

20135119_涂文斌 实验二 Java面向对象程序设计

北京电子科技学院(BESTI) 实  验  报  告 课程: Java        班级:1351           姓名:涂文斌          学号:20135119 成绩:               指导教师:娄嘉鹏    实验日期:2015.4.17 实验密级:         预习程度:             实验时间:15:30~18:00 仪器组次:         必修/选修:选修       实验序号:(一) 实验名称:java面向对象程序设计 实验目的:1.初步掌握

Java实验报告二:Java面向对象程序设计

Java实验报告二:Java面向对象程序设计                                                                                                      实验要求: 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计模式 实验内容 (一)单元测试 (二)面向对象三要素 (三)设计模式初步 (四)练习