1. 程式人生 > 實用技巧 >JavaSE基礎篇---oop:面對物件

JavaSE基礎篇---oop:面對物件

//有些雜,,,,看不懂可以找我,我再重寫

類,方法的呼叫

package com.oop.demo01;
//類,方法的呼叫
public class Demo01 {
    public static void main(String[] args) {

        //靜態呼叫,在之前的隨筆裡有記載
        //Student.say();
        //動態態呼叫
        Student student = new Student();
        student.say();

    }

    //和類一起載入的
  public static void a(){

    }

    
//類例項化之後才存在的,所以靜態方法和動態方法不能混合呼叫 public void b(){ } }

值傳遞

package com.oop.demo01;

import java.util.Date;

//值傳遞
public class Demo02 {
    public static void main(String[] args) {
        int a=1;
        System.out.println(a);//1

        Demo02.change(a);
        //change(a)沒有把a處理後的值返回所以結果依舊是1
        System.out.println(a);;//
1 } //返回值為空 public static void change(int a){ a=10; } }

引用傳遞

package com.oop.demo01;

//引用傳遞:物件,本質還是值傳遞

//注意:物件,記憶體
public class Demo03 {
    public static void main(String[] args) {

        Person person = new Person();

        System.out.println(person.name);//null

        Demo03.change(person);
        System.out.println(person.name);
//king } public static void change(Person person){ //person是一個物件: person.name="king"; } } //定義一個Person類,有一個熟悉屬性:name class Person{ String name; }

有參無參

package com.oop.demo02;
//java——》class
//out目錄就是輸出檔案,將java檔案變成class
public class Person {

    //一個類即時什麼都不寫,class裡也會有一個預設的方法(構造器)

    String name;
    int age;

    //例項化初始值
    //1.使用new關鍵字,本質是在呼叫構造器
    //無參構造
    public Person(){
        this.name="king";
    }

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

    public Person(String name,int age){
        this.name=name;
        this.age=age;
    }


}

/*
    public static void main(String[] args) {

        Person person = new Person("king",23);

        System.out.println(person.name);

    }

    構造器:
        1.和類名相同
        2.沒有返回值
    作用:
        1.new本質在呼叫構造方法
        2.初始畫物件的值
    注意點:
        1.定義有參構造之後,如果想用無參構造,顯示的定義一個無參的構造
         ait+insert自動生成方法
* */
package com.oop.demo02;

public class Student {

    //屬性:欄位
    String name;
    int age;


    //方法
    public void study(){
        System.out.println(this.name+"在學習");
    }
}

//練習
/*
    public static void main(String[] args) {

        //類:抽象的,要例項化
        //類例項化後會返回自己的物件
        //student物件就是一個Student類的具體的一個例項

        Student gg=new Student();
        Student mm=new Student();

        gg.name="小g";
        gg.age=9;
        gg.study();//小g在學習
        System.out.println(gg.name);//小g
        System.out.println(gg.age);//9




        mm.name="小m";
        mm.age=3;
        System.out.println(mm.name);//小m
        System.out.println(mm.age);//3

    }
* */

建立物件

package com.oop.demo03;
//建立物件
public class Pet {
    public String name;
    public int age;

    public void shout(){
        System.out.println("king");
    }
}

/*
      小結
      1.類與物件
            類是一個模板:抽象,物件是一個具體的例項
      2.方法
            定義,呼叫
      3.對應的引用
            引用型別:基本型別(8)
              物件是通引用來操作的:棧——》堆
      4.屬性:欄位Field 成員變數
        預設初始化:
            數字:0/0.0
            char:u0000
            boolean: false
            引用:null
      5.物件的建立和使用:
           你須使用new關鍵字,構造器 eg:Person king=new Peeson()
           物件的屬性:king.name
           物件方法:king.sleep()

      6.類:
           靜態的屬性  屬性
           動態的行為  方法

           封裝,繼承,多型

*     public static void main(String[] args) {

        Pet dog = new Pet();
        dog.name="cai";
        dog.age=3;
        dog.shout();

        System.out.println(dog.name);
        System.out.println(dog.age);


    }*/

封裝

package com.oop.demo04;
//封裝:
//意義:提高程式的安全性,保護資料
//      隱藏程式碼的實現細節
//      統一介面
//      提高系統可維護性


//封裝本質:
//類 private:私有 ,get,set
public class Student {

    private String name;  //名字
    private int id;//學號
    private char sex;//性別
    private int age;//年齡

    //提供可以操作private的方法
    //解決:get,set方法

    //get 獲得資料
    public String getName(){
        return this.name;
    }

    //set方法,給資料設定值
    public void setName(String name){
        this.name=name;
    }

    //alt+insert自動生成方法
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if(age<120&&age>=0){
            this.age = age;
        }else{
            this.age=3;
        }
    }
}
/*    public static void main(String[] args) {
        Student s1=new Student();

        s1.setName("king");

        s1.setAge(70);
        System.out.println(s1.getAge());
    }
 */

繼承

package com.oop.demo05;

//繼承
public class A extends B{

    @Override//註解:重寫
    public void test() {
        System.out.println("A=》test");
    }
}

package com.oop.demo05;

//重寫都是方法的重寫,和屬性無關
public class B {

    public  void test(){
        System.out.println("B=>test()");
    }
}

/*
*
    public static void main(String[] args) {

        //靜態方法和非靜態方法區別很大

        A a = new A();
        a.test();//A

        //父類的引用指向了子類
        B b=new A();//子類重寫了父類的方法
        b.test();//A
    }

小結:
重寫:需要有繼承關係,子類重寫父類方法
    1.方法名必須相同
    2.引數列表必須相同
    3.修飾符:範圍可以擴大但不能縮小:public>protected>Default>private
    4.丟擲異常:範圍,可以被縮小,但不能擴大:

為什麼重寫:
    1.父類功能:子類不一定需要,或不一定滿足
    Alt+Insert:override

    * */





//Person是父類 Student和Teacher是子類
package com.oop.demo05;



//在Java中,所有的類,都直接或間接預設繼承object
//extends:擴充套件
//父類

public class Person /*extends Object*/ {
        public String name="kings";

    public Person() {
        System.out.println("Person無參執行了");
    }
}

/*    //public
    //proteced受保護的
    //default 預設的
    //private 私有的
    //優先順序高——>低

    private int money=10_0000_0000;
    public void say(){
        System.out.println("king");
    }

    public int getMoney() {
        return money;
    }

    public void setMoney(int money) {
        this.money = money;
    }
super注意點:
    1.super呼叫父類的構造方法,必須在構造方法發的第一個
    2.super必須只能在現在子類的方法或者構造方法中
    3.super和this不能同時呼叫構造方法
與this對比
    代表的物件不同
        this:本身呼叫者這個物件
        super:代表父類物件應用
    前提
        this:沒有繼承也可以使用
        suo:只能在繼承條件下才可以使用
    構造方法
        this();本類的構造
        super();父類構造

 */

package com.oop.demo05;
//Student類是Person類的派生類,子類
//子類繼承了父類,就會擁有父類的全部方法
public class Student extends Person {

    //Ctrl+H;


 public Student(){
     //隱藏程式碼:呼叫了父類的無參構造
     //super();呼叫父類構造器必須放到子類構造器的第一行
     System.out.println("Student 無參執行了");
 }

    private String name="king";


    public void test1(){
        System.out.println(name);//kingking
        System.out.println(this.name);//king,this輸出當前類的值
        System.out.println(super.name);//kings,super父類的值
    }

    public void test(String name){
        System.out.println(name);//kingking
        System.out.println(this.name);//king,this輸出當前類的值
        System.out.println(super.name);//kings,super父類的值
    }

}
/*
    public static void main(String[] args) {

        Student student = new Student();


        //student.test("kingking");
    }
* */

package com.oop.demo05;

public class Teacher extends Person {
}

多型

package com.oop.demo06;

public class Person {

    public void run(){
        System.out.println("run");
    }
}

/*
多型注意事項
1.多型是方法的多型,屬性沒有多型
2.父類和子類,有聯絡 型別轉換異常!ClassCastException!
3.存在條件:繼承關係,方法需要重寫,父類引用指向子類物件
        1.static 方法,屬於類,它不屬於例項
        2.final 常量:
        3.private 方法:
        以上3個都不能重寫
* */
/*
   public static void main(String[] args) {

        //一個物件的實際型別是確定的
        //new Student();
        //new Person();

        //可以指向的引用型別就不確定
        //Student 能呼叫的方法都是自己的,或者從父類繼承的
        Student s1 = new Student();
        //Person 父型別,可以指向子類,但不能呼叫子類特有的方法
        Person s2=new Student();
        Object s3 = new Student();

        s2.run();
        s1.run();

    }

*/
package com.oop.demo06;

public class Student extends Person {

