2019-08-10 Day 11 java學習5

知識點

創(chuàng)建一個對象之前需要做點準備工作
1.構造方法
2.靜態(tài)變量
3.靜態(tài)方法 必須主動調用才執(zhí)行

代碼塊:

在對象創(chuàng)建之前就有限會被調用
類里面可以有多個代碼塊
執(zhí)行順序和出現的先后順序相同
盡量不要在類里面寫多個代碼塊
修飾符(可以沒有,有就是static) {
預先執(zhí)行的內容
}

位置 作用
局部代碼塊 main里 給變量限定生命周期,局部代碼塊的變量在執(zhí)行結束后會被java回收
構造代碼塊 類的成員位置 在每次執(zhí)行構造方法前先執(zhí)行構造代碼塊,可以將多個構造方法中的相同代碼放到構造代碼塊中,對對象進行初始化
靜態(tài)代碼塊 類的成員位置 一般用于給類初始化,被靜態(tài)修飾的代碼塊僅執(zhí)行一次

內部類

定義一個類可以在多個地方定義
1.單獨創(chuàng)建一個文件管理一個類
2.直接在文件里面 類A的上面和下面創(chuàng)建
3.直接在某個類A內部創(chuàng)建一個類
一個類A依附于另一個類B

封裝

  • 類來封裝屬性和方法
  • 訪問權限Private public protected

繼承

  • A extends A就是B的子類 B就是A的父類
  • 獲得父類的方法和屬性 并且需要添加自己的屬性和方法
  • Java只能單繼承但可以變相多繼承:A繼承B,B繼承C,A繼承B與C
  • 所有的類都是直接或者間接繼承于Object類
  • 當調用子類的一個方法時,如果沒有就會到父類里面去查找
  • 如果在子類里面需要調用父類的方法或者顯示調用父類的屬性和方法就使用 super
  • 需要在一個方法里面調用super的對應方法的情況
    1.父類做完之后,子類再操作
    2.子類做點事情之后 再調用父類去完成
    如果一個方法需要完成一個功能又不能單獨完成,必須要父類做相應的工作
    如果子類里面需要實現父類的方法 就需要重寫
    @override
  • 如果父類有自定義構造方法
  • 子類的構造方法里面必修顯示調用父類的構造方法
  • 如果父類有內部類,子類中有同名內部類,那么父類中的內部類就被屏蔽了
  • 如果非要使用父類中的內部類只能使用全類名

多態(tài)

1.同一個方法 多種實現=在不同的子類中有不同的實現
2.如果有繼承關系:子類的對象可以使用父類變量接收

技術

instanceof運算符用于測試構造函數的prototype屬性是否出現在對象的原型鏈中的任何位置

技術的使用

代碼塊

class Person{
    int age;
    {
        age = 30;
        System.out.println("代碼塊 age="+age);
    }
    //靜態(tài)代碼塊
    {
       // age = 20; 靜態(tài)代碼塊里不能調用成員變量和實例方法
        System.out.println("代碼塊 age");
    }
    public Person(){
        System.out.println("無參構造方法 age="+age);
    }
    public Person(int age){
        this.age = age;
        System.out.println("有參構造方法 ");
    }
}

內部類

class RelativeLayout{
    String view;
    //在顯示一個視圖前 必須告訴系統(tǒng)這個視圖的位置
    public void  show(LayoutParams layout){
        System.out.println("視圖"+view+"顯示出來了");
        System.out.println("left:"+layout.leftMergin+"top:"+layout.topMergin+"right:"+layout.rightMergin+"botton:"+layout.bottemMergin);
    }
    //定義一個內部類用于管理相對布局的具體布局屬性
    static class LayoutParams{
        float leftMergin;
        float topMergin;
        float rightMergin;
        float bottemMergin;

        public   LayoutParams(float leftMergin,float topMergin,float rightMergin,float bottemMergin){
            this.leftMergin = leftMergin;
            this.topMergin = topMergin;
            this.rightMergin = rightMergin;
            this.bottemMergin = bottemMergin;
        }
    }

}

class testLayout{
    public static void main(String[] args){
        //創(chuàng)建一個相對布局 容器視圖
        RelativeLayout r1 = new RelativeLayout();

        r1.view ="分享按鈕";

        //顯示這個視圖
        //準備好這個視圖的布局屬性
        //1.
        //RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(20,20, r1.show(params);
        //使用匿名對象 只要使用一次
        r1.show(new RelativeLayout.LayoutParams(20,20,20,20));
        TestInner ti = new TestInner();
        ti.test();

    }
}
class TestInner{
    int a;
    int b;
    Inner inner;
    class Inner{
        //費靜態(tài)的內部類可以訪問外部類的屬性和方法
        public Inner(){
            a = 20;
            b = 30;
            show();
        }
    }
    public  void test(){
        inner = new Inner();
    }
    public  void show(){
        System.out.println("a = "+a+"  b = "+b);
    }
}

繼承

class Person1{
    String name;
    int age;
    public Person1(String name,int age){
        this.name = name;
        this.age = age;
    }
    public void walk(){
        System.out.println(name + ":走路");
    }
    public void  eat(){
        System.out.println(name + ":吃飯");
    }
    public class inners{
        public void show(){
            System.out.println("Person1 inner");
        }
    }
}

