【狂神說Java】Java零基礎學習筆記-面向對象

来源:https://www.cnblogs.com/Ge-sun-smile/archive/2023/08/17/17637272.html
-Advertisement-
Play Games

# 【狂神說Java】Java零基礎學習筆記-面向對象 ## 面向對象01:什麼是面向對象 ### 面向過程&面向對象 - 面向過程思想 - 步驟清晰簡單,第一步做什麼,第二步做什麼.... - 面對過程適合處理一些較為簡單的問題 - 面向對象思想 - 物以類聚,**分類**的思維模式,思考問題首先 ...


【狂神說Java】Java零基礎學習筆記-面向對象

面向對象01:什麼是面向對象

面向過程&面向對象

  • 面向過程思想
    • 步驟清晰簡單,第一步做什麼,第二步做什麼....
    • 面對過程適合處理一些較為簡單的問題
  • 面向對象思想
    • 物以類聚,分類的思維模式,思考問題首先會解決問題需要哪些分類,然後對這些分類進行單獨思考。最後,才對某個分類下的細節進行面向過程的思索。
    • 面向對象適合處理複雜的問題,適合處理需要多人協作的問題!
  • 對於描述複雜的事物,為了從巨集觀上把握、從整體上合理分析,我們需要使用面向對象的思路來分析整個系統。但是,具體到微觀操作,仍然需要面向過程的思路去處理。

什麼是面向對象

  • 面向對象編程(Object-Oriented Programming, OOP)
  • 面向對象編程的本質就是:以類的方式組織代碼,以對象的組織(封裝)數據。
  • 抽象:編程思想!持續的學習,茅塞頓開!多實踐,多測試大腦中的想法!實踐出真知~
  • 三大特性:
    • 封裝
    • 繼承
    • 多態
  • 從認識論角度考慮是先有對象後有類。對象,是具體的事物。類,是抽象的,是對對象的抽象
  • 從代碼運行角度考慮是先有類後有對象。類是對象的模板。

面向對象02:回顧方法的定義

回顧方法及加深

  • 方法的定義
    • 修飾符
    • 返回類型
    • break:跳出switch,結束迴圈 和 return的區別
    • 方法名:註意規範就OK 見名知意
    • 參數列表:(參數類型,參數名)...
    • 異常拋出:疑問,後面講解
  • 方法的調用:遞歸
    • 靜態方法
    • 非靜態方法
    • 形參和實參
    • 值傳遞和引用傳遞
    • this關鍵字
package com.oop.demo01;

import java.io.IOError;
import java.io.IOException;

//Demo01 類
public class Demo01 {
    //main 方法
    public static void main(String[] args) {

    }

    /*
    修飾符 返回值類型 方法名(...){
        //方法體
        return 返回值;
    }
     */
    //return 結束方法,返回一個結果!
    public String sayHello(){
        return "hello,world";
    }

    public void print(){
        return;
    }

    public int max(int a,int b){
        return a>b ? a : b; //三元運算符!
    }

    //數組下標越界: Arrayindexoutofbounds

    public void readFile(String file) throws IOException{
        
    }
}

面向對象03:回顧方法的調用

package com.oop.demo01;

public class Demo02 {
    public static void main(String[] args) {
//        //靜態方法 static
//        Student.say();

        //非靜態方法
        //實例化這個類 new
        //對象類型 對象名 = 對象值;
        Student student = new Student();
        student.say();
    }

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

    //類實例化 之後才存在
    public void b(){

    }
}

學生說話了
package com.oop.demo01;

//學生類
public class Student {
//    //靜態方法
//    public static void say(){
//        System.out.println("學生說話了");
//    }

    //非靜態方法
    public void say(){
        System.out.println("學生說話了");
    }
}

package com.oop.demo01;

public class Demo03 {
    public static void main(String[] args) {
        //實際參數和形式參數的類型要對應!
        int add = Demo03.add(1,2);
        System.out.println(add);
    }

    public static int add(int a,int b){
        return a+b;
    }
}

3
package com.oop.demo01;

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

        Demo04.change(a);
        System.out.println(a); //1
    }

    //返回值為空
    public static void change(int a){
        a = 10;
    }
}

1
1
package com.oop.demo01;

//引用傳遞:對象

//對象,記憶體!

public class Demo05 {
    public static void main(String[] args) {
        Perosn perosn = new Perosn();
        System.out.println(perosn.name); //null

        Demo05.change(perosn);
        System.out.println(perosn.name); //黎明の微笑
    }

