Java學習總結(四)——面向對象(下)(接口,抽象類,內部類,String類等)

一:Objectjava

  1. Object類時Java全部類的根基類(「又稱爲‘祖類’」)程序員

  2. 若在Java中未用extends關鍵字指明基類,則 編譯器默認爲其基類是object類。正則表達式

     例:public class Person{}數組

    其意義至關於public class  Person extends Object{} 緩存

  3. toString方法:安全

    1Object類中定義有public  String toString()方法,其返回值是String類型,描述當前對象的有關信息。微信

    注意:若是直接打印某對象的引用,則默認會調用這個對象的toString()方法,默認打印的內容中包含這個引用所指向的內存地址。app

    例:less

    StringDemo類:ide

    package tostring;

    public class StringDemo {

    private String name;

    private String sex;

    private int age;

    public StringDemo() {

    super();

    }

    public StringDemo(String name, String sex, int age) {

    super();

    this.name = name;

    this.sex = sex;

    this.age = age;

    }

    public void say(){

    System.out.println("我叫"+name+"性別"+sex+"年齡"+age);

    }

    public String getName() {

    return name;

    }

    public void setName(String name) {

    this.name = name;

    }

    public String getSex() {

    return sex;

    }

    public void setSex(String sex) {

    this.sex = sex;

    }

    public int getAge() {

    return age;

    }

    public void setAge(int age) {

    this.age = age;

    }

    }

    TsetString測試類:

    package tostring;

    public class TestString {

    public static void main(String[] args) {

    StringDemo str=new StringDemo();

    System.out.println(str);

    }

    }

    結果爲tostring.StringDemo@15db9742

    可見打印的是str的地址

    2)能夠根據須要(例要打引用所指向的內容)在用戶自定義類中重寫toString()方法。

    例:

    toString類:

    package tostring;

    public class StringDemo {

    private String name;

    private String sex;

    private int age;

    public StringDemo() {

    super();

    }

    public StringDemo(String name, String sex, int age) {

    super();

    this.name = name;

    this.sex = sex;

    this.age = age;

    }

     

    public String getName() {

    return name;

    }

    public void setName(String name) {

    this.name = name;

    }

    public String getSex() {

    return sex;

    }

    public void setSex(String sex) {

    this.sex = sex;

    }

    public int getAge() {

    return age;

    }

    public void setAge(int age) {

    this.age = age;

    }

    @Override

    public String toString() {

    // TODO Auto-generated method stub

    return "name:"+name+" age:"+age+" sex:"+sex;

    }

    }

    TestString測試類:

    package tostring;

    public class TestString {

    public static void main(String[] args) {

    StringDemo str=new StringDemo("王剛","男",17);

    System.out.println(str);

    }

    }

    結果爲:name:王剛 age:17 sex:男

    可見打印結果爲:str地址中所指向的內容

  4. equals()方法:

    (1)Object類中定義有public boolean equals(Object obj) 方法,提供定義對象是否「相等」的邏輯。

    2Objectequals方法定義爲:x.equals(y),當xy指向同一個地址時返回true,不然返回false

    3String類中已經重寫了equals(Object  obj)方法,重寫後的方法比較的是兩個字符串的」內容」是否同樣(注意:==比較對象的引用)

    4)能夠根據須要在用戶自定義類型中重寫equals方法。

    1

    Cat類:

    package equalsdemo;

     

    public class Cat {

    String color;

    int height,wight;

     

    public Cat() {

    super();

    }

     

    public Cat(String color, int height, int wight) {

    super();

    this.color = color;

    this.height = height;

    this.wight = wight;

    }

     

    }

    TestCat類:

    package equalsdemo;

     

    public class TestCat {

     

    public static void main(String[] args) {

    Cat cat1=new Cat("白色",1,1);

    Cat cat2=new Cat("白色",1,1);

    int x,y=1;

    x=1;

    System.out.println(x==y);

    System.out.println("cat1與cat2相等嗎?"+cat1.equals(cat2));

    System.out.println("cat1==cat2的結果是:"+(cat1==cat2));

    }

     

    }

    結果爲:x與y相比:true

    cat1與cat2相等嗎?false

    cat1==cat2的結果是:false

    由結果可知:由於cat1cat2都是新new出來的而且沒有重寫equals方法,因爲他們堆內存中佔據的空間不一樣,因此他們不會相等,cat1cat2都是堆內存中兩隻貓的引用對象裏邊裝着能夠找到只貓的地址,但因爲兩隻貓的內容存儲在不一樣空間內,因此cat1cat2裝着的地址永遠不會相同,因此c1==c2也不會相等

    2:(重寫equals方法和字符串比較)

    Dog類:

    package equalsdemo;

     

    public class Dog {

    int color;

    int height;

    public Dog() {

    super();

    }

    public Dog(int color, int height) {

    super();

    this.color = color;

    this.height = height;

    }

    @Override

    public boolean equals(Object obj) {

    if(obj==null){

    return false;

    }else if(obj instanceof Dog){

    Dog dog=(Dog)obj;

    if(dog.color==this.color && dog.height==this.height){

    return true;

    }

    }

    return false;

    }

     

    }

    TestDog類:

    package equalsdemo;

     

    public class TestDog {

     

    public static void main(String[] args) {

    String str1=new String("Hello");

    String str2=new String("Hello");

    Dog dog1=new Dog();

    Dog dog2=new Dog();

    System.out.println("字符串相比較:");

    System.out.println("str1與str2同樣嗎?"+str1.equals(str2));

    System.out.println("用==的結果是:"+(str1==str2));

    System.out.println("_______________________-");

    System.out.println("重寫equals方法得:");

    System.out.println("dog1和dog2是一條狗嗎?"+dog1.equals(dog2));

    System.out.println("用==的結果是:"+(dog1==dog2));

    }

     

    }

    打印結果:字符串相比較:

    str1與str2是同樣嗎?true

    ==的結果是:false

    _______________________-

    重寫equals方法得:

    dog1和dog2是一條狗嗎?true

    ==的結果是:false

    由結果可得:當equals方法重寫後,dog1==dog2輸出爲false,由於比較的是兩個引用中的內容,這兩個引用中的內容固然不相等,並且永遠不會相等,所一輸出爲false;但dog1.equals(dog2)輸出結果爲true,由於咱們在Dog類中重寫了equals方法,改變了這個方法的默認實現,改爲了只要這兩個對象只要真實存在,而且他們的顏色(color)和身高(height)同樣,那麼這兩隻狗咱們就認爲他們徹底相等;比較字符串:str1==str2結果爲false,由於這裏比較的是兩個對象的引用,故他們必定不會相等,但str1.equals(str2)結果爲true,由於String中重寫了從Object類所繼承的equals方法,改變了這個方法的默認實現。

    *總結:equals方法重寫時設計規則:

    (1)自反性:對任意引用值X,x.equals(x)的返回值必定是true

    2)對稱性:對於任何引用值x,y當且僅當y.equals(x)時返回值是truex.equals(y)返回值必定是true

    3)傳遞性:若是x.equals(y)=truey.equals(z)=true,x.equals(z)=true;

    (4)一致性:若是參與比較的對象沒有任何改變,則對象的比較結果也不該該有任何改變;

    5)非空性:任何對象的引用值X, x.equals(null)的返回值必定是false

     

  5. 多態性

    意義:是由封裝性和繼承性引出的面向對象程序設計語言的另外一特徵。(封裝是爲了保護屬性的一種操做,繼承是爲了擴展類的功能)

  6. 多態的體現:

    *從方法角度:方法的重載與重寫;

    1)方法重寫(overloading):子類根據須要重寫父類的方法;

    2)方法重載(override):傳入的參數不一樣完成的功能也不一樣

    *從對象的角度來看:

1)向上轉型:子類對象轉化爲父類對象子類對象->父類對象  (程序會自動完成)

格式:父類 父類對象=子類實例

注意:向上轉型後,由於操做的是父類對象,因此沒法找到在子類中定義的新方法;但若是子類重寫了父類的某個方法,則調用的是重寫後的方法。

1

Person類:

package MethodDuotai;

 

public class Person {

String name;

int age;

String sex;

public Person() {

super();

}

 

public Person(String name, int age){

super();

this.name = name;

this.age = age;

}

public Person(String name, int age, String sex) {

super();

this.name = name;

this.age = age;

this.sex = sex;

}

 

public void say(){

System.out.println("我叫"+name+"年齡"+age+"性別"+sex);

}

}

Student類:

package MethodDuotai;

 

public class Student extends Person{

private double score;

 

public Student() {

super();

}

 

public Student(String name, int age, String sex,double score) {

super(name,age,sex);

this.score = score;

}

 

public double getScore() {

return score;

}

 

public void setScore(double score) {

this.score = score;

}

 

public void say(){

System.out.println("我叫"+name+"年齡"+age+"性別"+sex+"分數"+score);

}

}

TestPerson類:

package MethodDuotai;

 

public class Testperson {

 

public static void main(String[] args) {

Person per=new Person("張三",12,"");

Student stu=new Student("張三",12,"",95.7);

per.say();

stu.say();  

}

 

}

結果爲:我叫張三年齡12性別男

我叫張三年齡12性別男分數95.7

*紅色標記爲方法的重載;藍色標記爲方法的重寫

 

  1. 向下轉型:父類對象->子類對象 (必須明確的指明要轉型的子類類型)

格式:子類 子類對象=(子類)父類實例

注意:向下轉型前必須向上轉型

2(在例1的基礎上)

package MethodDuotai;

 

public class Testperson {

 

public static void main(String[] args) {

Person per=new Person("張三",12,"");

Student stu=new Student("張三",12,"",95.7);

per.say();

stu.say();

System.out.println();

System.out.println("__向上轉型_____");

per=new Student("張三",12,"",95.7);

//per.walk();   //報錯

per.say();

System.out.println("__向下轉型______");

stu=(Student)per;

per.say();

}

 

}

結果爲:

我叫張三年齡12性別男

我叫張三年齡12性別男分數95.7

 

__向上轉型_____

我叫張三年齡12性別男分數95.7

__向下轉型______

我叫張三年齡12性別男分數95.7

*1)因而可知向上轉型後父類被重寫的方法

*2)向上轉型後沒法訪問子類的新方法

  1. instanceof關鍵字

  2. Java中利用instanceof關鍵字判斷一個對象是否屬於一個類的實例;

格式:對象  instanceof       à返回boolean類型

例:

Animal動物類:

package instanceofdemo;

 

public class Animal {

private String name;

private int age;

 

public Animal() {

}

 

public Animal(String name, int age) {

super();

this.name = name;

this.age = age;

}

 

public void say() {

System.out.println("我是父類方法say(),姓名:" + this.name + ";年齡:" + this.age);

}

 

 

public String getName() {

return name;

}

 

public void setName(String name) {

this.name = name;

}

 

public int getAge() {

return age;

}

 

public void setAge(int age) {

this.age = age;

}

 

}

Dog狗類:

package instanceofdemo;

 

public class Dog extends Animal{

 

public Dog() {

}

 

public Dog(String name, int age) {

super(name, age);

}

 

public void plant() {

System.out.println("小狗啃骨頭");

}

}

Cat貓類:

package instanceofdemo;

 

public class Cat extends Animal {

private String color;

 

public Cat() {

}

 

public Cat(String name, int age, String score) {

super(name, age);

this.color = color;

}

 

 

public void learn() {

System.out.println("小貓吃魚~");

}

 

public String getScore() {

return color;

}

 

public void setScore(String color) {

this.color = color;

}

 

}

InstanceofDemo測試類:

package instanceofdemo;

 

public class InstanceofDemo {

 

public static void main(String[] args) {

Dog dog=new Dog();

Cat cat=new Cat();

method(null);

method(dog);

method(cat);

System.out.println("********************");

Animal an=new Dog();

System.out.println(an instanceof Animal);    // 判斷是不是Animal類型

System.out.println(an instanceof Dog);  // 判斷是不是由Dog類的對象轉換而來

 

}

 

public static void method(Animal an){

if(an==null){

System.out.println("不能直接傳遞null!");

return;

}

if(an instanceof Dog){

Dog dog=(Dog)an;

dog.plant();

}

if(an instanceof Cat){

Cat cat=(Cat)an;

cat.learn();

}

}

}

結果爲:

不能直接傳遞null!

小狗啃骨頭

小貓吃魚~

********************

true

true

紅色即爲instanceof關鍵字的用法

  1. final關鍵字

*Java中聲明類,屬性,方法是可使用final關鍵字來修飾

注意:(1final修飾變量,則此變量(成員變量或局部變量)成爲常量,只能賦值一次,修飾成員變量時必須賦初值

格式:final 類型 變量名(variableName);

例:public class finaldemo {

final int age=15;

}   //修飾成員變量必須賦初值

  1. final修飾類賦,則此類不能被繼承;

  2. final修飾的方法,子類不能重寫;

三.抽象類與接口

1.抽象類:用abstract修飾的類即爲抽象類

1)格式:abstract class 抽象類名{

2)抽象類不能被實例化,必須被繼承,抽象方法必須被重寫,生成它的子類

2.抽象方法:用abstract修飾方法即爲抽象方法,抽象方法沒有方法體;

注意:

1)抽象類中不必定有抽象方法,但有抽象方法的必定是抽象類

2)若是子類沒有實現抽象類中的全部抽象方法,則該子類也成爲一個抽象類;

3)構造方法,靜態方法,私有方法不能被定義爲抽象方法

例:

AbstractPerson抽象類:

package abstractdemo;

 

public abstract class Person {

String name;

String sex;

public Person() {

super();

}

public Person(String name, String sex) {

super();

this.name = name;

this.sex = sex;

}

public abstract void eat();

 

}

 

Student實現類:

package abstractdemo;

 

public class Student extends Person{

private int age;

 

public Student() {

super();

}

public Student(String name,String sex,int age) {

super(name,sex);

this.age = age;

}

 

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public void eat() {

System.out.println("姓名爲"+name+"性別椒"+sex+"年齡爲"+age+"的學生正在吃東西");

 

}

}

TestPerson測試類:

package abstractdemo;

 

public class TestPerson {

 

public static void main(String[] args) {

Student stu=new Student("佔三","",18);

stu.eat();

}

 

}

結果爲:姓名爲佔三性別椒男年齡爲18的學生正在吃東西

例(爲實現父類中的抽象方法):

package abstractdemo;

 

public abstract class Programmer extends Person{

public void coding(){

System.out.println("程序員寫程序");

}

能夠看出仍是抽象類

3.接口(interface)(重點)

1)接口是抽象方法和常量值定義發的集合

(2) 接口是一種「標準」、「契約」。

(3)從本質上講,接口是一種特殊的抽象類,這種抽象類中只能包含常量和方法的定義,而沒有變量和方法的實現

(4)接口的聲明語法:

·包括接口聲明和接口體

5)完整的接口聲明:

[public] interface 接口名稱[extends listOfSuperInterface] {  …  }

#接口體包括常量定義和方法定義

#常量定義: type NAME=value;  該常量被實現該接口的多個類共享; 具備public ,final, static的屬性.

注意:常量名必須大寫

#方法體定義:具備 publicabstract屬性

6)接口的實現類:

  • 與抽象類同樣,接口要使用也必須經過子類,子類經過implements關鍵字實現接口

  • 一個類能夠實現多個接口,implements子句中用逗號分開

  • 非抽象子類必須實現接口中定義的全部方法

  • 實現格式:

    class 子類 implements接口A,接口B…{

    }

    (7)接口的使用規則:

  • 接口中全部的方法都是public abstract

  • 在接口中聲明方法時,不能使用staticfinalsynchronizedprivateprotected等修飾符。

  • 一個接口能夠繼承自另外一個接口。

  • java中不容許類的多繼承,但容許接口的多繼承。

  • 接口中能夠有數據成員,這些成員默認都是public static final

    8)接口的用法:

    # 經過接口實現不相關類的相同行爲,而無需考慮這些類之間的關係.

    # 經過接口指明多個類須要實現的方法

    # 經過接口瞭解對象的交互界面,而無需瞭解對象所對應的類

    例:

    Animal動物接口:

    package interfacedemo;

     

    public interface Animal {

    int ID=1;

    void breath();

    void shout();

    }

    Run接口:

    package interfacedemo;

     

    public interface Run {

    void run();

     

    }

    Dog實現類:

    package interfacedemo;

     

    public class Dog implements Animal{

     

    public void breath() {

    System.out.println("小狗在呼吸");

    }

     

    public void shout() {

    System.out.println("小狗在叫:汪汪");

    }

     

    }

    Cat實現類:

    package interfacedemo;

     

    public class Cat implements Animal,Run{

    private String name;

     

    public Cat() {

    super();

    }

     

    public Cat(String name) {

    super();

    this.name = name;

    }

     

    public String getName() {

    return name;

    }

     

    public void setName(String name) {

    this.name = name;

    }

     

    public void breath() {

    System.out.println("名爲:"+name+"的貓在呼吸");

    }

     

    public void shout() {

    System.out.println("貓在叫:喵喵");

     

    }

    public void run() {

    System.out.println("小貓在跑");

     

    }

     

    }

    TestAnimal測試類:

    package interfacedemo;

     

    public class TestAnimal {

     

    public static void main(String[] args) {

    Dog dog=new Dog();

    Cat cat=new Cat("Tom");

    dog.breath();

    dog.shout();

    System.out.println("*************");

    cat.breath();

    cat.run();

    cat.shout();

    }

     

    }

    接口Fly繼承接口:

    package interfacedemo;

     

    public interface Fly extends Animal,Run {

     

    }

     

    結果爲:小狗在呼吸

    小狗在叫:汪汪

    *************

    名爲:Tom的貓在呼吸

    小貓在跑

    貓在叫:喵喵

    *紅色標記爲接口

    *例中實現了接口的用法

    *例中綠色標記能夠看出接口能夠實現多繼承

     

    基本數據類型的包裝類

    1. Java語言針對全部的基本數據類型都提供了對應的包裝類。

基本數據類型

包裝類

byte(字節)

java.lang.Byte

char(字符)

java.lang.Character

short(短整型)

java.lang.Short

int(整型)

java.lang.Integer

long(長整型)

java.lang.Long

float(浮點型)

java.lang.Float

double(雙精度)

java.lang.Double

boolean(布爾)

java.lang.Boolean

2.1基本數據類型轉換爲包裝類

 egInteger intValue = new Integer(21);

2)包裝類轉換成基本類型

eg:Integer integerId=new Integer(25);

int intId=integerId.intValue();

3. JDK5.0中爲基本數據類型提供了自動裝箱(boxing)、拆箱(unboxing)功能:

1)裝箱:將基本數據類型包裝爲對應的包裝類對象

2)拆箱:將包裝類對象轉換成對應的基本數據類型

Eg: Integer intObject = 5;

int intValue = intObject;

包裝類並非用來取代基本數據類型的

1

CharacterDemo類:

package boxing;

 

public class CharacterDemo {

 

public static void main(String[] args) {

    Character c='a';   // 自動裝箱

    char x=c;          // 自動拆箱

    System.out.println("變爲大寫:"+Character.toUpperCase('b'));

    System.out.println("變爲小寫:"+Character.toLowerCase('Z'));

 

}

}

結果爲:變爲大寫:B

變爲小寫:z

例中紅色標記爲自動拆箱與裝箱,綠色標記爲Character類中基本方法的應用

2

package boxing;

 

public class IntegerDemo {

 

public static void main(String[] args) {

System.out.println("int的最大值:"+Integer.MAX_VALUE);

System.out.println("int的最小值:"+Integer.MIN_VALUE);

Integer a=100;   // 自動裝箱

int b=a;         // 自動拆箱

String str="456";

int temp=Integer.parseInt(str);   // 將字符串轉換爲int

System.out.println(temp+7);

}

}

結果爲:int的最大值:2147483647

int的最小值:-2147483648

128

例中紅色標記爲自動拆箱與裝箱,綠色標記爲Integer類中方法的應用

*字符串轉化爲int型特別注意:

例:String str=123」;

System.out.println(str+5);

結果爲:1235

*若想將str轉化爲int型:

int temp=Integer.parstInt(str);

System.out.println(str+5);

結果爲:128

    1. 字符串相關類

      1. String

          (1) String表明字符串類型,字符串的內容自己不可改變,字符串存儲於「字符串常量池」中。

          (2)String的兩種實例化方式

               a:直接賦值法:

               eg:  String str=Hello World;

      **直接賦值法String 內存圖

       String直接賦值內存圖.png

             b:經過new操做符實例化:

               eg: String str=new String(Hello World);

      下面是經過new操做符實例化String的內存圖

       經過new實例化String對象.png

          (3)一個字符串就是一個String類的匿名對象。

               所謂匿名對象,就是在堆內存中開闢了空間,但在棧內存中並無引用指向的對象。

          (4)字符串經常使用方法

      1.public String(byte[] bytes)

        使用平臺的默認字符集解碼,將字節數組轉換爲字符串

       

      2.public String(byte[] bytes,Charset charset)

        使用指定字符集解碼,將字節數組轉換爲字符串

       

      3.public char charAt(int index)

        根據索引位置獲取字符串中的某個字符

       

      4.public boolean contains(CharSequence s)

        判斷當前對象表明的字符串是否包含參數字符串內容

       

      5.public boolean equals(Object anObject)

        判斷字符串內容是否相同

       

      6.public byte[] getBytes()

        將字符串轉換爲字節數組

       

      7.public int indexOf(String str)

        返回參數字符串在當前字符串中的索引位置

       

      9.public int lastIndexOf(String str)

        從後往前找參數字符串,返回參數字符串在當前字符串中的索引位置

       

      10.public int length()

         返回當前字符串的長度

       

      11.public String toLowerCase()

         將字符串轉換爲小寫

       

      12.public String toUpperCase()

         將字符串轉換爲大寫

       

      13.public char[] toCharArray()

         將字符串轉換爲字符數組

       

      14.public String substring(int beginIndex)

         beginIndex索引位置開始,到字符串末尾,截取字符串

       

      15.public String substring(int beginIndex,int endIndex)

         beginIndex索引位置開始,到endIndex-1,截取字符串

       

      16.public String trim()

         返回一個字符串,這個字符串刪除了前導和尾隨空格

       

      17.public String[] split(String regex)

         經過指定的正則表達式拆分字符串,將拆分後的結果做爲一個字符串數組返回

      1

      package stringdemo;

       

      public class StringMethod {

       

      public static void main(String[] args) {

      String str="我是中國人中華";

      System.out.println("字符串中索引位置2的字符是:"+str.charAt(2));

      System.out.println("字符串中「中」字的索引爲:"+str.indexOf("中"));

      System.out.println("字符串中倒敘找「中」的索引爲: "+str.lastIndexOf("中"));

      System.out.println("字符 串的長度是:"+str.length());

      System.out.println("根據索引位置截取的字符 串是:"+str.substring(4));

      System.out.println("字符串中是否包含「中國人」:"+str.contains("中國人"));

      System.out.println("由索引截取字符串,起止:"+str.substring(2, 5));

      String str1="×××";

      String str2="我是中國人中華";

      System.out.println("字符串str中的內容是否與str1中的相同:"+str.equals(str1));

      System.out.println("字符串str中的內容是否與str2中的相同:"+str.equals(str2));

      String  str3="abHvhFHn";

      System.out.println("將字符串中的大寫轉換爲小寫:"+str3.toLowerCase());

      System.out.println("將字符串中的小寫轉化爲大寫:"+str3.toUpperCase());

      String str4="aufafvvidsgd";

      char[] a=str4.toCharArray();

      System.out.println("將字符串轉化爲字符串數組爲:");

      for(int i=0;i<a.length;i++){

      System.out.print(a[i]+" ");

      }

      System.out.println();

      String str5="    zhogn   ";

      System.out.println("去除字符串前面和後面的空格爲:"+str5.trim());

      String  str6="12345668";

      byte[] b=str6.getBytes();

      System.out.println("將字符串轉換爲字節數組爲:"+b);

      String s=new String(b);

      System.out.println("將字節數組轉換爲字符串爲:"+s);

      String score="56,67,78,56,32,98.76";

      String[] sco=score.split(",");

      System.out.println("按照既定 的規則拆分字符串:");

      for( String x:sco){

      System.out.print(x+" ");

      }

      }

       

      }

      結果爲:

      字符串中索引位置2的字符是:中

      字符串中「中」字的索引爲:2

      字符串中倒敘找「中」的索引爲: 5

      字符 串的長度是:7

      根據索引位置截取的字符 串是:人中華

      字符串中是否包含「中國人」:true

      由索引截取字符串,起止:中國人

      字符串str中的內容是否與str1中的相同:false

      字符串str中的內容是否與str2中的相同:true

      將字符串中的大寫轉換爲小寫:abhvhfhn

      將字符串中的小寫轉化爲大寫:ABHVHFHN

      將字符串轉化爲字符串數組爲:

      a u f a f v v i d s g d

      去除字符串前面和後面的空格爲:zhogn

      將字符串轉換爲字節數組爲:[B@15db9742

      將字節數組轉換爲字符串爲:12345668

      按照既定 的規則拆分字符串:

      56 67 78 56 32 98.76

      2:

      package stringdemo;

       

      public class String02 {

       

      public static void main(String[] args) {

      String  str1="Hello";

      String  str2="Hello";

      System.out.println(str1==str2);

      System.out.println(str1.equals(str2));

      String str3=new String("Hello");

      System.out.println(str1.equals(str3));

      }

       

      }

      結果爲:true

      true

      True

      具體緣由equals中已經解釋

      String方法應用練習:

      1.編寫程序,統計出字符串「want you to know one thing

         中字母n和字母o的出現次數

       

       

      2.分別截取字符串"   ABCmnyCW123   "中的"CmnyCW123"部分和"CW123"部分。

        提示:會使用到indexOf(xx) lastIndexOf(xxx) substring(xxx) trim()方法。

      解析1

      package stringdemo;

       

      public class StringArrray {

       

      public static void main(String[] args) {

      String str="want you to know one things";

      char[] c=str.toCharArray();

      int n=0;

      int o=0;

      for(int i=0;i<c.length;i++){

      if(c[i]=='n'){

      n++;

      }

      if(c[i]=='o'){

      o++;

      }

      }

      System.out.println("出現n的次數:"+n);

      System.out.println("出現o的次數:"+o);

      }

       

      }

      結果爲:出現n的次數:4

      出現o的次數:4

      解析2

      package stringdemo;

       

      public class Substring {

       

      public static void main(String[] args) {

      String str="  ABCmnyCW123  ";

      int s=str.indexOf("C");

      System.out.println("截取後的結果是:"+str.substring(s).trim());

      int c=str.lastIndexOf("C");

      System.out.println("第二次截取後的結果是:"+str.substring(c).trim());

      }

       

      }

      結果爲:截取後的結果是:CmnyCW123

      第二次截取後的結果是:CW123

  1. StringBuffer類

  2. StringBuffer表明 可變的字符序列(StringBuffer稱爲字符緩衝區),其工做原理爲:預先申請一塊內存,存放字符序列,若是字符序列滿了會從新 擴展緩存區的大小,以容納更多的字符序列。

  3. StringBuffer是可變換對象,這是與String最大的不一樣。(若是連續操做String對象,則會產生大量的「垃圾」,並且「斷開-鏈接」很頻繁。

    例(String應用):

    package stringbuffer;

     

    public class StringBufferMethod {

     

    public static void main(String[] args) {

    StringBuffer sb=new StringBuffer();

    sb.append("中國").append("香水").append("Java");

    System.out.println("反轉以前:");

    System.out.println(sb.toString());

    sb.reverse();   // 反轉緩衝區的內容

    System.out.println("反轉以後:");

    System.out.println(sb.toString());

     

    StringBuffer sb2=new StringBuffer();

    sb2.append(false).append(12.5).append("hello");

    sb2.insert(1,true);   // 在索引爲1處插入true

    System.out.println(sb2);

     

    }

     

    }

    運行結果爲:

    反轉以前:

    中國香水Java

    反轉以後:

    avaJ水香國中

    ftruealse12.5hello

     

    2

    package stringbuffer;

     

    public class StringBufferDemo {

     

    public static void main(String[] args) {

    StringBuffer sb=new StringBuffer();

    sb.append("hello");

    long start=System.currentTimeMillis();

    for(int i=0;i<10000;i++){

    sb.append(i);

    }

    long end=System.currentTimeMillis();

            System.out.println("使用StringBuffer耗時:"+(end-start));

            System.out.println(sb.length());

            

         }

     

    }

    運行結果爲:使用StringBuffer耗時:6

    38895

    3.StringBuilder類

       StringBuilder和StringBuffer功能幾乎是同樣的,只是 StringBuilder是線程不安全的

  4. 內部類

    1.在類的內部定義另外一個類。若是在類Outer的內部再定義一個類Inner,此時Inner就稱爲內部類,而Outer則稱爲外部類。

    2.內部類的定義格式:

    Public class 外部類{

    外部類成員

    Public class 內部類{

    內部類成員

    }

    }

  5. 內部類在編譯完成後也會產生.class文件,而文件名稱則是」外部類名稱$內部類名稱.class

  6. 使用內部類的緣由:心臟屬於人類的某個部分:但心臟不能簡單用屬性或者方法表示一個心臟,由於心臟也有本身的屬性和行爲,因此須要寫在人類的內部

  7. 使用內部類的緣由:(1)好處:能夠方便地訪問外部類的私有屬性;減小了類文件編譯後的產生的字節碼文件的大小。(2)缺點:使程序結構不清楚

  8. 內部類分類(重點):

  9. 成員內部類

    *成員內部類中不能定義static變量

    *成員內部類持有外部類的引用

    *在文件管理方面,成員內部類在編譯完成後也會產生.class文件,而文件名稱則是」外部類名稱$內部類名稱.class

    *外部實例化成員內部類的格式:

     外部類.內部類  內部類對象=外部類實例.new 內部類()

    1(成員內部類):

    成員內部類:

    package memberclass;

     

    public class Outer {

    private int num=5;

     

    public void test(){

    Inner inner=new Inner();

    inner.show();

    }

    class Inner{

    public void show(){

    System.out.println("num="+num);

    }

    }

    }

    測試成員內部類:

    package memberclass;

     

    public class TestMemclass {

     

    public static void main(String[] args) {

    Outer outer=new Outer();

    outer.test();

     

    }

    }

    結果:num=5

    2

    package memberclass;

     

    public class Outer02 {

    private String name="張三";

     

    class Inner{

    public void say(){

    System.out.println("我叫"+name);

    }

    }

    public Inner getInner(){

    return new Inner();

    }

    }

    TestInner類:

    package memberclass;

     

    public class TestInner {

     

    public static void main(String[] args) {

     // 經過在外部類中的成員方法中獲取內部類對象

    Outer02 outer=new Outer02();

    outer.getInner().say();

    // 外部類.內部類  內部類對象=外部類實例.new 內部類();

    Outer02.Inner inner=outer.new Inner();

    inner.say();

    }

    }

    結果爲:我叫張三

    我叫張三

    例中詳細的作出了訪問成員內部類的方法

  10. 靜態內部類:

    *若是一個內部類使用static聲明,則此內部類就稱爲靜態內部類,其實也至關於外部類。能夠經過外部類.內部類來訪問。

    *靜態內部類不會持有外部類的引用,建立時能夠不用建立外部類對象

    *靜態內部類能夠訪問外部的靜態變量,若是訪問外部類的非static成員變量必須經過外部類的實例訪問

    *外部實例化靜態內部類對象的格式:

    外部類.內部類  內部類對象= new  外部類.內部類();

    例:

    靜態內部類:

    package staticclass;

     

    public class Outer {

    private String name="張三丰";

    private static int age=22;

     

    static class Inner{

    public void say(){

    System.out.println("訪問外部了靜態變量:age="+age);

    Outer outer=new Outer();

    System.out.println("訪問外部類非靜態變量:"+outer.name);

    }

    }

     

    }

    測試靜態內部類:

    package staticclass;

     

    public class TestInner {

     

    public static void main(String[] args) {

    Outer.Inner inner=new Outer.Inner();

    inner.say();

    }

     

    }

    結果:訪問外部了靜態變量:age=22

    訪問外部類非靜態變量:張三丰

  11. 局域內部類:

    *局域內部類是定義在一個方法中的內嵌類,因此類的做用範圍僅限於該方法中,而類生成的對象也只能在該方法中使用。

    * 局域內部類不能包含靜態成員

    * 特別注意:局域內部類要想訪問包含其的方法中的參數,則方法中的參數前必須加上final關鍵字(JDK<=1.7)

    例:

    局域內部類:

    package localclass;

     

    public class Outer {

    private int age=23;

    private String name="希特勒";

    public void say(int x){

    class Inner{

    public void talk(){

    System.out.println("直接訪問外部類變量此人age:"+age+"name:"+name);

    System.out.println("訪問外部類方法傳參:"+x);

    }

    }

    Inner inner=new Inner();

    inner.talk();

    }

     

    }

    測試局域內部類:

    package localclass;

     

    public class TestLocal {

     

    public static void main(String[] args) {

    Outer outer=new Outer();

    outer.say(27);

    }

     

    }

    結果:直接訪問外部類變量此人age:23name:希特勒

    訪問外部類方法傳參:27

  12. 匿名內部類:

    *若是一個內部類在整個操做中只使用一次的話,就能夠定義爲匿名內部類

    *沒有名字的內部類,這是java爲了方便咱們編寫程序而設計的一個機制,由於有時候有的內部類只須要建立一個它的對象就能夠了,之後再不會用到這個類,這時候使用匿名內部類就比較合適

    例:

    動物接口:

    package anonumityclass;

     

    public interface Animal {

    void shout();

     

    }

    測試匿名內部類:

    package anonumityclass;

     

    public class TestAnonumity {

     

    public static void main(String[] args) {

    //定義匿名內部類做爲參數傳遞給animalShout()方法

    animalShout(new Animal(){

    //實現shout方法

    public void shout(){

    System.out.println("喵喵~~~~~");

    }

    });

    }

    //定義靜態方法animalShout

    public static void animalShout(Animal an){

    an.shout();//調用傳入對象an的shout()方法

    }

     

    }

    小結(以一個做業題結束)

    (1)定義如下這些接口和類,並完成相關屬性和方法的聲明和調用.數據類型,參數列表,返回值類型等請根據題目須要自行定義.

    學習接口Learning(包含方法: 預習preLearn,上課lessons,複習reveiw)

    喝酒接口Drinking(包含方法: 喝酒drink, throwup,耍酒瘋playMad)

    抽象類Person(包含屬性:姓名,性別,年齡; 抽象方法:談戀愛love)

    學生Student是人,得會學習,但不能喝酒(由於會使大腦變笨);他們還有本身的學校(school),還喜歡和朋友聊微信(chatting).

    公務員Officer是人,不用學習,但常常須要喝酒應酬;他們還得常常開一些無聊的會議(meeting).

    程序猿Programmer,是人,必須常常學習,較少社交因此不喝酒;他們特別喜歡寫代碼(coding),和修bug(debuging).

     

    (2)在場景類Client中定義一個方法method1,在形參和實參上體現對象的多態性,在方法中進行調用,若是對象的實際類型是學生,

       就和朋友聊微信;若是是公務員,就去開會;若是是程序猿,就去寫代碼和修bug.

     

     

    (3)直接打印一個學生對象,就能如下面格式來輸出:

    學生信息:  姓名:張三,性別:,年齡:20,學校:北大.

     

    (4)若是兩個學生的姓名、性別、年齡、學校同樣,則認爲這兩個學生「相等」。

     

    學習接口:

    package studyDemo;

     

    public interface Learning {

    void preLearn();

    void lessons();

    void reveiw();

     

    }

    喝酒接口:

    package studyDemo;

     

    public interface Drinking {

    void drink();

    void throwup();

    void palyMad();

    }

     

    Person抽象類:

     

    package studyDemo;

     

    public abstract class Person{

    String name;

    int age;

    String sex;

     

    public Person() {

    super();

    }

     

    public Person(String name, int age, String sex) {

    super();

    this.name= name;

    this.age = age;

    this.sex = sex;

    }

     

    public abstract void love();

     

    }

    學生Student實現類:

    package studyDemo;

     

    public class Student extends Person implements Learning{

    private String shoolName;

     

    public Student() {

    super();

    }

     

     

    public Student(String shoolName,String name,int age,String sex) {

    super(name,age,sex);

    this.shoolName = shoolName;

    }

     

     

    public void preLearn() {

    System.out.println(name+"同窗正在預習中~~");

    }

     

    public void lessons() {

    System.out.println("上課了"+name+"同窗上課去了");

    }

     

    public void reveiw() {

    System.out.println("上課完畢,回家複習~~");

    }

     

    public void chating(){

    System.out.println(shoolName+"的學生"+name+"和朋友聊微信中~~");

    }

     

    public String getShoolName() {

    return shoolName;

    }

     

    public void setShoolName(String shoolName) {

    this.shoolName = shoolName;

    }

     

    public void love() {

    // TODO Auto-generated method stub

    System.out.println(name+"是位"+sex+"生今年"+age+"歲了,在和對面男生談戀愛~~");

    }

    @Override

    public boolean equals(Object obj) {

    if(this==obj){

    System.out.println("$學生本身比本身,固然是同一人!");

    return true;

    }

    if(obj==null){

    System.out.println("$傳入參數爲null,沒法比較!");

    return false;

    }

    if(!(obj instanceof Student)){  

    System.out.println("$傳遞的不是學生對象!");

    return false;

    }

    Student stu=(Student)obj;   

    if(this.name!=null && this.name.equals(stu.name) && this.age==stu.age && this.sex==stu.sex){

    return true;

    }

    return false;

    }

    public String toString() {

    // TODO Auto-generated method stub

    return "學生    [姓名:" + name + ", 年齡:" + age + ", 性別:" + sex

    + "]";

    }

    }

     

    程序員實現類:

     

    package studyDemo;

     

    public class Programmer extends Person implements Learning{

     

    public Programmer(){

     

    }

     

    public Programmer(String name,int age,String sex){

    super(name,age,sex);

    }

    public void preLearn() {

    // TODO Auto-generated method stub

    System.out.println("名爲"+name+"的程序員正在預習~");

    }

     

    public void lessons() {

    // TODO Auto-generated method stub

    System.out.println(name+"正在上課中~");

    }

     

    public void reveiw() {

    // TODO Auto-generated method stub

    System.out.println("上課完畢,回家複習~");

    }

     

    public void love() {

    // TODO Auto-generated method stub

    System.out.println(name+"是位"+sex+"程序員,今年"+age+"歲正在和隔壁女孩談戀愛~");

    }

     

    public void coding(){

    System.out.println(name+"程序員特別喜歡寫代碼~");

    }

     

    public void debuging(){

    System.out.println(name+"也喜歡修電腦Bug");

    }

     

    public String toString() {

    // TODO Auto-generated method stub

    return "程序員    [姓名:" + name + ", 年齡:" + age + ", 性別:" + sex

    + "]";

    }

    }

     

    公務員實現類:

     

    package studyDemo;

     

    public class Officer extends Person implements Drinking{

     

    public Officer(){

    super();

    }

     

    public Officer(String name, int age, String sex) {

    // TODO Auto-generated constructor stub

    super(name,age,sex);

    }

     

    public void drink() {

    // TODO Auto-generated method stub

    System.out.println(name+"正在應酬喝酒~");

    }

     

    public void throwup() {

    // TODO Auto-generated method stub

    System.out.println("他喝多吐了");

    }

     

    public void palyMad() {

    // TODO Auto-generated method stub

    System.out.println("這位"+sex+"公務員,名叫"+name+"喝多了,正在耍酒瘋~");

    }

     

    public void love() {

    // TODO Auto-generated method stub

    System.out.println("這位"+age+"的公務員正在和對面的女孩談戀愛~");

    }

     

    public void meeting(){

    System.out.println("公務員"+name+"在無聊的開會中~");

    }

     

    public String toString() {

    // TODO Auto-generated method stub

    return "公務員    [姓名:" + name + ", 年齡:" + age + ", 性別:" + sex

    + "]";

    }

    }

     

    Client情景測試類

    package studyDemo;

     

    public class Client {

     

    public static void main(String[] args) {

    System.out.println("學生模塊:");

    Student stu=new Student("西部開源","李芳",18,"女");

    stu.preLearn();

    stu.lessons();

    stu.reveiw();

    stu.chating();

    stu.love();

    System.out.println("__toString應用___________-");

    System.out.println(stu);

    System.out.println("**********************");

    System.out.println("公務員模塊:");

    Officer cer=new Officer("王磊",35,"男");

    cer.drink();

    cer.throwup();

    cer.palyMad();

    cer.meeting();

    cer.love();

    System.out.println("____toString應用____________-");

    System.out.println(cer);

    System.out.println("**********************");

    System.out.println("程序員模塊:");

    Programmer pro=new Programmer("馮超",24,"男");

    pro.preLearn();

    pro.lessons();

    pro.reveiw();

    pro.coding();

    pro.debuging();

    pro.love();

    System.out.println("______toString應用____________");

    System.out.println(pro);

    System.out.println("***********************");

    System.out.println("學生比較模塊:");

    System.out.println("________equals比較運用___________");

    Student stu1=new Student("西部開源","張三", 10,"男");

    Student stu2=new Student("西部開源","張三", 10,"男");

    Student stu3=new Student("西部開源","李四", 10,"男");

    Student stu4=new Student("西安交大","張三", 25,"男");

    stu1.equals(null);

    stu1.equals(pro);

    stu1.equals(stu1);

    boolean flag1=stu1.equals(stu2);

    if(flag1){

    System.out.println("學生1與學生2是同一人");

    }else{

    System.out.println("學生1與學生2不是同一人");

    }

    System.out.println(stu1.equals(stu3)?"學生1與學生3是同一人":"學生1與學生3不是同一人");

    System.out.println(stu1.equals(stu4)?"學生1與學生4是同一人":"學生1與學生4不是同一人");

    System.out.println(stu2.equals(stu3)?"學生2與學生3是同一人":"學生2與學生3不是同一人");

    System.out.println(stu2.equals(stu4)?"學生2與學生4是同一人":"學生2與學生4不是同一人");

    System.out.println(stu3.equals(stu4)?"學生3與學生4是同一人":"學生3與學生4不是同一人");

    System.out.println("************************");

    System.out.println("_______instanceof的應用________");

    System.out.println("——傳入爲空時——:");

    interfaceofDemo(null);

    System.out.println();

    System.out.println("——傳入爲學生時——:");

    interfaceofDemo(stu);

    System.out.println();

    System.out.println("——傳入爲程序員時——:");

    interfaceofDemo(pro);

    System.out.println();

    System.out.println("——傳入爲公務員時——:");

    interfaceofDemo(cer);

    System.out.println();

    System.out.println("————————————做 業 完 結——————————————————");

     

    }

    public static void interfaceofDemo(Person per){

    if(per==null ){

    System.out.println("傳入爲空:中止");

    return;

    }

    if(per instanceof Student){

    Student stu=(Student)per;

    stu.lessons();

    stu.preLearn();

    stu.reveiw();

    }

    if(per instanceof Programmer){

    Programmer pro=(Programmer)per;

    pro.coding();

    pro.debuging();

    }

    if(per instanceof Officer){

    Officer cer=(Officer)per;

    cer.meeting();

    }

    }

     

    }

     

    運行結果:

     

    學生模塊:

    李芳同窗正在預習中~~

    上課了李芳同窗上課去了

    上課完畢,回家複習~~

    西部開源的學生李芳和朋友聊微信中~~

    李芳是位女生今年18歲了,在和對面男生談戀愛~~

    __toString應用___________-

    學生    [姓名:李芳, 年齡:18, 性別:女]

    **********************

    公務員模塊:

    王磊正在應酬喝酒~

    他喝多吐了

    這位男公務員,名叫王磊喝多了,正在耍酒瘋~

    公務員王磊在無聊的開會中~

    這位35的公務員正在和對面的女孩談戀愛~

    ____toString應用____________-

    公務員    [姓名:王磊, 年齡:35, 性別:男]

    **********************

    程序員模塊:

    名爲馮超的程序員正在預習~

    馮超正在上課中~

    上課完畢,回家複習~

    馮超程序員特別喜歡寫代碼~

    馮超也喜歡修電腦Bug

    馮超是位男程序員,今年24歲正在和隔壁女孩談戀愛~

    ______toString應用____________

    程序員    [姓名:馮超, 年齡:24, 性別:男]

    ***********************

    學生比較模塊:

    ________equals比較運用___________

    $傳入參數爲null,沒法比較!

    $傳遞的不是學生對象!

    $學生本身比本身,固然是同一人!

    學生1與學生2是同一人

    學生1與學生3不是同一人

    學生1與學生4不是同一人

    學生2與學生3不是同一人

    學生2與學生4不是同一人

    學生3與學生4不是同一人

    ************************

    _______instanceof的應用________

    ——傳入爲空時——:

    傳入爲空:中止

     

    ——傳入爲學生時——:

    上課了李芳同窗上課去了

    李芳同窗正在預習中~~

    上課完畢,回家複習~~

     

    ——傳入爲程序員時——:

    馮超程序員特別喜歡寫代碼~

    馮超也喜歡修電腦Bug

     

    ——傳入爲公務員時——:

    公務員王磊在無聊的開會中~

     

    ————————————做 業 完 結—————————————————

    【總結完畢】

    2017.12.26(西開)

相關文章
相關標籤/搜索