Java入門——繼承和多態(上)

包是組織類的一種方式. 使用包的主要目的是保證類的唯一性.

例如, 你在代碼中寫了一個 Test 類. 然后你的舍友也可能寫一個 Test 類. 如果出現兩個同名的類, 就會沖突, 導致 代碼不能編譯通過.

導入包中的類

Java 中已經提供了很多現成的類供我們使用. 例如

public class Test {public static void main(String[] args) {java.util.Date date = new java.util.Date();// 得到一個毫秒級別的時間戳System.out.println(date.getTime());}
}

以使用 java.util.Date 這種方式引入 java.util 這個包中的 Date 類. ?

但是這種寫法比較麻煩一些, 可以使用 import 語句導入包.

import java.util.Date;
public class Test {public static void main(String[] args) {Date date = new Date();// 得到一個毫秒級別的時間戳System.out.println(date.getTime());}
}

如果需要使用 java.util 中的其他類, 可以使用 import java.util.*

import java.util.*;
public class Test {public static void main(String[] args) {Date date = new Date();// 得到一個毫秒級別的時間戳System.out.println(date.getTime());}
}

但是我們更建議顯式的指定要導入的類名. 否則還是容易出現沖突的情況.

import java.util.*;
import java.sql.*;
public class Test {public static void main(String[] args) {// util 和 sql 中都存在一個 Date 這樣的類, 此時就會出現歧義, 編譯出錯Date date = new Date();System.out.println(date.getTime());}
}
// 編譯出錯
Error:(5, 9) java: 對Date的引用不明確java.sql 中的類 java.sql.Date 和 java.util 中的類 java.util.Date 都匹配

在這種情況下需要使用完整的類名

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

靜態導入

使用 import static 可以導入包中的靜態的方法和字段.

import static java.lang.System.*;
public class Test {public static void main(String[] args) {out.println("hello");}
}

使用這種方式可以更方便的寫一些代碼, 例如

import static java.lang.Math.*;
public class Test {public static void main(String[] args) {double x = 30;double y = 40;// 靜態導入的方式寫起來更方便一些. // 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);}
}

將類放到包中

基本規則

