Java基礎第7天總結(代碼塊、內部類、函數式編程)

  • 代碼塊
  1. 靜態代碼塊:有static修飾,屬于類,與類一起優先加載,自動執行一次

  2. 實例代碼塊:無static修飾,屬于對象,每次創建對象時,都會優先執行一次。

package com.itheima.code;import java.util.Arrays;public class CodeDemo1 {public static String schoolName;public static String[] cards = new String[3];//靜態代碼快:有static修飾,屬于類,與類一起優先加載,自動執行一次//基本作用:可以完成對象的靜態資源的初始化static{System.out.println("靜態代碼塊執行了");schoolName = "黑馬程序員";cards[0] = "大王";cards[1] = "小王";}public static void main(String[] args) {System.out.println("main方法執行了");System.out.println(schoolName);System.out.println(Arrays.toString(cards));}
}

輸出:

靜態代碼塊執行了
main方法執行了
黑馬程序員
[大王, 小王, null]

package com.itheima.code;public class CodeDemo2 {private String name;private String[] direction = new String[4];//實例代碼塊:無static修飾,屬于對象,每次創建對象時,都會優先執行一次。//基本作用:初始化對象的實例資源。{System.out.println("實例代碼塊執行了");name = "itheima";direction[0] = "N";direction[1] = "S";direction[2] = "E";direction[3] = "W";}public static void main(String[] args) {System.out.println("main方法執行了");new CodeDemo2();}
}

輸出:

main方法執行了
實例代碼塊執行了



  • 成員內部類
  1. 成員內部類創建對象的格式:外部類名稱.內部類名稱 對象名 = new 外部類名稱().內部類名稱();

  2. 可以直接訪問外部類的實例成員、靜態成員

  3. 可以拿到當前外部類對象,格式是:外部類名.this。

package innerClass;public class Outer {public static String schoolName = "黑馬";public static void test(){System.out.println("Outer.test()");}private int age;public void run(){}//成員內部類:無static修飾,屬于外部類的對象持有public class Inner{public void show(){System.out.println("show");//成員內部類中可以直接訪問外部類的靜態成員System.out.println(schoolName);test();//也可以直接訪問外部類的實例成員System.out.println(age);run();System.out.println(this);System.out.println(Outer.this);}}
}
package innerClass;public class Test {//成員內部類創建對象的格式://    //外部類名稱.內部類名稱 對象名 = new 外部類名稱().內部類名稱();public static void main(String[] args) {Outer.Inner inner = new Outer().new Inner();inner.show();}
}
class People{private int heartBeat = 100;public class Heart{private int heartBeat = 80;public void show(){int heartBeat = 200;System.out.println(heartBeat);//200System.out.println(this.heartBeat);//80System.out.println(People.this.heartBeat);//100}}
}


  • 靜態內部類
  1. 靜態內部類:屬于外部類本身持有

  2. 靜態內部類中可以直接訪問外部類的靜態成員

  3. 靜態內部類中不可以直接訪問外部類的實例成員

