java中static, final, 內部類的具體運用

2021-01-11 我愛紅棗

static概念:

static它是靜態修飾符,一般用來修飾類中的成員。

當在定義類的時候,類中都會有相應的屬性和方法。而屬性和方法都是通過創建本類對象調用的。

static特點:

static是靜態修飾符,一般修飾成員。被static修飾的成員屬於類,不屬於單個這個類的某個對象。

static修飾的成員被多個對象共享。

static修飾的成員屬於類,但是會影響每一個對象。

被static修飾的成員又叫類成員,不叫對象的成員。

static修飾後成員的使用:

被static修飾的成員可以並且建議通過類名直接訪問。也可以通過某個對象訪到屬於類的靜態成員,原因即多個對象均屬於一個類,共享使用同一個靜態成員。

格式:

類名.靜態成員變量名

類名.靜態成員方法名(參數)

代碼演示:

class Demo{

//非靜態成員變量

public int num1 = 100;

//靜態成員變量

public static int num2 = 100;

//非靜態方法

public void method(){

System.out.println("靜態方法")

}

//靜態方法

public staic void method(){

System.out.println("靜態方法");

}

}

class test{

public staic void main(String[] args) {

System.out.println(Demo.num2);

Demo.method();

}

}

靜態代碼塊:

靜態代碼塊是定義在成員位置,使用static修飾的代碼塊。

特點:

在一同一個類中,它優先於主方法執行、優先於構造代碼塊執行,當以任意形式第一次使用到該類時執行。

該類不管創建多少對象,靜態代碼塊只執行一次。

可用於給靜態變量賦值,用來給類進行初始化。

public class Person {

private String name;

private int age;

//靜態代碼塊

static{

System.out.println("靜態代碼塊執行了");

}

}

final關鍵字:

關鍵字final,final的意思為最終,不可變。final是個修飾符,它可以用來修飾類,類的成員方法,以及變量(成員變量和局部變量)。

final的特點:

inal修飾類不可以被繼承,但是可以繼承其他類。

class Yy {}

final class Fue xtendsYy{} //可以繼承Yy 類

class Zi extends Fu{}

final修飾的方法不可以被覆蓋,但父類中沒有被final修飾方法,子類覆蓋後可以加final。

