Java編程基礎11——面向對象_包&權限修飾符&匿名內部類

1.package關鍵字的概述及做用(瞭解)

  • A:爲何要有包java

    • 將字節碼(.class)進行分類存放
    • 包其實就是文件夾
  • B:包的概述
  • 舉例:面試

    學生:增長,刪除,修改,查詢
    老師:增長,刪除,修改,查詢
    ...
    
    方案1:按照功能分
        com.heima.add
            AddStudent
            AddTeacher
        com.heima.delete
            DeleteStudent
            DeleteTeacher
        com.heima.update
            UpdateStudent
            UpdateTeacher
        com.heima.find
            FindStudent
            FindTeacher
    
    方案2:按照模塊分
        com.heima.teacher
            AddTeacher
            DeleteTeacher
            UpdateTeacher
            FindTeacher
        com.heima.student
            AddStudent
            DeleteStudent
            UpdateStudent
            FindStudent

2.包的定義及注意事項(掌握)

  • A:定義包的格式編程

    • package 包名;
    • 多級包用.分開便可
  • B:定義包的注意事項ide

    • A:package語句必須是程序的第一條可執行的代碼
    • B:package語句在一個java文件中只能有一個
    • C:若是沒有package,默認表示無包名
  • C:案例演示測試

    • 包的定義及注意事項

3.帶包的類編譯和運行(掌握)

  • A:如何編譯運行帶包的類this

    • a:javac編譯的時候帶上-d便可idea

      • javac -d . HelloWorld.java
    • b:經過java命令執行。code

      • java 包名.HellWord

4.不一樣包下類之間的訪問(掌握)

  • A:案例演示對象

    • 不一樣包下類之間的訪問
// 文件一
package net.allidea;
public class JavaObject {
    public static void main(String[] args) {
        com.baidu.Person p = new com.baidu.Person("張三",23);
        System.out.println(p.getName() + "..." + p.getAge());
    }
}

//文件二
package com.baidu;
public class Person {
    private String name;
    private int age;
    public Person(){}
    public Person(String name,int age) {
        this.name = name;
        this.age = age;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public int getAge() {
        return age;
    }
}

5.import關鍵字的概述和使用(掌握)

  • A:案例演示繼承

    • 爲何要有import

      • 其實就是讓有包的類對調用者可見,不用寫全類名了
  • B:導包格式

    • import 包名;
    • 注意:
    • 這種方式導入是到類的名稱。
    • 雖然能夠最後寫*,可是不建議。
  • C:package,import,class有沒有順序關係(面試題)

    package net.allidea;
    import com.baidu.Person;
    //import java.util.Scanner; //在開發中咱們用的都是導入具體的類
    import java.util.*;        //*表明通配符,他會到該包下挨個匹配,匹配上九導入
    public class JavaObject {
        public static void main(String[] args) {
            Person p = new Person("張三",23);
            System.out.println(p.getName() + "..." + p.getAge());
    
            //java.util.Scanner sc = new java.util.Scanner(System.in);
            Scanner sc = new Scanner(System.in);
            int x = sc.nextInt();
            System.out.println(x);
        }
    }

6.四種權限修飾符的測試(掌握)

  • A:案例演示

    • 四種權限修飾符
  • B:結論
本類 同一個包下(子類和無關類) 不一樣包下(子類) 不一樣包下(無關類)
private Y
默認 Y Y
protected Y Y Y
public Y Y Y Y

7.類及其組成所使用的常見修飾符(掌握)

  • A:修飾符:

    • 權限修飾符:private,默認的,protected,public
    • 狀態修飾符:static,final
    • 抽象修飾符:abstract
  • B:類:

    • 權限修飾符:默認修飾符,public
    • 狀態修飾符:final
    • 抽象修飾符:abstract
    • 用的最多的就是:public
  • C:成員變量:

    • 權限修飾符:private,默認的,protected,public
    • 狀態修飾符:static,final
    • 用的最多的就是:private
  • D:構造方法:

    • 權限修飾符:private,默認的,protected,public
    • 用的最多的就是:public
  • E:成員方法:

    • 權限修飾符:private,默認的,protected,public
    • 狀態修飾符:static,final
    • 抽象修飾符:abstract
    • 用的最多的就是:public
  • F:除此之外的組合規則:

    • 成員變量:public static final 接口
    • 成員方法:

      • public static
      • public abstract
      • public final

8.內部類概述和訪問特色(瞭解)

  • A:內部類概述
  • B:內部類訪問特色

    • a:內部類能夠直接訪問外部類的成員,包括私有。
    • b:外部類要訪問內部類的成員,必須建立對象。
    • 外部類名.內部類名 對象名 = 外部類對象.內部類對象;
  • C:案例演示

    • 內部類極其訪問特色
class JavaObject {
    public static void main(String [] args) {
        Outer.Inner oi = new Outer().new Inner();
        oi.method();
     }
}
class Outer {
    private int num = 10;
    class Inner {
        public void method() {
            System.out.println(num);
        }
    }
}

9.成員內部類私有使用private(瞭解)

class JavaObject {
    public static void main(String [] args) {
        //Outer.Inner oi = new Outer().new Inner();
        //oi.method();

        Outer o = new Outer();
        o.print();
     }
}
class Outer {
    private int num = 10;
    private class Inner {
        public void method() {
            System.out.println(num);
        }
    }
    public void print() {
        Inner i = new Inner();
        i.method();
    }
}

10.靜態成員內部類(瞭解)

  • static
  • B:成員內部類被靜態修飾後的訪問方式是:

    • 外部類名.內部類名 對象名 = 外部類名.內部類對象;
class JavaObject {
    public static void main(String [] args) {
        //外部類名.內部類名 對象名 = 外部類名.內部類對象;Outer.new Inner();
        Outer.Inner oi = new Outer.Inner();
        oi.method();
        Outer.Inner2.print();
     }
}
class Outer {
    static class Inner {
        public void method() {
            System.out.println("method");
        }
    }
    static class Inner2{
        public static void print() {
            System.out.println("print");
        }
    }
}

11.成員內部類的面試題(掌握)

  • A:面試題
  • 要求:使用已知的變量,在控制檯輸出30,20,10。
    //內部類之因此能獲取外部類的成員,是由於它能獲取到外部類的引用外部類名.this

    class JavaObject {
        public static void main(String [] args) {
            Outer.Inner oi = new Outer().new Inner();
            oi.show();
         }
    }
    class Outer {
        public int num = 10;
        class Inner {
            public int num = 20;
            public void show() {
                int num = 30;
                System.out.println(num);
                System.out.println(this.num);
                System.out.println(Outer.this.num);
            }
        }
    }

12.局部內部類訪問局部變量的問題(掌握)

  • A:案例演示

    • 局部內部類訪問局部變量必須用final修飾
    • 局部內部類在訪問他所在方法中的局部變量必須用final修飾,爲何?
      由於當調用這個方法時,局部變量若是沒有用final修飾,他的生命週期和方法的生命週期是同樣的,當方法彈棧,這個局部變量也會消失,那麼若是局部內部類對象尚未立刻消失想用這個局部變量,就沒有了,若是用final修飾會在類加載的時候進入常量池,即便方法彈棧,常量池的常量還在,也能夠繼續使用

      可是jdk1.8取消了這個事情,因此我認爲這是個bug,雖然取消,若是在書寫代碼時候,沒有手動添加,系統底層也會默給你final

class JavaObject {
    public static void main(String [] args) {
        Outer o = new Outer();
        o.method();
     }
}
//開發中不多用
class Outer {
    public void method() {
        final int num = 10;
        class Inner {
            public void print() {
                System.out.println(num);
            }
        }
        Inner i = new Inner();
        i.print();
    }
    /*public void run() {
        Inner i = new Inner();//局部內部類,只能在其方法內有效
        i.print();
    }*/
}

13.匿名內部類的格式和理解

