欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java?SE封裝、包、static關(guān)鍵字和代碼塊示例詳解

 更新時(shí)間:2023年11月20日 09:21:01   作者:《黑巧克力》  
這篇文章主要給大家介紹了關(guān)于Java?SE封裝、包、static關(guān)鍵字和代碼塊的相關(guān)資料,需要的朋友可以參考下

1.封裝

1.1封裝的概念

面向?qū)ο蟪绦蛉筇匦裕悍庋b、繼承、多態(tài)。而類和對(duì)象階段,主要研究的就是封裝特性。何為封裝呢?簡(jiǎn)單來(lái)說(shuō)
就是套殼屏蔽細(xì)節(jié)。

封裝:將數(shù)據(jù)和操作數(shù)據(jù)的方法進(jìn)行有機(jī)結(jié)合,隱藏對(duì)象的屬性和實(shí)現(xiàn)細(xì)節(jié),僅對(duì)外公開(kāi)接口來(lái)和對(duì)象進(jìn)行交互

1.2封裝之訪問(wèn)限定符

一般我們封裝用到的訪問(wèn)限定符:pritave

class Student {
    private String name;
    private int age;
    
    public void exam() {
        System.out.println(this.name+"正在考試中");
    }
}
public class Main {
    public static void main(String[] args) {
        Student  student = new Student();
        student.name = "zhangsan";
    }
}

運(yùn)行報(bào)錯(cuò):

為什么會(huì)出現(xiàn)這個(gè)情況,因?yàn)閚ame這個(gè)成員變量在Student類中是被pritave修飾的。這樣就體現(xiàn)出了封裝性。

如果直接調(diào)用,那是不被允許的,那我們應(yīng)該怎么去調(diào)用這個(gè)成員變量呢?

我們可以在類中定義一個(gè)成員方法,然后再調(diào)用這個(gè)成員方法去訪問(wèn)成員變量,這是被允許的。這屬于間接去訪問(wèn),怎么實(shí)現(xiàn)呢?我們代碼實(shí)現(xiàn)一下:

 public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

setName方法是修改也可以賦值成員變量:

public class Main {
    public static void main(String[] args) {
        Student  student = new Student();
        student.setName("zhangsan");
    }
}

通過(guò)調(diào)試可以看到Student類中被private修飾的成員變量由null被賦為"zhangsan"

getName這個(gè)方法是可以訪問(wèn)到被private修飾的成員變量。

public class Main {
    public static void main(String[] args) {
        Student  student = new Student();
        student.setName("zhangsan");
        System.out.println(student.getName());
    }
}

通過(guò)調(diào)試看到可以通過(guò)這個(gè)方法訪問(wèn)到被private修飾的成員變量。

通過(guò)調(diào)用這兩個(gè)成員方法可以去訪問(wèn)類中被pritave修飾的成員變量。

在idea中寫(xiě)兩個(gè)方法有一個(gè)快捷鍵:

單擊右鍵之后:

2.包

2.1包的概念

在面向?qū)ο篌w系中,提出了一個(gè)軟件包的概念,即:為了更好的管理類,把多個(gè)類收集在一起成為一組,稱為軟件包。

在Java中也引入了包,包是對(duì)類、接口等的封裝機(jī)制的體現(xiàn),是一種對(duì)類或者接口等的很好的組織方式,比如:一個(gè)包中的類不想被其他包中的類使用。包還有一個(gè)重要的作用:在同一個(gè)工程中允許存在相同名稱的類,只要處在不同的包中即可。

2.2導(dǎo)入包中的類

在代碼中,如果我們有需要要用到的類的時(shí)候,可以直接導(dǎo)入這個(gè)類的包。

public class Test {
    public static void main(String[] args) {
        java.util.Date data = new java.util.Date();
    }
}

這么導(dǎo)會(huì)很麻煩,也會(huì)顯得代碼不夠簡(jiǎn)潔,也比較生澀難懂,可以使用 import語(yǔ)句導(dǎo)入包。

import java.util.Date;
public class Test {
    public static void main(String[] args) {
        Date date = new Date();
       //java.util.Date data = new java.util.Date();
    }
}

如果你不想只需要這一個(gè)類,而是想要這個(gè)包所有的類,你可以這樣import java.util.*

import java.util.*; 
public class Test {
    public static void main(String[] args) {
        Date date = new Date();
       //java.util.Date data = new java.util.Date();
    }
}

這樣只要是java.util包中的類都可以用了,我們可以看看這個(gè)包中還有什么其他類:

但是我們更建議顯式的指定要導(dǎo)入的類名. 否則還是容易出現(xiàn)沖突的情況。因?yàn)樵谝粋€(gè)類不僅僅在一個(gè)包中,有時(shí)候這個(gè)類在另一個(gè)包中內(nèi)容是不一樣的,為了讓編譯器可以更好的為我們服務(wù),我們盡量定義詳細(xì)的類名,而不是一個(gè)籠統(tǒng)的類。