    public static void change(Perosn perosn){
        //perosn是一個對象,指向的--->Perosn perosn = new Perosn(); 這是一個具體的人,可以改變屬性!
        perosn.name = "黎明の微笑";
    }
}

//定義了一個Perosn類,有一個屬性:name
class Perosn{
    String name; //null
}

null
黎明の微笑

面向對象04:類與對象的創建

類與對象的關係

  • 類是一種抽象的數據類型,它是對某一類事物整體描述/定義,但是並不能代表某一個具體的事物.

    • 動物、植物、手機、電腦......
    • Person類、Pet類、Car類等,這些類都是用來描述/定義某一類具體的事物應該具畝的特點和行為
  • 對象是抽象概念的具體實例

    • 張三就是人的一個具體實例,張三家裡的旺財就是狗的一個具體實例。

    • 能夠體現出特點,展現出功能的是具體的實例,而不是一個抽象的概念.

我們可以將這些思想轉換為代碼實現!

創建與初始化對象

  • 使用new關鍵字創建對象
  • 使用new關鍵字創建的時候,除了分配記憶體空間之外,還會給創建好的對象進行預設的初始化以及對類中構造器的調用。
  • 類中的構造器也稱為構造方法,是在進行創建對象的時候必須要調用的。並且構造器有以下倆個特點:
    • 1.必須和類的名字相同
    • 2.必須沒有返回類型,也不能寫void
  • 構造器必須要掌握
package com.oop.demo02;

//學生類
public class Student {
    //屬性:欄位
    String name; //null
    int age; //0

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

//Person ---> 身高,體重,年齡,國家
//學程式好?對世界進行更好的建模! --->宅! --->音樂,旅游,出國!

package com.oop.demo02;

//一個項目應該只存一個main方法
public class Application {
    public static void main(String[] args) {
        //類:抽象的,實例化
        //類實例化後會返回一個自己的對象!
        // student對象就是一個student類的具體實例!

        Student xiaoming = new Student();
        Student xh = new Student();

        xiaoming.name = "小明";
        xiaoming.age = 3;

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

        xh.name = "小紅";
        xh.age = 3;

        System.out.println(xh.name);
        System.out.println(xh.age);
    }
}

小明
3
小紅
3

面向對象05:構造器詳解

package com.oop.demo02;

//java ---> class
public class Person {
    //一個類即使什麼都不寫,它也會存在一個方法
    //顯示的定義構造器
    String name;
    int age;

    //alt + insert

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

    }

    //有參構選:一旦定義了有參構造,無參就必須顯示定義
    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) {
        //new 實例化了一個對象
        Person person = new Person("liming",23);

        System.out.println(person.name); //liming
    }
 */

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

ALt + Insert

this. =
 */

面向對象06:創建對象記憶體分析

package com.oop.demo03;

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

    //無參構造

    public void shout(){
        System.out.println("叫了一聲");
    }
}

/*
    public static void main(String[] args) {
        Pet dog = new Pet();

        dog.name = "旺財";
        dog.age = 3;
        dog.shout();

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

        Pet cat = new Pet();
    }
 */

image

面向對象07:簡單小結類與對象

/*
1.類與對象
	類是一個模板:抽象,對象是一個具體的實例
2.方法
	定義、調用!
3.對應的引用
	引用類型:	基本類型(8)
	對象是通過引用來操作的:棧 ---> 堆
4.屬性:欄位 Field 成員變數
	預設初始化:
		數字:0	0.0
		char:u0000
		boolean:false
		引用:nuLL
	修飾符 屬性類型 屬性名 = 屬性值!
5.對象的創建和使用
	- 必須使用 new 關鍵字創造對象,構造器 Person kuangshen = new Person();
	- 對象的屬性 kuangshen.name
	- 對象的方法 kuangshen.sleep()
6.類
	靜態的屬性 屬性
	動態的行為 方法

`封裝、繼承、多態`
*/

面向對象08:封裝詳解

封裝

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

//類     private:私有
public class Student {
    //屬性私有
    private String name; //名字
    private int id; //學號
    private char sex; //性別
    private int age; //年齡

    //提供一些可以操作這個屬性的方法!
    //提供一些 public 的 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 = 3;
        }else {
            this.age = age;
        }
    }
}

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

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

        s1.setName("黎明の微笑");
        System.out.println(s1.getName());

        s1.setAge(-1); //不合法的
        System.out.println(s1.getAge());
    }
 */

面向對象09:什麼是繼承

繼承

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

  • extends的意思是“擴展”。子類是父類的擴展。

  • JAVA中類只有單繼承,沒有多繼承!一個兒子只能有一個爸爸,但是一個爸爸可以有多個兒子

  • 繼承是類和類之間的一種關係。除此之外,類和類之間的關係還有依賴、組合、聚合等。

  • 繼承關係的倆個類,一個為子類(派生類)一個為父類(基類)。子類繼承父類,使用關鍵字extends來表示。

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

  • object類

  • super

  • 方法重寫:重點--->多態

package com.oop.demo05;

//在Java中,所有的類,都預設直接或者間接繼承Object
//Person 人 : 父類
public class Person /*extends Object*/ {
    //public
    //protected
    //default
    //private
    private int money = 10_0000_0000;

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

    public int getMoney() {
        return money;
    }

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

/*
ctrl + H 樹
 */

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

        Person person = new Person();

        Student student = new Student();
        student.say();
        System.out.println(student.getMoney());
    }
 */

package com.oop.demo05;

//Student is 人 : 派生類,子類
//子類繼承了父類,就會擁有父類的全部方法!
public class Student extends Person {
}

package com.oop.demo05;

//Teacher is 人 : 派生類,子類
public class Teacher extends Person {
}

面向對象10:Super詳解

super註意點:

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

Vs this:

代表的對象不同:

​ this:本身調用者這個對象

​ super:代表父類對象的應用

前提

​ this:沒喲繼承也可以使用

​ super:只能在繼承條件才可以使用

構造方法

​ this();本類的構造

​ super();父類的構造!

package com.oop.demo05;

public class Person /*extends Object*/ {
    public Person() {
        System.out.println("Person無參執行了");
    }

//    public Person(String name) {
//        System.out.println("Person有參執行了");
//    }

    protected String name = "liming";

    //私有的東西無法被繼承!
    public void print(){
        System.out.println("Person");
    }

}

/*
    public static void main(String[] args) {
        Student student = new Student();

        //student.test1();

        //student.test("微笑");

    }
 */

package com.oop.demo05;

public class Student extends Person {
    public Student() {
        //隱敲代碼:調川了父類的無參構選
        super(); //調用父類的構造器,必須要在子類構造器的第一行
        //this("hello");
        System.out.println("Student無參執行了");

//        super("name");
//        System.out.println("Student有參執行了");
    }

    public Student(String name) {
        this.name = name;
    }

    private String name = "weixiao";

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

//    public void test1(){
//        print(); //Student
//        this.print(); //Student
//        super.print(); //Person
//    }

//    public void test(String name){
//        System.out.println(name); //微笑
//        System.out.println(this.name); //weixiao
//        System.out.println(super.name); //liming
//    }
}

面向對象11:方法重寫

重寫:需要有繼承關係,子類重寫父類的方法!

​ 1.方法名必須相同

​ 2.參數列表列表必須相同

​ 3.修飾符:範圍可以擴大但不能縮小: public>Protected>Default>private

​ 4.拋出的異常:範圍,可以被縮小,但不能擴大; ClassNotFoundException ---> Exception(大)

重寫,子類的方法和父類必要一致;方法體不同!

為什麼需要重寫:

​ 1.父類的功能,子類不一定需要,或者不一定滿足!Alt + Insert ; override;

package com.oop.demo05;

//重寫都是方法的重寫,和屬性無關
public class B {
//    public static void test(){
//        System.out.println("B=>test()");
//    }

    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(); //B
    }
 */

package com.oop.demo05;

//繼承
public class A extends B {
//    public static void test(){
//        System.out.println("A=>test()");
//    }

    //Override 重寫
    @Override //註解:有功能的註釋!
    public void test() {
        System.out.println("A=>test()");
    }
}

面向對象12:什麼是多態

多態

  • 即同一方法可以根據發送對象的不同而採用多種不同的行為方式。
  • 一個對象的實際類型是確定的,但可以指向對象的引用的類型有很多(父類,有關係的類)
  • 多態存在的條件
    • 有繼承關係
    • 子類重寫父類方法
    • 父類引用指向子類對象
  • 註意:多態是方法的多態,屬性沒有多態性。
  • instanceof (類型轉換) 引用類型,判斷一個對象是什麼類型~
package com.oop.demo06;

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

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

    1. static 靜態方法,屬於類,它不屬於實例
    2. final 常量;
    3. private 私有方法;
 */

/*
    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();

        //s2.eat();
        ((Student) s2).eat();
        s1.eat();
    }
 */

package com.oop.demo06;

public class Student extends Person {
    @Override
    public void run() {
        System.out.println("son");
    }

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

面向對象13:instanceof和類型轉換

package com.oop.demo06;

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

/*
    public static void main(String[] args) {
        //Object > Person > Student
        //Object > Person > Teacher
        //Object > String

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

        Object object = new Student();
        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); //編譯報錯!
        System.out.println("====================");

        Student student = new Student();
        System.out.println(student instanceof Student); //true
        System.out.println(student instanceof Person); //true
        System.out.println(student instanceof Object); //true
        //System.out.println(student instanceof Teacher); //編譯報錯!
        //System.out.println(student instanceof String); //編譯報錯!
    }
 */

/*
    public static void main(String[] args) {
        //類型之間的轉化:父     子

//        //高                  低
//        Person obj = new Student();
//
//        //student將這個對象轉換為Student類型,我們就可以使川Student類型的方法了!
//        Student student = (Student) obj;
//        student.go();
//        //((Student) obj).go();

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

/*
1. 父類引用指向子類的對象
2. 把子類轉換為父類,向上轉型;
3. 把父類轉換為子類,向下轉型; 強制轉換
4. 方便方法的調用,減少重覆的代碼!簡介

封裝、繼承、多態!   抽象類,介面
 */

package com.oop.demo06;

public class Student extends Person {
    public void go(){
        System.out.println("go");
    }
}

package com.oop.demo06;

public class Teacher extends Person {

}

面向對象14:static關鍵字詳解

package com.oop.demo07;

//static
public class Student {
    private static int age; //靜態的變數     多線程!
    private double score; //非靜態的變數

    public void run(){

    }

    public static void go(){

    }

    public static void main(String[] args) {
//        Student s1 = new Student();
//
//        System.out.println(Student.age);
//        //System.out.println(Student.score);
//        System.out.println(s1.age);
//        System.out.println(s1.score);

        //run();
        go();
    }
}

package com.oop.demo07;

public class Person {
    //2:賦初值~
    {
        //代碼塊(匿名代碼塊)
        System.out.println("匿名代碼塊");
    }


    //1:只執行一次~
    static {
        //靜態代碼塊
        System.out.println("靜態代碼塊");
    }

    //3
    public Person() {
        System.out.println("構造方法");
    }

    public static void main(String[] args) {
        Person person1 = new Person();
        System.out.println("====================");
        Person person2 = new Person();
    }
}

靜態代碼塊
匿名代碼塊
構造方法
====================
匿名代碼塊
構造方法
package com.oop.demo07;

//靜態導入包~
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);
    }
}

面向對象15:抽象類

抽象類

  • abstract修飾符可以用來修飾方法也可以修飾類,如果修飾方法,那麼該方法就是抽象方法;如果修飾類,那麼該類就是抽象類。
  • 抽象類中可以沒有抽象方法,但是有抽象方法的類一定要聲明為抽象類。
  • 抽象類,不能使用new關鍵字來創建對象,它是用來讓子類繼承的。
  • 抽象方法,只有方法的聲明,沒有方法的實現,它是用來讓子類實現的。
  • 子類繼承抽象類,那麼就必須要實現抽象類沒有實現的抽象方法,否則該子類也要聲明為抽象類。
package com.oop.demo08;

//abstract 抽象類:類 extends    單繼承~    (介面可以多繼承)
public abstract class Action {
    //約束~有人幫我們實現~
    //abstract 抽象方法,只有方法名字,沒有方法的實現!
    public abstract void doSomething();

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

    //思考題?
    //new,存在構造器麽? (存在)
    //抽象類存在的意義      抽象出來~       提高開發效率
}

package com.oop.demo08;

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

    }
}

面向對象16:介面的定義與實現

介面

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

聲明類的關鍵字是class,聲明介面的關鍵字是interface

作用:
    1. 約束
    2. 定義一些方法,讓不同的人實現~ 10 ---> 1
    3. public abstract
    4. public static final
    5. 介面不能被實例化~,介面中沒有構造方法~
    6. implements可以實現多個介面
    7. 必須要重寫介面中的方法~
    8. 總結博客~
package com.oop.demo09;

//抽象的思維~ Java 架構師~

//interface 定義的關鍵字 , 介面都需要有實現類
public interface UserService {
    //常量~ public static final
    int AGE = 99;

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

package com.oop.demo09;

//抽象類:extends~
//類 可以實現介面 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() {

    }
}

package com.oop.demo09;

public interface TimeService {
    void timer();
}

面向對象17:N種內部類

內部類

  • 內部類就是在一個類的內部在定義一個類,比如,A類中定義一個B類,那麼B類相對A類來說就稱為內部類,而A類相對B類來說就是外部類了。
  • 1.成員內部類
  • 2.靜態內部類
  • 3.局部內部類
  • 4.匿名內部類
package com.oop.demo10;

public class Outer {
    private int id=10;

    public void out(){
        System.out.println("這是外部類的方法");
    }

    public class Inner{
        public void in(){
            System.out.println("這是內部類的方法");
        }

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

    //局部內部類
    public void method(){
        class Inner{
            public void in(){

            }
        }
    }
}

//一個java類中可以有多個class類,但是只能有一個public class
class A{
    public static void main(String[] args) {

    }
}

/*
    public static void main(String[] args) {
        //new
        Outer outer = new Outer();

        //通過這個外部類來實例化內部類~
        Outer.Inner inner = outer.new Inner();
        inner.in();
        inner.getID();
    }
 */

package com.oop.demo10;

public class Test {
    public static void main(String[] args) {
        //沒有名字初始化類,不用將實例保存到變數中~
        new Apple().eat();
        UserService userService = new UserService() {

            @Override
            public void hello() {

            }

        };
    }
}

class Apple{
    public void eat(){
        System.out.println("1");
    }
}

interface UserService{
    void hello();
}

【【狂神說Java】Java零基礎學習視頻通俗易懂】https://www.bilibili.com/video/BV12J41137hu?p=60&vd_source=fd5defd6aaa826e3b6e0c06073353e32

本文來自博客園,作者:黎明の微笑,轉載請註明原文鏈接:https://www.cnblogs.com/Ge-sun-smile/p/17637272.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 關於票據系統設計在之前的博客中也聊過,今天做一個補充 1、架構 票據系統主要就是和票交所進行交互,圍繞這一核心,我們把系統劃分為三大部分,分別是:票據網關服務、票據業務服務、票據庫存服務。 網關服務:對接票交所,負責和票交所的交互,主要是收發報文。 業務服務:負責票據業務的處理,比如出票、背書、貼現 ...
  • # 【狂神說Java】Java零基礎學習筆記-JavaSE總結 ## JavaSE總結: ![image](https://img2023.cnblogs.com/blog/3231511/202308/3231511-20230817171925456-1307925972.jpg) ## 🎉� ...
  • # 【狂神說Java】Java零基礎學習筆記-異常 ## 異常01:Error和Exception ### 什麼是異常 - 實際工作中,遇到的情況不可能是非常完美的。比如:你寫的某個模塊,用戶輸入不一定符合你的要求、你的程式要打開某個文件,這個文件可能不存在或者文件格式不對,你要讀取資料庫的數據,數 ...
  • ### 1. json.load(json_data)與json.dump(python_data) json.load()用來將讀取json文件,json.dump()用來將數據寫入json文件 ### 2. json.loads()與json.dumps() - json.dumps 將 Pyt ...
  • 使用python爬蟲爬取數據的時候,經常會遇到一些網站的反爬蟲措施,一般就是針對於headers中的User-Agent,如果沒有對headers進行設置,User-Agent會聲明自己是python腳本,而如果網站有反爬蟲的想法的話,必然會拒絕這樣的連接。 而修改headers可以將自己的爬蟲腳本 ...
  • C++ STL(Standard Template Library)是C++標準庫中的一個重要組成部分,提供了豐富的模板函數和容器,用於處理各種數據結構和演算法。在STL中,排序、算數和集合演算法是常用的功能,可以幫助我們對數據進行排序、統計、查找以及集合操作等。STL提供的這些演算法,能夠滿足各種數據處... ...
  • 為衡量個人能力水平自創的一套評分機制,根據時間、代碼行數、基礎理論三個變數生成。使用lua語言編寫,輸出成三個markdown表格。 ...
  • > 本文以一個通過正常註冊攔截器流程註冊攔截器失敗的實際場景,來帶領大家閱讀源碼,體會Spring的HandlerInterceptor攔截器整個工作流程 ### 簡單認識 org.springframework.web.servlet.HandlerInterceptor是Spring框架中的一個 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...