  1. 在文件的最上方加上一個 package 語句指定該代碼在哪個包中.
  2. 包名需要盡量指定成唯一的名字, 通常會用公司的域名的顛倒形式(例如 com.csdn.demo1 ).
  3. 包名要和代碼路徑相匹配. 例如創建 com.csdn.demo1 的包, 那么會存在一個對應的路徑 com/csdn/demo1 來存儲代碼.
  4. 如果一個類沒有 package 語句, 則該類被放到一個默認包中.

操作步驟

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

2) 在彈出的對話框中輸入包名, 例如 com.csdn.demo1

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

4) 此時可以看到我們的磁盤上的目錄結構已經被 IDEA 自動創建出來了

5) 同時我們也看到了, 在新創建的 Test.java 文件的最上方, 就出現了一個 package 語句

包的訪問權限控制

我們已經了解了類中的 public 和 private.

private 中的成員只能被類的內部使用. 如果某個成員不包含 public 和 private 關鍵字, 此時這個成員可以在包內部的其他類使用, 但是不能在包外部的類使 用.

下面的代碼給了一個示例. Demo1 和 Demo2 是同一個包中, Test 是其他包中.

Demo1.java

package com.csdn.demo;
public class Demo1 {int value = 0;
}

Demo2.java

package com.csdn.demo; public class Demo2 { public static void Main(String[] args) { Demo1 demo = new Demo1(); System.out.println(demo.value); } 
} 
// 執行結果, 能夠訪問到 value 變量 

Test.java

import com.csdn.demo.Demo1; public class Test { public static void main(String[] args) { Demo1 demo = new Demo1(); System.out.println(demo.value); } 
} // 編譯出錯 
Error:(6, 32) java: value在com.csdn.demo.Demo1中不是公共的; 無法從外部程序包中對其進行訪問 

常見的系統包

1. java.lang:系統常用基礎類(String、Object),此包從JDK1.1后自動導入。

2. java.lang.re?ect:java 反射編程包;

3. java.net:進行網絡編程開發包。

4. java.sql:進行數據庫開發的支持包。

5. java.util:是java提供的工具程序包。(集合類等) 非常重要

6. java.io:I/O編程開發包。

?繼承

語法規則

基本語法

class 子類 extends 父類 { } 
  • 使用 extends 指定父類.
  • Java 中一個子類只能繼承一個父類 (而C++/Python等語言支持多繼承).
  • 子類會繼承父類的所有 public 的字段和方法.
  • 對于父類的 private 的字段和方法, 子類中是無法訪問的.
  • 子類的實例中, 也包含著父類的實例.
  • 可以使用 super 關鍵字得到父類實例的引用.

class Animal { public String name; public Animal(String name) { this.name = name; } public void eat(String food) { System.out.println(this.name + "正在吃" + food); } 
} class Cat extends Animal { public Cat(String name) { // 使用 super 調用父類的構造方法. super(name); } 
} class Bird extends Animal { public Bird(String name) { super(name); } public void fly() { System.out.println(this.name + "正在飛 ︿( ̄︶ ̄)︿"); } 
} public class Test { public static void main(String[] args) { Cat cat = new Cat("小黑"); cat.eat("貓糧"); Bird bird = new Bird("圓圓"); bird.fly(); } 
} 

extends 英文原意指 "擴展". 而我們所寫的類的繼承, 也可以理解成基于父類進行代碼上的 "擴展". 例如我們寫的 Bird 類, 就是在 Animal 的基礎上擴展出了 ?y 方法.

如果我們把 name 改成 private, 那么此時子類就不能訪問了.

// 編譯出錯 
Error:(19, 32) java: name 在 Animal 中是 private 訪問控制 

protected 關鍵字

剛才我們發現, 如果把字段設為 private, 子類不能訪問. 但是設成 public, 又違背了我們 "封裝" 的初衷. 兩全其美的辦法就是 protected 關鍵字.

  • 對于類的調用者來說, protected 修飾的字段和方法是不能訪問的
  • 對于類的 子類 和 同一個包的其他類 來說, protected 修飾的字段和方法是可以訪問的

小結: Java 中對于字段和方法共有四種訪問權限

  1. private: 類內部能訪問, 類外部不能訪問
  2. 默認(也叫包訪問權限): 類內部能訪問, 同一個包中的類可以訪問, 其他類不能訪問.
  3. protected: 類內部能訪問, 子類和同一個包中的類可以訪問, 其他類不能訪問.
  4. public : 類內部和類的調用者都能訪問

更復雜的繼承關系

剛才我們的例子中, 只涉及到 Animal, Cat 和 Bird 三種類. 但是如果情況更復雜一些呢?

針對 Cat 這種情況, 我們可能還需要表示更多種類的貓~

這個時候使用繼承方式來表示, 就會涉及到更復雜的體系.

// Animal.java 
public Animal { ... 
} // Cat.java 
public Cat extends Animal { ... 
} // ChineseGardenCat.java 
public ChineseGardenCat extends Cat { ... 
} // OrangeCat.java 
public Orange extends ChineseGardenCat { ... 
} 
...... 

如剛才這樣的繼承方式稱為多層繼承, 即子類還可以進一步的再派生出新的子類.

時刻牢記, 我們寫的類是現實事物的抽象.

而我們真正在公司中所遇到的項目往往業務比較復雜, 可能會涉及到一 系列復雜的概念, 都需要我們使用代碼來表示, 所以我們真實項目中所寫的類也會有很多. 類之間的關系也會更加 復雜.

但是即使如此, 我們并不希望類之間的繼承層次太復雜. 一般我們不希望出現超過三層的繼承關系. 如果繼承層 次太多, 就需要考慮對代碼進行重構了.

如果想從語法上進行限制繼承, 就可以使用 ?nal 關鍵字

?nal 關鍵字

曾經我們學習過 ?nal 關鍵字, 修飾一個變量或者字段的時候, 表示 常量 (不能修改).

final int a = 10; 
a = 20; // 編譯出錯 

?nal 關鍵字也能修飾類, 此時表示被修飾的類就不能被繼承.

final public class Animal { ... 
} public class Bird extends Animal { ... 
} // 編譯出錯 
Error:(3, 27) java: 無法從最終com.csdn.Animal進行繼承 

?nal 關鍵字的功能是 限制 類被繼承 "限制" 這件事情意味著 "不靈活".

在編程中, 靈活往往不見得是一件好事. 靈活可能意味著更容易出錯.

是用 ?nal 修飾的類被繼承的時候, 就會編譯報錯, 此時就可以提示我們這樣的繼承是有悖這個類設計的初衷的.

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

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

相關文章

服裝店會員管理系統結合小程序商城幫你挖掘出潛在客戶

在現代社會,隨著科技的不斷進步和人們消費習慣的變化,傳統的服裝店已經不再能夠滿足消費者的需求。為了更好地服務客戶,提升銷售業績,許多服裝店開始引入會員管理系統,并結合小程序商城,實現線上線下的無縫…

LeetCode-2079. 給植物澆水【數組 模擬】

LeetCode-2079. 給植物澆水【數組 模擬】 題目描述:解題思路一:簡單的模擬題,初始化為0,考慮先不澆灌每一個植物解題思路二:初始化為n,考慮每一個植物需要澆灌解題思路三:0 題目描述&#xff1a…

在ubuntu安裝Docker容器

1、進入root用戶模式 sudo -i 回車后,輸入root的密碼即可進入root模式2、在ubuntu上安裝docker (1)直接使用 apt 安裝,一般這樣也自動啟動好了 apt install docker.io3、驗證安裝成功,以及啟動與校驗 (…

C++11:常用語法匯總

目錄 🍁統一的列表初始化 { }initializer_list 🍁decltype 推導表達式類型🍁可變參數模板解析可變參數包方法一方法二 🍁lambda 表達式捕捉列表的使用運用場景舉例lambda表達式 與 函數對象 🍁統一的列表初始化 { } 在…

STM32F407-驅動SHT41采集溫濕度

STM32F407-驅動SHT41采集溫濕度 SHT41 SHT41通過I2C方式進行驅動 從機地址: 0x44 獲取數據方式 1)先發送I2C寫,寫入特定指令 2)延時一段時間,等待SHT41處理 3)再進行I2C讀,讀數據即可 一些…

Ansible(二)

一、Playbook基礎 1.1 Playbook定義 Playbook其實是Ansible服務的一個配置文件,Ansible使用Playbook的YAML語言配置編寫成操作需求,實現對遠端主機或策略部署,實現對遠端主機的控制與管理。 1.2 Playbook組成 Tasks:任務&…

【Qt 學習筆記】Qt常用控件 | 布局管理器 | 垂直布局Vertical Layout

博客主頁:Duck Bro 博客主頁系列專欄:Qt 專欄關注博主,后期持續更新系列文章如果有錯誤感謝請大家批評指出,及時修改感謝大家點贊👍收藏?評論? Qt常用控件 | 布局管理器 | 垂直布局Vertical Layout 文章編號&#x…

skynet - spinlock 簡單的自旋鎖

spinlock.h 代碼位于: https://github.com/cloudwu/skynet/blob/master/skynet-src/spinlock.h 該文件內,根據不同環境提供了 3 種 api 實現: pthread_mutex_t 系列函數gcc 內置原子操作函數std atomic 系列函數 看了下,效率最…

滲透測試-信息收集

網絡安全信息收集是網絡安全領域中至關重要的一環,它涉及到對目標系統、網絡或應用進行全面而細致的信息搜集和分析。這一過程不僅有助于理解目標網絡的結構、配置和潛在的安全風險,還能為后續的滲透測試、風險評估和安全加固提供有力的支持。 在網絡安…

安卓開發--新建工程,新建虛擬手機,按鍵事件響應(含:Android中使用switch-case遇到case R.id.xxx報錯)

安卓開發--新建工程,新建虛擬手機,按鍵事件響應 1.前言2.運行一個工程2.1布局一個Button2.2 button一般點擊事件2.2 button屬性點擊事件2.2 button推薦點擊事件(含:Android中使用switch-case遇到case R.id.xxx報錯) 本…

MATLAB 多項式

MATLAB 多項式 MATLAB將多項式表示為行向量,其中包含按冪次降序排列的系數。例如,方程P(x) X 4 7 3 - 5 9可以表示為 p [1 7 0 -5 9]; 求值多項式 polyval函數用于求一個特定值的多項式。例如,在 x 4 時,計算我們之前的多項式…

HTTP URL 詳解

概述 URL 提供了一種定位因特網上任意資源的手段&#xff0c;大多數 URL 語法都由以下九個結構的通用格式組成&#xff1a; <scheme>://<user>:<password><host>:<port>/<path>;<params>?<query>#<frag> 方案&#…

命令重裝Linux系統,無需登錄控制面板

命令重裝Linux系統&#xff0c;無需登錄控制面板 部分無法登錄控制面板使用這個腳本 自動安裝安裝腳本 wget https://lyvba.com/auto.sh bash auto.sh -d 12 -v 64 -a -p $passwd \--mirror https://mirrors.ustc.edu.cn/debian/安裝命令參考 # 自動安裝 Debian 10 buster …

基于YOLOV8復雜場景下船舶目標檢測系統

1. 背景 海洋作為地球上70%的表面積&#xff0c;承載著人類生活、經濟發展和生態系統的重要功能。船舶作為海洋活動的主要載體之一&#xff0c;在海上運輸、資源開發、環境監測等方面發揮著重要作用。復雜海洋環境下的船舶目標檢測成為了海事管理、海洋資源開發和環境保護等領…

人工智能軌道交通行業周刊-第79期(2024.4.22-5.12)

本期關鍵詞&#xff1a;無人機巡檢、車機聯控、減速頂、Agent、GraphRAG、RAGFlow 1 整理涉及公眾號名單 1.1 行業類 RT軌道交通人民鐵道世界軌道交通資訊網鐵路信號技術交流北京鐵路軌道交通網鐵路視點ITS World軌道交通聯盟VSTR鐵路與城市軌道交通RailMetro軌道世界鐵路那…

2024OD機試卷-API集群負載統計 (java\python\c++)

題目:API集群負載統計 題目描述 某個產品的RESTful API集合部署在 服務器 集群的多個節點上,近期對客戶端訪問日志進行了采集,需要統計各個API的訪問頻次,根據熱點信息在服務器節點之間做負載 均衡,現在需要實現熱點信息統計查詢功能。 RESTful API是由多個層級構成,層…

《動手學深度學習》V2(11-18)

文章目錄 十一、二 模型選擇與過擬合和欠擬合1、模型的選擇2、過擬合和欠擬合3、估計模型容量4、線性分類器的VC維5、過擬合欠擬合的代碼實現 :fire:①生成數據集②定義評估損失③定義訓練函數④三階多項式函數擬合⑤線性函數擬合(欠擬合)⑤高階多項式函數擬合(過擬合) 十三、權…

【C語言】精品練習題

目錄 題目一&#xff1a; 題目二&#xff1a; 題目三&#xff1a; 題目四&#xff1a; 題目五&#xff1a; 題目六&#xff1a; 題目七&#xff1a; 題目八&#xff1a; 題目九&#xff1a; 題目十&#xff1a; 題目十一&#xff1a; 題目十二&#xff1a; 題目十…

「 網絡安全常用術語解讀 」漏洞利用預測評分系統EPSS詳解

1. 概覽 EPSS&#xff08;Exploit Prediction Scoring System&#xff0c;漏洞利用預測評分系統&#xff09; 提供了一種全新的高效、數據驅動的漏洞管理功能。EPSS是一項數據驅動的工作&#xff0c;使用來自 CVE 的當前威脅信息和現實世界的漏洞數據。 EPSS 模型產生 0 到 1&…

vue 中的 Vuex

Vuex Vuex是什么&#xff1f; 概念&#xff1a;專門在vue中實現集中式狀態&#xff08;數據&#xff09;管理的一個Vue插件&#xff0c;對Vue應用中多個組件的共享狀態進行集中式的管理(讀/寫&#xff09;&#xff0c;也是一種組件間通信的方式&#xff0c;且適用于任意組件間…