  4. 創建格式:外部類名稱.內部類名稱 對象名 = new 外部類名稱.內部類名稱();

package Innerclass2;public class Outer {public static String schoolName ;private int age;//靜態內部類:屬于外部類本身持有public static class Inner{public void show(){//靜態內部類中可以直接訪問外部類的靜態成員System.out.println(schoolName);//靜態內部類中不可以直接訪問外部類的實例成員//System.out.println(age);報錯}}
}
package Innerclass2;public class Test {public static void main(String[] args) {//創建格式:外部類名稱.內部類名稱 對象名 = new 外部類名稱.內部類名稱();Outer.Inner inner = new Outer.Inner();inner.show();}
}


  • 匿名內部類
  1. 匿名內部類實際上是有名字:外部類名$編號.class

  2. 匿名內部類本質是一個子類,同時會立即構建一個子類對象

package innerclass3;public abstract class Animal {public abstract void cry();
}
package innerclass3;public class Test {public static void main(String[] args) {//匿名內部類實際上是有名字:外部類名$編號.class//匿名內部類本質是一個子類,同時會立即構建一個子類對象Animal a = new Animal(){@Overridepublic void cry() {System.out.println("貓會喵喵喵叫");}};a.cry();}
}
  • 匿名內部類的常見使用形式:通常可以作為一個對象參數傳輸給方法使用
  • package innerclass3;public class Test2 {public static void main(String[] args) {//匿名內部類的使用形式:通常可以作為一個對象參數傳輸給方法使用Swim s1 = new Swim(){@Overridepublic void swim() {System.out.println("學生游泳慢");}};start(s1);start(new Swim() {@Overridepublic void swim() {System.out.println("老師游泳快");}});}public static void start(Swim s){System.out.println("開始");s.swim();System.out.println("結束");}
    }
    interface Swim{void swim();
    }
  • 匿名內部類使用場景
package innerclass3;import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;public class Test3 {//需求:創建一個登錄窗口,窗口上只有一個登錄按鈕public static void main(String[] args) {JFrame win = new JFrame("登錄窗口");win.setSize(400,300);win.setLocationRelativeTo(null);//居中顯示win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//退出程序JPanel panel = new JPanel();win.add( panel);JButton btn = new JButton("登錄");panel.add(btn);//java要求必須給這個按鈕添加一個點擊事件監聽器對象,這樣就可以監聽用戶的點擊操作,就可以做出反應。btn.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("點擊了登錄按鈕");}});win.setVisible(true);}
}
  • 使用comparator接口的匿名內部類實現對數組進行排序
package innerclass3;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {//姓名 年齡 private String name;private int age;
}
package innerclass3;import java.util.Arrays;
import java.util.Comparator;public class Test4 {public static void main(String[] args) {Student[] students = new Student[3];students[0] = new Student("張三", 18);students[1] = new Student("李四", 17);students[2] = new Student("王五", 19);//按照年齡從大到小排序Arrays.sort(students, new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {return o2.getAge() - o1.getAge();}});for (Student student : students){System.out.println(student.getName() + " " + student.getAge());}}
}


  • Lambda的認識
  1. Lambda只能簡化函數式接口的匿名內部類

  2. 寫法:(被重寫方法的形參列表)->{被重寫方法的方法體代碼。}

package lambda;
//Lambda只能簡化函數式接口的匿名內部類
//寫法:(被重寫方法的形參列表)->{被重寫方法的方法體代碼。}
public class LambdaDemo1 {public static void main(String[] args) {Swim s = new Swim() {@Overridepublic void swimming() {System.out.println("我要開始游泳了");}};s.swimming();Swim s1 = () -> {System.out.println("我要開始游泳了");};s1.swimming();}
}
//函數式接口:只有一個抽象方法的接口。
@FunctionalInterface//聲明函數式接口的注解。
interface Swim{void swimming();
}
  • Lambda的省略規則:用于進一步簡化Lambda表達式的寫法。
  1. 參數類型全部可以省略不寫。
  2. 如果只有一個參數,參數類型省略的同時“()”也可以省略,但多個參數不能省略“()”
  3. 如果Lambda表達式中只有一行代碼,大括號可以不寫,同時要省略分號“;”如果這行代碼是return語句,也必須去掉return。
        //按照年齡從大到小排序
//        Arrays.sort(students, new Comparator<Student>() {
//            @Override
//            public int compare(Student o1, Student o2) {
//                return o2.getAge() - o1.getAge();//按照年齡降序
//            }
//        });//        Arrays.sort(students, (Student o1, Student o2) -> {
//            return o2.getAge() - o1.getAge();
//        });//        Arrays.sort(students, ( o1,  o2) -> {
//            return o2.getAge() - o1.getAge();
//        });Arrays.sort(students, (o1,  o2) ->o2.getAge() - o1.getAge());
  • 靜態方法引用:類名::靜態方法名

package innerclass3;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {//姓名 年齡private String name;private int age;public static int compareByAge(Student s1,Student s2){return s2.getAge() - s1.getAge();}
}
        //按照年齡從大到小排序//        Arrays.sort(students, (o1,  o2) ->
//            o2.getAge() - o1.getAge()
//        );//靜態方法引用:類名::靜態方法名Arrays.sort(students, Student::compareByAge);
  • 實例方法引用:對象名::實例方法

package innerclass3;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {//姓名 年齡private String name;private int age;private double score;//靜態方法public static int compareByAge(Student s1,Student s2){return s2.getAge() - s1.getAge();}//實例方法public int compareByScore(Student s1,Student s2){return Double.compare(s2.getScore(),s1.getScore());}
}
      //靜態方法引用:類名::靜態方法名Arrays.sort(students, Student::compareByAge);//實例方法引用:對象名::實例方法Student t = new Student();Arrays.sort(students, t::compareByScore);
  • 特定類的方法引用:類型名稱::方法名
  • 使用場景:如果某個Lambda表達式里只是調用一個特定類型的實例方法,并且前面參數中的第一個參數作為方法的主調,后面的所有參數都是作為改實例方法的入參,則此時就可以使用特定類型的方法引用。
package lambda;import java.util.Arrays;public class ddemo {public static void main(String[] args) {String[] names = {"Tom","Jerry","angle","Andy"};//忽略大小寫,進行升序排列Arrays.sort(names,(s1,s2) -> s1.compareToIgnoreCase(s2));//特定類型方法引用:類型名稱::方法名Arrays.sort(names,String::compareToIgnoreCase);System.out.println(Arrays.toString(names));}
}
  • 構造器引用:類名::new
  • 使用場景:如果某個Lambda表達式里只是在創建對象,并且“->”前后參數情況一致,就可以使用構造器引用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/94981.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/94981.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/94981.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

文獻綜述寫作指南:從海量文獻到邏輯閉環的實戰模板

文獻綜述往往是學術寫作的“第一關難題”&#xff1a;面對成百上千篇文獻&#xff0c;如何避免“簡單羅列”的陷阱&#xff0c;梳理出有邏輯、有洞見的論述體系&#xff1f;本文結合學術寫作實踐&#xff0c;總結出一套模塊化的文獻綜述“實戰模板”&#xff0c;通過結構化方法…

CuTe C++ 簡介01,從示例開始

這里先僅僅關注 C 層的介紹&#xff0c;python DSL 以后再說。在 ubuntu 22.04 X64 中&#xff0c;RTX 50801. 環境搭建1.1 安裝 cuda1.2 下載源碼git clone https://github.com/NVIDIA/cutlass.git1.3 編譯mkdir build/ cmake .. -DCUTLASS_NVCC_ARCHS"120" -DCMAK…

Python實現異步多線程Web服務器:從原理到實踐

目錄Python實現異步多線程Web服務器&#xff1a;從原理到實踐引言第一章&#xff1a;Web服務器基礎1.1 Web服務器的工作原理1.2 HTTP協議簡介1.3 同步 vs 異步 vs 多線程第二章&#xff1a;Python異步編程基礎2.1 異步I/O概念2.2 協程與async/await2.3 事件循環第三章&#xff…

Deep Think with Confidence:llm如何進行高效率COT推理優化

1. 引言:大模型的推理解碼優化 大型語言模型(LLM)在處理數學、編碼等復雜推理任務時,一種強大但“耗能巨大”的技術是self-consistency,也稱并行思考(parallel thinking)。其核心思想是讓模型對同一個問題生成多條不同的“思考路徑”(reasoning traces),然后通過多數…

vscode克隆遠程代碼步驟

一、直接使用VsCode1.復制git的https鏈接代碼2.在vscode中點擊 代碼管理-克隆倉庫3.粘貼&#xff08;在git里面復制的https鏈接&#xff09;4.選擇需要存儲的文件位置5.確認6.代碼克隆成功二、使用命令行克隆1.確定文件放置位置&#xff0c;右鍵2.復制git的https鏈接代碼3.粘貼…

spi總線

一、介紹SPI總線&#xff08;Serial Peripheral Interface&#xff0c;串行外設接口&#xff09;是一種高速全雙工同步串行通信總線&#xff0c;核心通過“主從架構同步時鐘”實現設備間數據傳輸&#xff0c;因結構簡單、速率高&#xff0c;廣泛用于MCU與傳感器、存儲芯片、顯示…

COLA:大型語言模型高效微調的革命性框架

本文由「大千AI助手」原創發布&#xff0c;專注用真話講AI&#xff0c;回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我&#xff0c;一起撕掉過度包裝&#xff0c;學習真實的AI技術&#xff01; 1 COLA技術概述 COLA&#xff08;Chain of LoRA&#xff09;是一種創…

數據結構與算法:線段樹(三):維護更多信息

前言 這次的題思維上倒不是很難&#xff0c;就是代碼量比較大。 一、開關 洛谷的這種板子題寫起來比cf順多了&#xff08;&#xff09; #include <bits/stdc.h> using namespace std;typedef long long ll; typedef pair<int,int> pii; typedef pair<ll,ll&…

【LeetCode_27】移除元素

刷爆LeetCode系列LeetCode27題&#xff1a;github地址前言題目描述題目思路分析代碼實現算法代碼優化LeetCode27題&#xff1a; github地址 有夢想的電信狗 前言 本文用C實現LeetCode 第27題 題目描述 題目鏈接&#xff1a;https://leetcode.cn/problems/remove-element/ …

C++11語言(三)

一、引言上期我們介紹了C11的大部分特性。C11的初始化列表、auto關鍵字、右值引用、萬能引用、STL容器的的emplace函數。要補充的是右值引用是不能取地址的&#xff0c;我們程序員一定要遵守相關的語法。操作是未定義的很危險。二、 仿函數和函數指針我們先從仿函數的形…

性能優化三劍客:`memo`, `useCallback`, `useMemo` 詳解

性能優化三劍客&#xff1a;memo, useCallback, useMemo 詳解 作者&#xff1a;碼力無邊各位React性能調優師&#xff0c;歡迎來到《React奇妙之旅》的第十二站&#xff01;我是你們的伙伴碼力無邊。在之前的旅程中&#xff0c;我們已經掌握了如何構建功能豐富的組件&#xff0…

好用的電腦軟件、工具推薦和記錄

固態硬盤讀寫測試 AS SSD Benchmark https://gitee.com/qlexcel/common-resource-backup/blob/master/AS%20SSD%20Benchmark.exe 可以測試SSD的持續讀寫、4K隨機讀寫等性能。也可以測試HDD的性能。 操作非常簡單&#xff0c;點擊Start(開始)即可測試。 體積小&#xff0c;免安…

Spring Task快速上手

一. 介紹Spring Task 是Spring框架提供的任務調度工具&#xff0c;可以按照約定的時間自動執行某個代碼邏輯&#xff0c;無需依賴額外組件&#xff08;如 Quartz&#xff09;&#xff0c;配置簡單、使用便捷&#xff0c;適合處理周期性執行的任務&#xff08;如定時備份數據、定…

函數(2)

6.定義函數的終極絕殺思路&#xff1a;三個問題&#xff1a;1.我定義函數&#xff0c;是為了干什么事情 函數體、2.我干完這件事&#xff0c;需要什么才能完成 形參3.我干完了&#xff0c;調用處是否需要繼續使用 返回值類型需要繼續使用 必須寫不需要返回 void小程序#include …

BGP路由協議(一):基本概念

###BGP概述 BGP的版本&#xff1a; BGP-1 RFC1105BGP-2 RFC1163BGP-3 RFC1267BGP-4 RFC1771 1994年BGP-4 RFC4271 2006年 AS Autonomous System 自治系統&#xff1a;由一個單一的機構或者組織所管理的一系列IP網絡及其設備所構成的集合 根據工作范圍的不同&#xff0c;動態路…

mit6.031 2023spring 軟件構造 筆記 Testing

當你編碼時&#xff0c;目標是使程序正常工作。 但作為測試設計者&#xff0c;你希望讓它失敗。 這是一個微妙但重要的區別。 為什么軟件測試很難&#xff1f; 做不到十分詳盡&#xff1a;測試一個 32 位浮點乘法運算 。有 2^64 個測試用例&#xff01;隨機或統計測試效果差&am…

【Unity開發】Unity核心學習(三)

四、三維模型導入相關設置 1、Model模型頁簽&#xff08;1&#xff09;場景相關&#xff08;2&#xff09;網格相關&#xff08;3&#xff09;幾何體相關2、Rig操縱&#xff08;骨骼&#xff09;頁簽 &#xff08;1&#xff09;面板基礎信息&#xff08;i&#xff09;None&…

C#語言入門詳解(17)字段、屬性、索引器、常量

C#語言入門詳解&#xff08;17&#xff09;字段、屬性、索引器、常量前言一、字段 Field二、屬性三、索引器四、常量內容來自劉鐵猛C#語言入門詳解課程。 參考文檔&#xff1a;CSharp language specification 5.0 中文版 前言 類的成員是靜態成員 (static member) 或者實例成…

Total PDF Converter多功能 PDF 批量轉換工具,無水印 + 高效處理指南

在辦公場景中&#xff0c;PDF 格式的 “不可編輯性” 常成為效率瓶頸 —— 從提取文字到格式轉換&#xff0c;從批量處理到文檔加密&#xff0c;往往需要多款工具協同。Total PDF Converter 破解專業版作為一站式 PDF 解決方案&#xff0c;不僅支持 11 種主流格式轉換&#xff…

[Windows] WPS官宣 64位正式版(12.1.0.22525)全新發布!

[Windows] WPS官宣 64位正式版 鏈接&#xff1a;https://pan.xunlei.com/s/VOYepABmXVfXukzlPdp8SKruA1?pwdeqku# 自2024年5月&#xff0c;WPS 64位版本在WPS社區發布第一個內測體驗安裝包以來&#xff0c;在近一年多的時間里&#xff0c;經過超過3萬名WPS體驗者參與版本測試…