class Fu{

// final修飾的方法,不可以被覆蓋,但可以繼承使用

public final void method(){}

public void method2(){

}

class Zi extends Fu{

//重寫method2方法

public final void method2(){}

}

final修飾的變量稱為常量,這些變量只能賦值一次。

final int i = 20;

i=30; //賦值報錯,final修飾的變量只能賦值一次

引用類型的變量值為對象地址值,地址值不能更改,但是地址內的對象屬性值可以修改。

final person p = new Person();

Person p2 = new Person();

p=p2; //final修飾的變量p,所記錄的地址值不能改變

p.name = "小明";//可以更改p對象中name屬性值

p不能為別的對象,而p對象中的name或age屬性值可更改。

修飾成員變量,需要在創建對象前賦值,否則報錯。

也可以成員變量不賦值,但是構造方法必須賦值

class Demo{

//直接賦值

final int m = 100;

//final修飾的成員變量,需要在創建對象前賦值0,否則報錯。

final int n;

public Demo(){

//可以在創建對象時所調用的構造方法中,為變量n賦值

n = 2016;

}

}

包的概念:

java的包,其實就是我們電腦系統中的文件夾,包裡存放的是程序生成的.class文件。

類中聲明的包必須與實際class文件所在的文件夾情況相一致,即類聲明在a包下,則生成的.class文件必須在a文件夾下,否則,程序運行時會找不到類。

包的聲明格式:

package cn.itdemo; //包的聲明,必須在有效代碼的第一行

import java.util.Scanner;

import java.util.Random;

public class Demo {}

通常import導包

java四種訪問權限修飾符:

在Java中提供了四種訪問權限,使用不同的訪問權限時,被修飾的內容會有不同的訪問權限,以下表來說明不同權限的訪問能力:

歸納一下:在日常開發過程中,編寫的類、方法、成員變量的訪問

要想僅能在本類中訪問使用private修飾;

要想本包中的類都可以訪問不加修飾符即可;

要想本包中的類與其他包中的子類可以訪問使用protected修飾

要想所有包中的所有類都可以訪問使用public修飾。

注意:如果類用public修飾,則類名必須與文件名相同。一個文件中只能有一個public修飾的類。

內部類;

將類寫在其他類的內部,可以寫在其他類的成員位置和局部位置,這時寫在其他類內部的類就稱為內部類。其他類也稱為外部類。

內部類分為成員內部類與局部內部類。

成員內部類:

成員內部類,定義在外部類中的成員位置。與類中的成員變量相似,可通過外部類對象進行訪問

定義格式

class 外部類 {

修飾符 class 內部類 {

//其他代碼

}

}

訪問方式

外部類名.內部類名 變量名 = new 外部類名().new 內部類名();

成員內部類代碼演示

定義類

class Body {//外部類,身體

private boolean life= true; //生命狀態

public class Heart { //內部類,心臟

public void jump() {

System.out.println("心臟噗通噗通的跳")

System.out.println("生命狀態" + life); //訪問外部類成員變量

}

}

}

訪問內部類

public static void main(String[] args) {

//創建內部類對象

Body.Heart bh = new Body().new Heart();

//調用內部類中的方法

bh.jump();

}

匿名內部類:

定義的匿名內部類有兩個含義:

臨時定義某一指定類型的子類

定義後即刻創建剛剛定義的這個子類的對象

定義匿名內部類的作用與格式:

作用:匿名內部類是創建某個類型子類對象的快捷方式。

格式:

new 父類或接口(){

//進行方法重寫

};

代碼演示

匿名內部類如果不定義變量引用,則也是匿名對象。代碼如下:

new Myinter(){

public void show() {

System.out.println(「匿名內部類的show方法」);

}

}.show();

l 代碼演示

//已經存在的父類:

public abstract class Animal{

public abstract void eat();

}

//定義並創建該父類的子類對象,並用多態的方式賦值給父類引用變量

Animal aa = new Animal(){

public void eat() {

System.out.println(「我吃了」);

}

};

//調用eat方法

aa.eat();

使用匿名對象的方式,將定義子類與創建子類對象兩個步驟由一個格式一次完成,。雖然是兩個步驟,但是兩個步驟是連在一起完成的。

類作為方法參數和返回值:

public static usePerson(Person p){

p.eat();

p.speak();

}

public static getPerson(){

return new Person();

}

抽象類作為方法參數和返回值:

public static useAnimal(Animal a){

a.eat()

}

pubic static Animal getAnimal(){

return new Cat()

}

接口作為方法參數和返回值:

public static void useUSB(USB u){

u.open();

u.close()

}

public static USB getUSB(){

return new Mouse();

相關焦點

  • [博客更新]Java 中 final 關鍵詞的使用
    上一篇文章我們講了 java 中 static 關鍵字的使用,這裡再將一下 final 關鍵字的使用。final 在 java 中可以看做一個「終結者」,它可以定義類、定義方法和定義變量。當定義類的時候,該類不能被繼承當定義方法的時候,該方法不能被子類覆蓋(Override)當定義變量的時候,該變量只能在定義的時候初始化,後期不能做改變,即變為一個常量。
  • 深入理解Java中的final關鍵字
    final經常和static一起使用來聲明常量。1、final方法在編譯階段綁定,稱為靜態綁定(static binding),編譯時常量,永遠不可改變。2、運行期初始化,我們希望它不會改變。3、接口中聲明的所有變量本身是final的。4、對於集合對象聲明為final指的是引用不能被更改,但是你可以向其中增加,刪除或者改變內容。
  • 【答疑解惑】java中static關鍵字的作用
  • 「原創」為什麼java中一切都是對象,還要有static?
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫目錄1、static的「由來」2、static的使用場景並且由於這個特性,在靜態方法中不能訪問類的非靜態成員變量和非靜態成員方法,因為非靜態成員方法/變量都是必須依賴具體的對象才能夠被調用。但是要注意的是,雖然在靜態方法中不能訪問非靜態成員方法和非靜態成員變量,但是在非靜態成員方法中是可以訪問靜態成員方法/變量的。
  • Java之局部內部類的final問題
    各位小夥伴們大家好,在之前的文章中,小編有介紹過局部內部類Java之局部內部類的定義與使用,這次小編要補充一點,局部內部類的final問題。在局部內部類當中,如果希望訪問所在方法的局部變量,那麼這個局部變量必須是【有效final的】。
  • Java中static變量作用和用法詳解
    static變量前可以有private修飾,表示這個變量可以在類的靜態代碼塊中,或者類的其他靜態成員方法中使用(當然也可以在非靜態成員方法中使用–廢話),但是不能在其他類中通過類名來直接引用,這一點很重要。實際上你需要搞明白,private是訪問權限限定,static表示不要實例化就可以使用,這樣就容易理解多了。static前面加上其它訪問權限關鍵字的效果也以此類推。
  • 「原創」Java並發編程系列06|你不知道的final
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫final在Java中是一個保留的關鍵字,可以修飾變量、方法和類。那麼fianl在並發編程中有什麼作用呢?本文就在對final常見應用總結基礎上,講解final並發編程中的應用。
  • Java 中的繼承和多態(深入版)
    在虛擬機中多態如何表現前文我們知道,java文件在經過javac編譯後,生成class文件之後在JVM中再進行編譯後生成對應平臺的機器碼。而JVM的編譯過程中體現多態的過程,在於選擇出正確的方法執行,這一過程稱為方法調用。方法調用的唯一任務是確定被調用方法的版本,暫時還不涉及方法內部的具體運行過程。
  • Java基礎面試題簡單總結
    註: 靜態內部類(InnerClass)意味著1創建一個static內部類的對象,不需要一個外部類對象,2不能從一個static內部類的一個對象訪問一個外部類對象4、&和&&的區別答:&是位運算符,表示按位與運算,&
  • 一文解析Java常用關鍵字
    一、前言 本文介紹六個關鍵字:static、final、extends、implements、this、super,下面具體介紹各個關鍵字及需要注意的點。
  • Java 訪問權限控制:你真的了解 protected 關鍵字嗎?
    在Java中,類成員訪問權限修飾詞有四類:private,無(包訪問權限),protected 和 public,而其中只有包訪問權限和public才能修飾一個類(內部類除外)。特別地,很多Java書籍對protected可見性的介紹都比較籠統,本文重點說明了protected關鍵字的可見性內涵,並介紹了一些其他的修飾符。一.
  • Java中有這玩意?
    >實例方法引用,通過實例對象::實例方法,如 str::substring構造方法引用,通過類名::new, 如 User::new二:方法引用public final class Integer {public
  • Thinking In Java --- 復用類(筆記)
    對於編譯器常量這種情況,編譯器可以將該常量值帶入任何可能用到它的計算式中,也就是說,可以在編譯時執行計算式,這減輕了一些運行時的負擔。在Java中,這類常量必須是基本數據類型,並且以關鍵字final表示。在對這個常量進行定義的時候,必須對其進行賦值。一個既是static又是final的域只佔據一段不能改變的存儲空間。
  • 「原創」Java並發編程系列22|倒計時器CountDownLatch
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫並發編程中常遇到這種情況,一個線程需要等待另外多個線程執行後再執行。遇到這種情況你一般怎麼做呢?今天就介紹一種JDk提供的解決方案來優雅的解決這一問題,那就是倒計時器CountDownLatch。
  • Java之final關鍵字的簡單介紹中
    各位小夥伴,大家好,在之前的文章小編有介紹過關鍵字fina修飾類和成員方法Java之final關鍵字的簡單介紹上。這次,小編要介紹的是關鍵字final修飾局部變量。代碼如下:public class Demo01Final {public static void main(String[] args) {int num1=11;System.out.println(num1);num1=12;//變量可以改變Java之成員變量和局部變量的區別System.out.println(num1);//一旦使用final來修飾變量,這個變量就不能進行改變
  • Java之final關鍵字詳解
    前言針對Java語言中的final關鍵字,想必都不陌生了。本來主要是來對final做關鍵字做一個總結。final關鍵字用法修飾類當用final去修飾一個類的時候,表示這個類不能被繼承。注意:a.被final修飾的類,final類中的成員變量可以根據自己的實際需要設計為fianl。b. final類中的成員方法都會被隱式的指定為final方法。說明:在自己設計一個類的時候,要想好這個類將來是否會被繼承,如果可以被繼承,則該類不能使用fianl修飾,在這裡呢,一般來說工具類我們往往都會設計成為一個fianl類。在JDK中,被設計為final類的有String、System等。
  • 這些 Java 8 官方挖的坑,你踩過幾個?
    於是乎,我手賤地修改了代碼,改用了jdk8自帶的Base64方法import java.util.Base64;public class Base64Utils {    public static final Base64.Decoder DECODER
  • Java中抽象類和接口的介紹及二者間的區別
    但是要注意,接口中的變量會被隱式地指定為public static final變量(並且只能是public static final變量,用private修飾會報編譯錯誤),而方法會被隱式地指定為public abstract方法且只能是public abstract方法(用其他關鍵字,比如private、protected、static、 final等修飾會報編譯錯誤),並且接口中所有的方法不能有具體的實現
  • 「原創」Java並發編程系列36|FutureTask
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫線程池源碼中出現了很多Callable、Future、FutureTask等以前沒介紹過的接口,尤其是線程池提交任務時總是把任務封裝成FutureTask,今天就來為大家解惑: