java基礎二:面向對象

面向對象概念

類:類是一個模板,表示一類事物的行爲和狀態
對象:對象是類的一個實例,有本身狀態和行爲
類是對象的抽象,而對象是類的具體實例。java

class Person{
    public String name;
    public int age;
    public static int legs=2;
    Person(String name,int age){
        this.name=name;
        this.age=age;
    }
    public void eat(){
        System.out.println("吃飯");
    }
}
------------
Person zhangsan=new Person("張三",21);
Person lisi=new Person("李四",22);
複製代碼

Person是類 類中有name和age屬性默認是空的 行爲方法:eat
zhangsan和lisi分別是Person的一個具體的類,有本身的name和age,和類的行爲方法eat編程

構造方法

顧名思義,非普通方法,具備構造功能,經過此方法能夠構造對象bash

構造方法的方法名必須與類名同樣。 
構造方法沒有返回類型,也不能定義爲void,在方法名前面不聲明方法類型。  
構造方法主要做用是完成對象的初始化工做,他可以把定義對象時的參數傳遞給對象的域。  
構造方法不能由編程人員調用,而要系統調用。  
構造方法能夠重載,以參數的個數,類型,或排序順序區分。
當咱們使用new Person("張三",21)時,實際上系統會自動調用 Person(String name,int age)構造方法
複製代碼

全部的構造方法,都要直接或者間接的調用父類的構造方法,由於先有父類纔會有子類。
Object是全部類的直接或間接父類。上面的構造方法實際會隱式調用super() 即Obejct的空參數構造方法ide

Person(String name,int age){
        super();//隱式調用
        this.name=name;
        this.age=age;
    }

複製代碼

類屬性和對象屬性

由static修飾的屬性即類屬性,沒有static修飾即對象屬性
類屬性,能夠經過 類.屬性名 來引用 也可使用 對象.屬性名 來引用不過推薦
對象屬性 必須經過 對象.屬性名 來引用this

Person zhangsan=new Person("張三",21);
Person lisi=new Person("李四",22);
zhangsan.age=30;//並不會影響李四的age
System.out.println(lisi.age);// 22
//Person有一個屬性 public static int legs=2; 兩隻腿
zhangsan.legs=1;
//修改張三的腿數量 李四的一樣會變 爲避免沒必要要的麻煩,通常使用Person.legs來引用
System.out.prinln(lisi.legs);//1 

複製代碼

類方法和對象方法

同屬性同樣,由static修飾的即類方法,沒有則普通方法
類方法,能夠經過 類.方法名 來引用 也可使用 對象.方法名 來引用不過推薦
對象方法 必須經過 對象.方法名 來引用spa

繼承和實現

子類是父類的一種,子類具備父類的屬性和方法,同時還具有本身的屬性和方法
子類是經過extends來實現的,java中只支持單繼承。父類能夠是通常類或者是抽象類,經過final修飾的類,不能被繼承
抽象類:一種特殊的類,類中能夠有抽象方法,抽象類不可被實例化code

public abstract class Anim{
    public abstract void eat();//抽象方法
}
複製代碼

注:抽象類也能夠沒有抽象方法,惟一的做用是不讓類被實例化對象

接口:一種特殊的抽象類排序

public interface Lived{
    void living();
}
複製代碼

接口中全部的方法都是抽象的而且是public的,全部的成員都是常量。從java8.0開始接口中能夠定義默認方法 默認方法子類不須要實現
實現接口經過implements 來實現,java中支持多實現。繼承

public class Person extends Anim implements Lived{
   @Override
   public void living(){
        System.out.println("羣居生活");
    }
   @Override
    public void eat(){
        System.out.println("天天吃三頓");
    }
}
複製代碼

一個類若是不是抽象的,必須實現全部接口的所有方法和父類的所有抽象方法

方法的重寫和重載

重寫:覆蓋父類的方法,定義本身的實現。方法名,方法參數,返回值必須相同。子類方法的權限範圍不能小於父類
重載:相同的方法,不一樣的參數。方法名相同,返回值能夠不一樣。範圍修飾符能夠不一樣
重寫只有父子類纔會發生的。 重載能夠在一個類 也能夠在父子類

對象初始化流程

public class Test2 {
    public static void main(String[] args) {
        B b = new B();
        System.out.println("-------------------------");
        b = new B();
    }
    static class A {
        public String content = "AA";
        public static String text = "父類的Text";
        {
            System.out.println("父類代碼塊");
        }
        static {
            System.out.println("父類靜態代碼塊");
        }
        A() {
            System.out.println("父類構造方法");
        }
    }
    public static class B extends A {
        public String con = "BB";
        public static String textA = "子類的Text";
        {
            System.out.println("子類代碼塊");
        }
        static {
            System.out.println("子類靜態代碼塊");
        }
        B() {
            System.out.println("子類構造方法");
        }
    }
}
複製代碼

父類靜態代碼塊
子類靜態代碼塊
父類代碼塊
父類構造方法
子類代碼塊
子類構造方法
------------------------- 父類代碼塊
父類構造方法
子類代碼塊
子類構造方法

對象的初始化流程: 第一次建立對象
1.父類的靜態變量和靜態代碼塊
2.子類的靜態變量和靜態代碼塊
3.父類的普通變量和代碼塊
4.父類的構造方法
5.子類的廣泛變量和代碼塊
6.子類的構造方法
第二次建立對象
1.父類的普通變量和代碼塊
2.父類的構造方法
3.子類的廣泛變量和代碼塊
4.子類的構造方法

多態

父類引用指向子類對象,即同一類的引用能夠表現不一樣行爲。
例如:人繼承動物
人能夠指向動物 即人對象指向動物引用,反過來講則不合適,動物不能指向人,由於動物不僅是人。

public class Manager {
    public static void main(String[] args) {
        Anim anim = new Anim();
        System.out.println("anim--->name:" + anim.name);
        System.out.println("anim--->age:" + anim.age);
        anim.eat();
        anim.wan();
        System.out.println("----------------------");
        Anim pig = new Pig();
        System.out.println("pig--->name:" + pig.name);
        System.out.println("pig--->age:" + pig.age);
        pig.eat();
        pig.wan();
        System.out.println("----------------------");
        Anim dog = new Dog();
        System.out.println("dog--->name:" + dog.name);
        System.out.println("dog--->age:" + dog.age);
        dog.eat();
        dog.wan();
        System.out.println("----------------------");
        Dog dog2= (Dog) dog;
        System.out.println("dog--->name:" + dog2.name);
        System.out.println("dog--->age:" + dog2.age);
        dog2.eat();
        dog2.wan();
        dog2.sleep();
    }
    static class Anim {
        public String name = "動物";
        public static int age = 0;
        public void eat() {
            System.out.println("動物的eat方法");
        }
        public static void wan() {
            System.out.println("動物的靜態 玩方法");
        }
    }
    static class Pig extends Anim {
        public String name = "小豬";
        public static int age = 5;
        @Override
        public void eat() {
            System.out.println("小豬的eat方法");
        }
        public static void wan() {
            System.out.println("小豬的靜態 玩方法");
        }
    }
    static class Dog extends Anim {
        public String name = "小狗";
        public static int age = 3;
        @Override
        public void eat() {
            System.out.println("小狗的eat方法");
        }
        public static void wan() {
            System.out.println("小狗的靜態 玩方法");
        }
        public void sleep(){
            System.out.println("小狗的 sleep方法");
        }
    }
}
複製代碼

輸出結果:

anim--->name:動物
anim--->age:0
動物的eat方法
動物的靜態 玩方法
----------------------
pig--->name:動物
pig--->age:0
小豬的eat方法
動物的靜態 玩方法
----------------------
dog--->name:動物
dog--->age:0
小狗的eat方法
動物的靜態 玩方法
----------------------
dog--->name:小狗
dog--->age:3
小狗的eat方法
小狗的靜態 玩方法
小狗的 sleep方法
複製代碼

由上面代碼運行結果可見: 普通變量,靜態變量,靜態方法看 左側 普通方法 看右側 父類引用指向子類對象,不能調用子類中聲明而父類中沒有聲明的方法和變量

相關文章
相關標籤/搜索