javaSE面向對象編程

面向對象編程

構造器

構造器就是和類名相同但無返回類型的方法。

public class Person {
    //一個類即使什麼都不寫,它也會存在一個方法
    //顯示的定義構造器

    String name;

    //實例化初始值
    //1.使用new關鍵字,本質是在調用構造器
    //2.用來初始化值
    public Person(){
    }

    //有參構造:一旦定義了有參構造,無參構造就必須顯示定義
    public Person(String name){
        this.name = name;
    }

    //alt+insert自動生成構造器
    /*
    public static void main(String[] args) {

        Person person = new Person("Avirus");
        System.out.println(person.name);

    }
    構造器:
        1.和類名相同
        2.沒用返回值
    作用:
        1.new本質在調用構造方法
        2.初始化對象的值
    注意點:
        1.定義有參構造之後,如果想使用無參構造,就要顯示定義一個無參構造
     */
} 

無參構造器

public class Pet {
    public String name;
    public int age;

    //無參構造
    public void shout(){
        System.out.println("叫了一聲");
    }

    /*
    1.類與對象
        類是一個模板:抽象,對象是一個具體的實例

    2.方法
        定義,調用!

    3.對應的引用
        引用類型:   基本類型(8)
        對象是通過引用來操作的: 棧-->堆

    4.屬性:欄位Field 成員變數
        默認初始化:
            數字:0    0.0
            char:u0000
            boolean:false
            引用:null

    5.對象的創建和使用
        -必須使用new 關鍵字創造對象,構造器 Person Avirus = new Person();
        -對象的屬性  Avirus.name
        -對象的方法  Avirus.sleep();
     */
}       

如何訪問私有屬性

package oop.Demo04;

/*
1.提高了程式的安全性,保護數據
2.隱藏程式碼的實現細節
3.統一介面
4.系統可維護性增加了
 */

public class Student {

    //屬性私有
    private String name; //姓名
    private int id; //學號
    private char sex; //性別

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if(age > 120 || age < 0){
            System.out.println("不合法");
        }else {
            this.age = age;
        }
    }

    private int age;

    //提供一些可以操作這個屬性的方法!
    //提供一些public的get,set方法

    //get獲取這個數據
    public String getName(){
        return this.name;
    }

    //set給這個數據設置值
    public void setName(String name){
        this.name = name;
    }
    //alt + insert
}

封裝

  • 該露的露,該藏得藏
    • 我們程式設計要追求”高內聚,低耦合”.高內聚就說類得內部數據操作細節自己完成,不允許外部干涉;低耦合:僅暴露少量方法給外部使用
  • 封裝(數據得隱藏)
    • 通常,應禁止直接訪問一個對象中數據得實際表示,而應通過操作介面來訪問,這稱為資訊隱藏.
  • 記住一句話:屬性私有,get/set
package oop.Demo04;

/*
1.提高了程式的安全性,保護數據
2.隱藏程式碼的實現細節
3.統一介面
4.系統可維護性增加了
 */

public class Student {

    //屬性私有
    private String name; //姓名
    private int id; //學號
    private char sex; //性別

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if(age > 120 || age < 0){
            System.out.println("不合法");
        }else {
            this.age = age;
        }
    }

    private int age;

    //提供一些可以操作這個屬性的方法!
    //提供一些public的get,set方法

    //get獲取這個數據
    public String getName(){
        return this.name;
    }

    //set給這個數據設置值
    public void setName(String name){
        this.name = name;
    }
    //alt + insert
}

繼承

  • 繼承得本質是堆某一批類得抽象,從而實現對現實世界更好得建模

  • extends得意思是”擴展”.子類是父類得擴展

  • Java中類只有單繼承,沒有多繼承!

  • 繼承是類和類之間得一直關係.除此之外,類和類之間得關係還有依賴,組合,聚合等.

  • 繼承關係得兩個類,一個為子類(派生類),一個為父類(基類).子類繼承父類,使用關鍵字extands來表示

  • 子類和父類之間,從意義上講應該具有”is a”得關係

  • object類

  • super

  • 方法重寫

//所有類都繼承了Object類
public class Person {
    //private
    //protected
    //public
    private int money = 10000000;


    public int getMoney() {
        return money;
    }

    public void setMoney(int money) {
        this.money = money;
    }

    public void say(){
        System.out.println("說了一句話");
    }
}
public class Student extends Person{
    
}

繼承了父類得子類,可以使用父類中得方法

public class Application {
    public static void main(String[] args) {
        Student student = new Student();
        student.say();
    }
}

這個地方值得注意的是被final關鍵字修飾的類,就不能被繼承

super

super關鍵字是用來調用父類的屬性和方法

public class Student extends Person{
    private String name = "test";

    public Student() {
        //隱藏程式碼super();
        super();//調用父類得構造器,必須在子類得第一行
        System.out.println("Student無參執行");
    }

    public void test(String name) {
        System.out.println(name);
        System.out.println(this.name);
        System.out.println(super.name);
    }
    public void test1() {
        print();
        this.print();
        super.print();
    }
    public void print(){
        System.out.println("Student");
    }
}

super注意點

super注意點:
    1.super調用父類得構造器方法,必須在構造器方法得第一個
    2.super必須只能出現在子類得方法或者構造方法中!
    3.super和this不能同時調用構造方法!


Vs this:
    代表得對象不同:
        this: 本身調用這個對象
        super: 代表父類對象得應用

    前提
        this:沒用繼承也可以使用
        super:只能在繼承條件下使用

    構造方法
        this():本類的構造
        super():父類的構造
        
在子類如果想調用父類的無參構造器時,父類要寫無參構造器,子類也可以直接調用父類的有參構造,在super裡面直接加參數.
如果父類裡面只有有參構造器,而沒有無參構造器,子類無法調用父類的無參構造器

方法重寫

//重寫是方法的重寫,與屬性無關
public class B {
    //靜態方法和非靜態方法區別很大
        //方法的調用之後,左邊定義的數據類型有關

    //非靜態:重寫
    public void test(){
        System.out.println("B-->test()");
    }
}
重寫:需要在繼承關係,子類重寫父類的方法!
    1.方法名必須相同
    2.參數列表必須相同
    3.修飾符:範圍可以擴大,但不可以縮小:public>protected>default>private
    4.拋出的異常:範圍可以縮小,但是不能擴大
是在非靜態方法下的
重寫,子類的方法和父類必須要一致,方法體不同!
    1.父類的功能,子類不一定需要,也不一定滿足
    alt+insert: override
    
在自動生成的重寫方法上面會有一個註解

多態

  • 即同一方法可以根據發送對象的不同而採用多種不同的行為方式。

  • 一個對象的實際類型是確定的,但可以指向對象的引用的類型有很多

  • 多態存在的條件

    • 有繼承關係
    • 子類重寫父類方法
    • 父類引用指向子類對象
  • 注意:多態是方法的多態,屬性沒有多態性。

  • instanceof:是用來判斷兩個類是否有聯繫的

/*
多態注意事項:
1.  多態是方法的多態,屬性沒用多態
2.  父類和子類,有聯繫,沒有聯繫會類型轉換異常! ClassCastException!
3.  存在條件: 繼承關係,方法需要重寫,父類引用指向子類對象! Father f1 = new Son();

    1.static 方法,屬於類,它不屬於實例
    2.final 常量
    3.private方法





//一個對象的實際類型是確定的

        //可以指向的引用類型就不確定了: 父類的引用指向子類

        //子類 能調用的方法都是自己的或者繼承父類的!
        Student s1 = new Student();
        //父類 可以指向子類,但是不能調用子類獨有的方法
        Person s2 = new Student();
        Object s3 = new Student();

        //對象能執行哪些方法,主要看對象右邊的類型,和右邊關係不大
        s2.run(); //子類重寫了父類的方法,執行子類的方法
        s1.run();
 */

類型轉換

/*
1.父類引用指向子類的對象
2.把子類轉換為父類,向上轉型
3.把父類轉換為子類,向下轉型,強制轉換,可能會丟失一些方法(說的是丟失子類特殊的方法)
4.方便方法的調用,減少重複的程式碼
*/
/*//類型之間的轉換: 父      子

        //高                     低


        //student將這個對象轉換為Student類型,我們就可以使用Student類型的方法了!


        //子類轉換為父類,可能丟失自己的本來的一些方法!
        Student student = new Student();
        student.go();*/

static關鍵字

被static修飾過之後,與類一起載入,所以被第一個調用

public class Teacher {

    //2 賦初始值
    {
        System.out.println("匿名程式碼塊");
    }
    //1 只執行一次
    static {
        System.out.println("靜態程式碼塊");
    }
    //3
    public Teacher(){
        System.out.println("構造程式碼塊");
    }

    public static void main(String[] args) {
        Teacher teacher = new Teacher();
        System.out.println("===================");
        Teacher teacher2 = new Teacher();
    }
}

靜態導入包

//靜態導入包
import static java.lang.Math.random;
import static java.lang.Math.PI;

public class Test {
    public static void main(String[] args) {
        System.out.println(random());
        System.out.println(PI);
    }
}

抽象類

  • abstract修飾符可以用來修飾方法也可以修飾類,如果修飾方法,那麼該方法就是抽象方法;如果修飾類,那麼該類就是抽象類。
  • 抽象類中可以沒有抽象方法,但是有抽象方法的類一定要聲明為抽象類。
  • 抽象類,不能使用new關鍵字來創建對象,它是用來讓子類繼承的。
  • 抽象方法,只有方法的聲明,沒有方法的實現,它是用來讓子類實現的。
  • 子類繼承抽象類,那麼就必須要實現抽象類沒有實現的抽象方法,否則該子類也要聲明為抽象類。
//抽象類的所有方法,繼承了它的子類,都必須要實現它的方法  除非它自己也是一個抽象類
public class A extends Action{
    @Override
    public void doSomething() {

    }
}
//abstract抽象類  單繼承           {介面可以多繼承}
public abstract class Action {

    //約束~有人幫我們實現~
    //abstract ,抽象方法 ,只有方法名,沒用方法的實現
    public abstract void doSomething();

    //1.不能new這個抽象類,只能靠子類區實現它:約束!
    public void hello(){
        
    }//抽象類中有普通方法是可以的
    //2.抽象類中可以寫普通的方法
    //3.抽象方法必須在抽象類中
    //抽象的抽象:約束

    //思考? new,存在構造器么?
    //抽象類是存在構造器的,不然子類無法重寫方法
            //存在的意義     抽象出來~提高開發效率
}

介面

  • 普通類:只有具體實現
  • 抽象類:具體實現和規範(抽象方法)都有!
  • 介面:只有規範!自己無法寫方法專業的約束!約束和實現分離:面向介面編程
  • 介面就是規範,定義的是- -組規則,體現了現實世界中「如果你…則必須能..的思想。如果你是天使,
    則必須能飛。如果你是汽車,則必須能跑。如果你好人,則必須幹掉壞人;如果你是壞人,則必須欺負好人。
  • 介面的本質是契約,就像我們人間的法律-樣。制定好後大家都遵守。
  • 00P的精髓,是對對象的抽象,最能體現這一 點的就是介面。為什麼我們討論設計模式都只針對具備了抽象
    能力的語言(比如C++、 java、 c#等) ,就是因為設計模式所研究的,實際上就是如何合理的去抽象。
  • 聲明類的關鍵字是class,聲明接[的關鍵字是interface

一個介面

//抽象的思維~ Java 架構

//interface定義的關鍵字,  介面都需要實現類
public interface UserService {

    //常量 public static final
    int AGE = 99;

    //介面中的所有定義的方法其實都是抽象的   public abstract默認
    void run();
    void add(String name);
    void delete(String name);
    void update(String name);
    void select(String name);
}

實現類

//抽象類: extends~
//類 可以實現介面 implements 介面
//實現了介面的類,就需要重寫介面中的方法~

//多繼承,利用介面實現多繼承
public class UserServiceImpl implements UserService,TimeService {
    @Override
    public void run() {

    }

    @Override
    public void add(String name) {

    }

    @Override
    public void delete(String name) {

    }

    @Override
    public void update(String name) {

    }

    @Override
    public void select(String name) {

    }

    @Override
    public void timer() {

    }
}

內部類

public class Outer {

    private int ID = 10;

    public void Outer(){
        System.out.println("Out!");
    }

    //局部內部類
    public void method(){
        class test{
            public void tst(){

            }
        }
    }

    public class Inner{
        public void in(){
            System.out.println("In!");
        }

        //獲取外部類的私有屬性
        public void getID(){
            System.out.println(ID);
        }
    }
}

//一個java類中可以有多個class類,但是只能有一個public類
class Apple {
    public void eat(){
        System.out.println("1");
    }
}

interface Avirus{
    void hello();
}