  • A:匿名內部類

    • 就是內部類的簡化寫法。
  • B:前提:存在一個類或者接口

    • 這裏的類能夠是具體類也能夠是抽象類。
  • C:格式:
  • new 類名或者接口名(){
        重寫方法;
    }
  • D:本質是什麼呢?

    • 是一個繼承了該類或者實現了該接口的子類匿名對象。
  • E:案例演示

    • 按照要求來一個匿名內部類
class JavaObject {
    public static void main(String [] args) {
        Outer o = new Outer();
        o.method();
     }
}
interface  Inter {
    public void print();
}
class Outer {
    class Inner implements Inter {
        public void print() {
            System.out.println("print");
        }
    }
    public void method() {
        //Inner i = new Inner();
        //i.print();
        //new Inner().print();
        new Inter() {            //實現Inter接口new Inter() {}
            public void print() {        //重寫抽象方法
                System.out.println("print");
            }                
        }.print();
    }
}

14.匿名內部類重寫多個方法調用

  • A:案例演示

    • 匿名內部類的方法調用
class JavaObject {
    public static void main(String [] args) {
        Outer o = new Outer();
        o.method();
     }
}
interface  Inter {
    public void show1();
    public void show2();
}
//匿名內部類只針對重寫一個方法的時候使用
class Outer {
    public void method() {
        /*new Inter() {
            public void show1() {
                System.out.println("show1");
            }
            public void show2() {
                System.out.println("show2");
            }
        }.show1();
        new Inter() {
            public void show1() {
                System.out.println("show1");
            }
            public void show2() {
                System.out.println("show2");
            }
        }.show2();*/

        Inter i = new Inter() {
            public void show1() {
                System.out.println("show1");
            }
            public void show2() {
                System.out.println("show2");
            }
            /*public void show3() {
                System.out.println("show3");
            }*/
        };
        i.show1();
        i.show2();
        //i.show3();        //匿名內部類是不能向下轉型的,,由於沒有子類類名
    }
}

15.匿名內部類在開發中的應用

//這裏寫抽象類,接口都行
    abstract class Person {
        public abstract void show();
    }

    class PersonDemo {
        public void method(Person p) {
            p.show();
        }
    }

    class PersonTest {
        public static void main(String[] args) {
            //如何調用PersonDemo中的method方法呢?
            PersonDemo pd = new PersonDemo ();
            
        }
    }

class JavaObject {
    public static void main(String [] args) {
        //如何調用PersonDemo中的method方法呢?
        PersonDemo pd = new PersonDemo ();
        //pd.method(new Student());
        pd.method(new Person() {            //匿名內部類看成參數傳遞(本質把匿名內部類看做一個對象)
            public void show() {
                System.out.println("show");
            }
        });
     }
}
abstract class Person {        //抽象類
    public abstract void show();
}
class PersonDemo {
    //public void method(Person p) {            //new Person(); //Person p = new Student();
    /*
    Person p = new Person() {                //父類引用指向子類對象
        public void show() {
            System.out.println("show");
        }
    }
    */
    public void method(Person p) {
        p.show();
    }
}
class Student extends Person {
    public void show() {
        System.out.print("show");
    }
}

16.匿名內部類的面試題

  • A:面試題
  • 補齊代碼,要求在控制檯輸出」HelloWorld」

    interface Inter { void show(); }
    class Outer { //補齊代碼 }
    class OuterDemo {

    public static void main(String[] args) {
          Outer.method().show();
      }

    }


class JavaObject {
    public static void main(String [] args) {
        //Outer.method().show();        //鏈式編程,每次調用方法後還能繼續調用方法,證實調用方法返回的是對象
        Inter i = Outer.method();
        i.show();
     }
}
interface Inter { 
    void show(); 
}
class Outer { 
    //補齊代碼 
    public static Inter method() {
        return new Inter() {
            public void show() {
                System.out.println("HelloWorld");
            }
        };
    }
}
相關文章
相關標籤/搜索