import java.util.*;
import java.sql.*;
public class Test {
    public static void main(String[] args) {
        Date date = new Date();
       //java.util.Date data = new java.util.Date();
    }
}

在這里Date類就編譯報(bào)錯(cuò)了,所有我們還是將類的名字詳細(xì)點(diǎn)比較好。

可以使用import static導(dǎo)入包中靜態(tài)的方法和字段。

import static java.lang.Math.*;
public class Test {
public static void main(String[] args) {
double x = 30;
double y = 40;
// 靜態(tài)導(dǎo)入的方式寫(xiě)起來(lái)更方便一些.
// double result = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
double result = sqrt(pow(x, 2) + pow(y, 2));
System.out.println(result);
}
}

注意事項(xiàng): import 和 C++ 的 #include 差別很大. C++ 必須 #include 來(lái)引入其他文件內(nèi)容, 但是 Java 不需要.

import 只是為了寫(xiě)代碼的時(shí)候更方便. import 更類似于 C++ 的 namespace 和 using。

2.3自定義包

基本規(guī)則

在文件的最上方加上一個(gè) package 語(yǔ)句指定該代碼在哪個(gè)包中.

包名需要盡量指定成唯一的名字, 通常會(huì)用公司的域名的顛倒形式(例如 com.bao.www )

包名要和代碼路徑相匹配. 例如創(chuàng)建 com.bao.www 的包, 那么會(huì)存在一個(gè)對(duì)應(yīng)的路徑 com.bao.www 來(lái)存儲(chǔ)

代碼.

如果一個(gè)類沒(méi)有 package 語(yǔ)句, 則該類被放到一個(gè)默認(rèn)包中.

操作步驟:

在 IDEA 中先新建一個(gè)包: 右鍵 src -> 新建 -> 包:

在彈出的對(duì)話框中輸入包名, 例如:com.bao.www

在包中創(chuàng)建類, 右鍵包名 -> 新建-> 類, 然后輸入類名即可.

4.此時(shí)可以看到我們的磁盤上的目錄結(jié)構(gòu)已經(jīng)被 IDEA 自動(dòng)創(chuàng)建出來(lái)了:

5.同時(shí)我們也看到了, 在新創(chuàng)建的 Test.java 文件的最上方, 就出現(xiàn)了一個(gè) package 語(yǔ)句:

2.4常見(jiàn)的包

java.lang:系統(tǒng)常用基礎(chǔ)類(String、Object),此包從JDK1.1后自動(dòng)導(dǎo)入。

  • java.lang.reflect:java 反射編程包;
  • java.net:進(jìn)行網(wǎng)絡(luò)編程開(kāi)發(fā)包。
  • java.sql:進(jìn)行數(shù)據(jù)庫(kù)開(kāi)發(fā)的支持包。
  • java.util:是java提供的工具程序包。(集合類等) 非常重要
  • java.io:I/O編程開(kāi)發(fā)包。

3.static成員

public class Student{
// ...
public static void main(String[] args) {
Student s1 = new Student("Li leilei", "男", 18, 3.8);
Student s2 = new Student("Han MeiMei", "女", 19, 4.0);
Student s3 = new Student("Jim", "男", 18, 2.6);
}
}

在Student類中定義的成員變量,每個(gè)對(duì)象中都會(huì)包含一份(稱之為實(shí)例變量),因?yàn)樾枰褂眠@些信息來(lái)描述

具體的學(xué)生。而現(xiàn)在要表示學(xué)生上課的教室,這個(gè)教室的屬性并不需要每個(gè)學(xué)生對(duì)象中都存儲(chǔ)一份,而是需要讓所有的學(xué)生來(lái)共享。在Java中,被static修飾的成員,稱之為靜態(tài)成員,也可以稱為類成員,其不屬于某個(gè)具體的對(duì)象,是所有對(duì)象所共享的。

3.2static修飾成員變量

static修飾的成員變量,稱為靜態(tài)成員變量,靜態(tài)成員變量最大的特性:不屬于某個(gè)具體的對(duì)象,是所有對(duì)象所共享的,是屬于類的。

【靜態(tài)成員變量特性】

  • 不屬于某個(gè)具體的對(duì)象,是類的屬性,所有對(duì)象共享的,不存儲(chǔ)在某個(gè)對(duì)象的空間中
  • 既可以通過(guò)對(duì)象訪問(wèn),也可以通過(guò)類名訪問(wèn),但一般更推薦使用類名訪問(wèn)
  • 類變量存儲(chǔ)在方法區(qū)當(dāng)中
  • 生命周期伴隨類的一生(即:隨類的加載而創(chuàng)建,隨類的卸載而銷毀)

3.3 static修飾成員方法

一般類中的數(shù)據(jù)成員都設(shè)置為private,而成員方法設(shè)置為public,那設(shè)置之后,Student類中classRoom屬性如何

在類外訪問(wèn)呢?

public class Student{
private String name;
private String gender;
private int age;
private double score;
private static String classRoom = "Bit306";
// ...
}
public class TestStudent {
public static void main(String[] args) {
System.out.println(Student.classRoom);
}
}
編譯失?。?
Error:(10, 35) java: classRoom 在 extend01.Student 中是 private 訪問(wèn)控制

那static屬性應(yīng)該如何訪問(wèn)呢?

Java中,被static修飾的成員方法稱為靜態(tài)成員方法,是類的方法,不是某個(gè)對(duì)象所特有的。靜態(tài)成員一般是通過(guò)靜態(tài)方法來(lái)訪問(wèn)的。

【靜態(tài)方法特性】

  • 不屬于某個(gè)具體的對(duì)象,是類方法
  • 可以通過(guò)對(duì)象調(diào)用,也可以通過(guò)類名.靜態(tài)方法名(…)方式調(diào)用,更推薦使用后者
  • 不能在靜態(tài)方法中訪問(wèn)任何非靜態(tài)成員變量
  • 靜態(tài)方法中不能調(diào)用任何非靜態(tài)方法,因?yàn)榉庆o態(tài)方法有this參數(shù),在靜態(tài)方法中調(diào)用時(shí)候無(wú)法傳遞this引用

3.4static成員變量初始化

注意:靜態(tài)成員變量一般不會(huì)放在構(gòu)造方法中來(lái)初始化,構(gòu)造方法中初始化的是與對(duì)象相關(guān)的實(shí)例屬性靜態(tài)成員變量的初始化分為兩種:就地初始化 和 靜態(tài)代碼塊初始化。

就地初始化

就地初始化指的是:在定義時(shí)直接給出初始值

public class Student{
private String name;
private String gender;
private int age;
private double score;
private static String classRoom = "Bit306"; 
// ...
}

4.代碼塊

4.1代碼塊概念以及分類

使用 {} 定義的一段代碼稱為代碼塊。根據(jù)代碼塊定義的位置以及關(guān)鍵字,又可分為以下四種:

  • 普通代碼塊
  • 構(gòu)造塊
  • 靜態(tài)塊
  • 同步代碼塊(后續(xù)講解多線程部分再談)

4.2普通代碼塊

普通代碼塊:定義在方法中的代碼塊.

public class Main{
public static void main(String[] args) {
{ //直接使用{}定義,普通方法塊
int x = 10 ;
System.out.println("x1 = " +x);
}
int x = 100 ;
System.out.println("x2 = " +x);
}
}

4.3構(gòu)造代碼塊

構(gòu)造塊:構(gòu)造塊:定義在類中的代碼塊(不加修飾符)。也叫:實(shí)例代碼塊。構(gòu)造代碼塊一般用于初始化實(shí)例成員變量

public class Student{
//實(shí)例成員變量
private String name;
private String gender;
private int age;
private double score;
public Student() {
System.out.println("I am Student init()!");
}
//實(shí)例代碼塊
{
this.name = "bit";
this.age = 12;
this.sex = "man";
System.out.println("I am instance init()!");
}
public void show(){
System.out.println("name: "+name+" age: "+age+" sex: "+sex);
}
}
public class Main {
public static void main(String[] args) {
Student stu = new Student();
stu.show();
}
}

4.4靜態(tài)代碼塊

使用static定義的代碼塊稱為靜態(tài)代碼塊。一般用于初始化靜態(tài)成員變量。

public class Student{
private String name;
private String gender;
private int age;
private double score;
private static String classRoom;
//實(shí)例代碼塊
{
this.name = "bit";
this.age = 12;
this.gender = "man";
System.out.println("I am instance init()!");
}
// 靜態(tài)代碼塊
static {
classRoom = "bit306";
System.out.println("I am static init()!");
}
public Student(){
System.out.println("I am Student init()!");
}
public static void main(String[] args) {
Student s1 = new Student();
Student s2 = new Student();
}
}

4.5關(guān)于靜態(tài)代碼塊和實(shí)例化代碼塊還有構(gòu)造方法的執(zhí)行順序:

class Student {
        public String name;

    static {
        System.out.println("Student::static");
    }
    {
        System.out.println("實(shí)例化代碼實(shí)現(xiàn)");
    }
    public Student(String name) {
        this.name = name;
        System.out.println("構(gòu)造方法實(shí)現(xiàn)");
    }
}
public class Test {
    public static void main(String[] args) {
        Student student = new Student("xiaowang");
    }
}

先實(shí)現(xiàn)靜態(tài)代碼塊,然后是實(shí)例化代碼塊,最后是構(gòu)造方法。

再實(shí)例化一個(gè)對(duì)象,再實(shí)現(xiàn)一次:

class Student {
        public String name;

    static {
        System.out.println("Student::static");
    }
    {
        System.out.println("實(shí)例化代碼實(shí)現(xiàn)");
    }
    public Student(String name) {
        this.name = name;
        System.out.println("構(gòu)造方法實(shí)現(xiàn)");
    }
}
public class Test {
    public static void main(String[] args) {
        Student student = new Student("xiaowang");
        System.out.println("================");
        Student student1 = new Student("wangss");
    }
}

靜態(tài)代碼塊沒(méi)有執(zhí)行,因?yàn)殪o態(tài)代碼塊只執(zhí)行一次。

注意事項(xiàng)

  • 靜態(tài)代碼塊不管生成多少個(gè)對(duì)象,其只會(huì)執(zhí)行一次
  • 靜態(tài)成員變量是類的屬性,因此是在JVM加載類時(shí)開(kāi)辟空間并初始化的
  • 如果一個(gè)類中包含多個(gè)靜態(tài)代碼塊,在編譯代碼時(shí),編譯器會(huì)按照定義的先后次序依次執(zhí)行(合并)
  • 實(shí)例代碼塊只有在創(chuàng)建對(duì)象時(shí)才會(huì)執(zhí)行

總結(jié)

到此這篇關(guān)于Java SE封裝、包、static關(guān)鍵字和代碼塊的文章就介紹到這了,更多相關(guān)JavaSE封裝包static關(guān)鍵字和代碼塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于Java實(shí)現(xiàn)記事本功能

    基于Java實(shí)現(xiàn)記事本功能

    這篇文章主要為大家詳細(xì)介紹了基于Java實(shí)現(xiàn)記事本功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • Lombok中@Builder和@SuperBuilder注解的用法案例

    Lombok中@Builder和@SuperBuilder注解的用法案例

    @Builder?是?lombok?中的注解,可以使用builder()構(gòu)造的Person.PersonBuilder對(duì)象進(jìn)行鏈?zhǔn)秸{(diào)用,給所有屬性依次賦值,這篇文章主要介紹了Lombok中@Builder和@SuperBuilder注解的用法,需要的朋友可以參考下
    2023-01-01
  • Java Dubbo框架知識(shí)點(diǎn)梳理

    Java Dubbo框架知識(shí)點(diǎn)梳理

    這篇文章主要介紹了Java Dubbo框架知識(shí)點(diǎn)梳理,通過(guò)詳細(xì)的文字講解和代碼實(shí)例,梳理了Dubbo這個(gè)框架,需要的朋友可以參考下
    2021-06-06
  • Spring MVC 基于URL的映射規(guī)則(注解版)

    Spring MVC 基于URL的映射規(guī)則(注解版)

    這篇文章主要介紹了Spring MVC 基于URL的映射規(guī)則(注解版) ,詳細(xì)的介紹了幾種方式,有興趣的可以了解一下
    2017-05-05
  • springboot集成es詳解

    springboot集成es詳解

    這篇文章主要介紹了springboot集成es,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • SpringMvc接受請(qǐng)求參數(shù)的幾種情況演示

    SpringMvc接受請(qǐng)求參數(shù)的幾種情況演示

    Springmvc接受請(qǐng)求參數(shù)的幾種介紹,如何接受json請(qǐng)求參數(shù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-07-07
  • 關(guān)于Java反射機(jī)制 你需要知道的事情

    關(guān)于Java反射機(jī)制 你需要知道的事情

    這篇文章主要介紹了Java反射機(jī)制的相關(guān)內(nèi)容,涉及了class類的動(dòng)態(tài)加載,獲取成員變量、構(gòu)造函數(shù)信息等信息,需要的朋友可以參考下。
    2017-09-09
  • Spring的@RequestParam對(duì)象綁定方式

    Spring的@RequestParam對(duì)象綁定方式

    這篇文章主要介紹了Spring的@RequestParam對(duì)象綁定方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • C#創(chuàng)建Web應(yīng)用程序代碼實(shí)例

    C#創(chuàng)建Web應(yīng)用程序代碼實(shí)例

    本文主要通過(guò)實(shí)例代碼介紹了C#創(chuàng)建Web應(yīng)用程序,需要的朋友可以參考下
    2017-04-04
  • Java多線程通信問(wèn)題深入了解

    Java多線程通信問(wèn)題深入了解

    下面小編就為大家?guī)?lái)一篇深入理解JAVA多線程之線程間的通信方式。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2021-07-07

最新評(píng)論