    @Override
    public void run() {//子類重寫父類方法
        System.out.println("son");
    }

    public void eat(){
        System.out.println("ear");
    }
}

instanceof,強制轉換

//person 父類    stud和teache子類
package com.oop.demo07;

//instanceof,強制轉換
public class Person {

    public void run(){
        System.out.println("run");
    }
}

/*
public static void main(String[] args) {

        //Object>String
        //Object>Person>Teacher
        //Object>Person>Student
        Object object = new Student();

        //System.out.println(X instanceof Y);//能不能編譯通過

        System.out.println(object instanceof Student);//true
        System.out.println(object instanceof Person);//true
        System.out.println(object instanceof Object);//true
        System.out.println(object instanceof Teacher);//false
        System.out.println(object instanceof String);//false
        System.out.println("==========");
        Person person=new Student();
        System.out.println(person instanceof Student);//true
        System.out.println(person instanceof Person);//true
        System.out.println(person instanceof Object);//true
        System.out.println(person instanceof Teacher);//false
     //   System.out.println(person instanceof String);//編譯報錯,person與String沒有關係


    }
    /*
1.父類引用指向子類物件
2.把子類轉換為父類,向上轉型:丟失精度,可能丟失一些方法
3.把父類轉換為子類,向下轉型:強制轉換eg:Person obj=new student;  ((student)obj).go();

*
*/

package com.oop.demo07;

public class Student extends Person {
}


package com.oop.demo07;

public class Teacher extends Person {
}

導包

package com.oop.Demo08;

//靜態匯入包
import  static java.lang.Math.random;
//static
public class Student {

    private static int age;//靜態的變數,多執行緒用到!
    private double score;//非靜態變數

    public static void main(String[] args) {
        Student s1 = new Student();

        System.out.println(Student.age);//0
        System.out.println(s1.age);//0
        System.out.println(s1.score);//0.0
    }

}

抽象類 ,關鍵詞abstract

package com.oop.demo09;

//抽象類的所有方法,繼承了它的子類,都必須要實現他的方法,除非他也是抽象類
public abstract class A extends Action{

    public void doSomething() {

    }
}

package com.oop.demo09;

//abstract 抽象類;類 extends: 單繼承(類只有單繼承),介面可以多繼承
public abstract class Action {

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

    //抽象類特點:不能new這個抽象類,只能靠子類去實現它:約束!
    //           抽象類中可以寫普通的方法
    //           抽象方法必須在抽象類中
    //           抽象的抽象:約束~

    //思考?
    //1.可以new物件嗎,存在構造器嗎?
    //2.存在意義 抽象出來~提高開發效率


//思考題解答
//1.抽象類是存在建構函式的,其建構函式是提供給子類建立物件的時候初始化父類的屬性的。
//2.更利於程式碼的維護和重用,對子類進行保護,當你修改子類資料時觸發到抽象類,會提醒開發者有些東西不可隨意改變

介面,關鍵此interface

package com.oop.Demo10;

public interface TimeService {
    void timer();
}

package com.oop.Demo10;

//抽象的思維~Java!!!

//介面:interface,關鍵字
//介面都需要有實現類
public interface UserService {
    //介面中的所有定義都是抽象的 public

    //常量,一般不會用
    public static final int AGE=99;

    void add(String name);
    void delete(String name);
    void update(String name);
    void query(String name);
}

/*
介面作用:
        1.約束
        2.定義一些方法,讓不同的人實現
        3.方法:public abstract
        4.常量:public static final
        5.介面不能被例項化,介面中沒有構造方法
        6.implements可以實現多個介面;eg:public class UserServiceImpl implements UserService,TimeService{}
        7.實現介面,必須要實現重寫介面中的方法
**/

package com.oop.Demo10;

//類 可以實現介面 implements 介面
//實現介面的類,就需要重寫介面的方法
public class UserServiceImpl implements UserService,TimeService{
    @Override
    public void add(String name) {

    }

    @Override
    public void delete(String name) {

    }

    @Override
    public void update(String name) {

    }

    @Override
    public void query(String name) {

    }

    @Override
    public void timer() {

    }
}