class Student extends Person1{
    int id;
    String school;
    inners i;//說明內部類也可以被繼承
    public class inners{
        public void show(){
            System.out.println("Person1 inner");
        }
    }
    public Student(String name,int age,int id,String school){
      super(name,age);
        this.id = id;
        this.school = school;
    }
    public void show(){
        System.out.println("name:"+name);
    }

    //方法的重寫

    @Override
    public void walk() {
        //super.walk();
       System.out.println("快走");
    }

    @Override
    public void eat() {
        System.out.println("快吃");
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", id=" + id +
                ", school='" + school + '\'' +
                '}';
    }
}

class TestExtends{
    public static void main(String[] args){
        /**Student xw = new Student();
        xw.name = "小王";
        xw.age = 20;
        xw.id = 001;
        xw.school = "斯坦福";*/
        Student xw = new Student("小王",20,001,"斯坦福");
        //xw.show();
        xw.walk();
        xw.eat();
        System.out.println(xw);
        C testc =  new C();
        A testc2 = new C();
        testc2.info();
    }
}

多態(tài)

class A{
    public void  info(){
        System.out.println("in A");
    }
}


class B extends A{
    @Override
    public void info() {
        System.out.println("in B");
    }
}class C extends A{
    @Override
    public void info() {
        System.out.println("in C");
    }
}

instanceof運算符

if(p instanceof CivilServant)//判斷P是否在CivilServant內
            {

            }

技術的實際使用

要求:
定義一個Person類:name age
提供有參數的構造方法
walk方法
eat方法
公務員:salary ,看雜志數量,show
公司職員:salary, tec show
創(chuàng)建多個職員和公務員 放到一個數組里面輸出
將數組里面所有人的信息輸出

實現:

public class Person {
    String name;
    int age;
    public void walk(String name){
        this.name = name;
        System.out.println(name+"走路");
    }
    public void eat(String name){
        this.name = name;
        System.out.println(name+"吃飯");
    }
}
class CivilServant extends Person {
    int Salary;
    int Reading;
    public CivilServant(String name,int age,int Salary,int Reading){
        this.name = name;
        this.age = age;
        this.Salary = Salary;
        this.Reading = Reading;
    }
    public void walk(){
        System.out.println(name+"慢慢走");
    }
    public void eat(){
        this.name = name;
        System.out.println(name+"慢慢吃");
    }
    public void show(){
        this.Salary = Salary;
        this.Reading = Reading;
        System.out.println("姓名:"+name);
        System.out.println("年齡:"+age);
        System.out.println("工資:"+Salary);
        System.out.println("閱讀量:"+Reading);
    }

}

 class Staff extends Person {
    int Salary;
    String Tec;
    public Staff(String name,int age,int Salary,String Tec){
        this.name = name;
        this.age = age;
        this.Salary = Salary;
        this.Tec = Tec;
    }
    public void walk() {
        //super.walk();
        System.out.println("快走");
    }
    public void eat(){
        this.name = name;
        System.out.println(name+"快吃");
    }
    public void show(){
        this.Salary = Salary;
        this.Tec = Tec;
        System.out.println("姓名:"+name);
        System.out.println("年齡:"+age);
        System.out.println("工資:"+Salary);
        System.out.println("技術:"+Tec);
    }

}

import java.util.ArrayList;

public class Output {
    public static void main(String[] args){
        ArrayList<Person> peoples = new ArrayList<>();
        Person c1 = new CivilServant("J",20,8000,10);
        Person c2 = new CivilServant("K",25,9000,15);
        peoples.add(c1);
        peoples.add(c2);

        Person s1 = new Staff("Z",20,15000,"C");
        Person s2 = new Staff("Y",25,25000,"C++");
        peoples.add(s1);
        peoples.add(s2);

        for(Person p: peoples){
            if(p instanceof CivilServant)
            {
                CivilServant c = (CivilServant)p;
                c.show();
                System.out.println();
            }
            else{
                Staff s = (Staff)p;
                s.show();
                System.out.println();
            }
        }
    }
}

隨筆

果然,寫小型demo還是要輕松得多。大型demo先不說繞去繞來的各種循環(huán)或者判斷,光是數不清的變量就足夠讓我頭大了,就像夏洛特煩惱的經典場景 馬什么冬梅一樣,先前的定義的變量,到后面再次調用,需要調用的啥?調用的是哪一個....確實是一個讓人禿頭的問題

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學習記錄文檔,今天18年5月份再次想寫文章,發(fā)現簡書還為我保存起的...
    Jenaral閱讀 3,144評論 2 9
  • 整理來自互聯網 1,JDK:Java Development Kit,java的開發(fā)和運行環(huán)境,java的開發(fā)工具...
    Ncompass閱讀 1,618評論 0 6
  • 一:java概述: 1,JDK:Java Development Kit,java的開發(fā)和運行環(huán)境,java的開發(fā)...
    慕容小偉閱讀 1,946評論 0 10
  • 一:java概述:1,JDK:Java Development Kit,java的開發(fā)和運行環(huán)境,java的開發(fā)工...
    ZaneInTheSun閱讀 2,815評論 0 11
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,667評論 1 32

友情鏈接更多精彩內容