中南林业科技大学Java实验报告八:包与接口
文章目錄
- 實(shí)驗(yàn)8:包與接口
- 8.1 實(shí)驗(yàn)?zāi)康?/li>
- 8.2 實(shí)驗(yàn)內(nèi)容
- 8.2.1 編寫兩個(gè)Java程序,在Tree.java中,顯示“我是一棵樹”,在Bamboo.java中,顯示“我是一棵竹子”。(實(shí)驗(yàn)需在命令行中進(jìn)行編譯)
- 8.2.1.1 將Tree.java和Bamboo.java放與同一文件夾下
- 8.2.1.2 將Tree.java和Bamboo.java放與不同文件夾下
- 8.2.2 編寫一個(gè)Java程序,在程序中定義一個(gè)接口Bulid,定義一個(gè)類Tree實(shí)現(xiàn)接口,在Tree類中實(shí)現(xiàn)Bulid的接口。
- 8.2.3 定義個(gè)類Plant,修改(2)聲明Tree類繼承Plant類,同時(shí)實(shí)現(xiàn)的Bulid接口內(nèi)容不變。
實(shí)驗(yàn)8:包與接口
8.1 實(shí)驗(yàn)?zāi)康?/h2>
- 了解多個(gè)目錄下,多個(gè)類并存且由類同名的情況下對(duì)程序運(yùn)行的影響
- 掌握J(rèn)ava程序中包的定義以及使用方法
- 掌握接口定義的語(yǔ)法格式、成員變量的定義、成員方法的定義
- 掌握接口實(shí)現(xiàn)的語(yǔ)法格式
- 掌握接口的使用和Java語(yǔ)言中利用接口實(shí)現(xiàn)多重繼承
8.2 實(shí)驗(yàn)內(nèi)容
實(shí)驗(yàn)指導(dǎo)中的代碼直接插到這里來(lái)了
8.2.1 編寫兩個(gè)Java程序,在Tree.java中,顯示“我是一棵樹”,在Bamboo.java中,顯示“我是一棵竹子”。(實(shí)驗(yàn)需在命令行中進(jìn)行編譯)
8.2.1.1 將Tree.java和Bamboo.java放與同一文件夾下
【前提引入】
1?? 如果代碼中含有中文并且是在windows的cmd命令行進(jìn)行javac編譯指令的執(zhí)行,如果直接使用javac Tree.java是會(huì)報(bào)錯(cuò):不可映射的字符集編碼。
📍 解決方案:
2?? 對(duì)下面的代碼顯示的結(jié)果分析:
Tree.java 和 Bamboo.java 文件中都含有 Living 類,因此我們?nèi)绻@樣執(zhí)行:
【核心代碼】
🌿 Tree.java
public class Tree {public static void main(String[] args){Living tree=new Living ();tree.say();} } class Living {public void say(){System.out.println("我是一棵樹");} }🌿 Bamboo.java
public class Bamboo {public static void main(String[] args){Living bamboo =new Living ();bamboo.say();} } class Living {public void say(){System.out.println("我是一棵竹子");} }【運(yùn)行流程】
將Tree.java和Bamboo.java放與同一文件夾下。
編譯Tree.java,運(yùn)行Tree,觀察提示結(jié)果。
編譯Bammboo.java,運(yùn)行Bammboo,觀察提示結(jié)果。
運(yùn)行Tree,觀察提示結(jié)果
8.2.1.2 將Tree.java和Bamboo.java放與不同文件夾下
【前提引入】
1?? 如果將兩個(gè)Living類分別放在兩個(gè)文件夾Tree和Bamboo中,這樣在編譯這兩個(gè) Living.java 的時(shí)候由于在不同文件下生成 Living.class 字節(jié)碼二進(jìn)制文件,肯定就不會(huì)造成命名沖突,也就不會(huì)造成覆蓋問題。
📦 談一談包
-
包的三大作用
- 目的是區(qū)分相同名字的類
- 當(dāng)類很多的時(shí)候,能夠很好的管理類
- 控制訪問范圍
-
基礎(chǔ)語(yǔ)法
/* 聲明包:package 關(guān)鍵字 打包名稱聲明當(dāng)前類所在的包 */ package com.bamboo //聲明當(dāng)前類是在com包下的子包bamboo下/*引用包:import 關(guān)鍵字 打包名稱引用某個(gè)類 */ import java.util.Scanner; //引用到 java包下 的 util包 中的 Scanner類文件 import java.net.* //引用java包下 的 net包 中的 所有類文件 -
本質(zhì)
實(shí)際上就是創(chuàng)建不同的 文件夾/目錄 來(lái)保存類文件
-
注意事項(xiàng)
- package的作用是聲明當(dāng)前類所在的包,需要放在類的最上面,一個(gè)類中最多只能有一句package。
- import指令位置放在package下面,在類定義上面,可以有多句且沒有順序要求。
【核心代碼】
-
Tree文件夾下的Living.java
package Tree; //當(dāng)前在Tree包中 public class Living {public void say(){System.out.println("我是一棵樹");} } -
Bamboo文件夾下的Living.java
package Bamboo; //聲明當(dāng)前在 Bamboo包下 public class Living {public void say(){System.out.println("我是一個(gè)小竹子");} } -
package-interface文件夾下的Tree.java
import Tree.Living; //引用在Tree包下的Living類 public class Tree {public static void main(String[] args){Living tree=new Living ();tree.say();} } -
package-interface文件夾下的Bambo.java
import Bamboo.Living; //找Bamboo包下的Living類 public class Bamboo {public static void main(String[] args){Living bamboo=new Living ();bamboo.say();} }
【運(yùn)行流程】
將兩個(gè)Living類分別放在兩個(gè)文件夾Tree和Bamboo中,Tree.java和Bamboo.java放在根目錄(文件夾Tree和Bamboo的上一級(jí)目錄下)
編譯Tree.java和Living.java,運(yùn)行Tree,觀察提示結(jié)果。
#依次執(zhí)行以下代碼 javac -encoding utf8 Tree\Living.javajavac -encoding utf8 Tree.javajava Tree編譯Bamboo.java和Living.java,運(yùn)行Bamboo,觀察提示結(jié)果。
#依次執(zhí)行以下代碼 javac -encoding utf8 Bamboo\Living.javajavac -encoding utf8 Bamboo.javajava Bamboo再次運(yùn)行Tree,查看結(jié)果。
8.2.2 編寫一個(gè)Java程序,在程序中定義一個(gè)接口Bulid,定義一個(gè)類Tree實(shí)現(xiàn)接口,在Tree類中實(shí)現(xiàn)Bulid的接口。
【前提引入-接口簡(jiǎn)介】
-
基本介紹
接口就是給出一些沒有實(shí)現(xiàn)的方法,封裝到一起,到某個(gè)類要使用的時(shí)候,再根據(jù)具體情況把這些這些方法寫出來(lái)。
-
基本語(yǔ)法
interface 接口名{//屬性//方法(抽象方法,默認(rèn)實(shí)現(xiàn)方法,靜態(tài)方法) } class 類名 implements 接口名{//自己屬性//自己方法//必須實(shí)現(xiàn)的抽象接口方法 } -
注意事項(xiàng)
-
接口不能被實(shí)例化,必須由類去實(shí)現(xiàn)它
-
接口所有的方法是 public 方法,接口中抽象方法可以不用 abstract 修飾,因?yàn)樵趈avac編譯生成 字節(jié)碼二進(jìn)制文件 時(shí)會(huì)認(rèn)為是抽象方法加上 abstract 關(guān)鍵字。我們?cè)谶@里可以用 javac反編譯指令進(jìn)行查看:
-
接口中的屬性,只能是 final 的,而且必須是 public static final 修飾符,則在定義的時(shí)候必須初始化或者使用靜態(tài)代碼塊進(jìn)行初始化。
-
實(shí)現(xiàn)接口 vs 繼承類
-
接口和繼承解決的問題不同:
- 繼承的主要價(jià)值:解決diamante復(fù)用性和可維護(hù)性的問題
- 接口的主要價(jià)值:設(shè)計(jì),設(shè)計(jì)好各種規(guī)范(方法),讓其它類去實(shí)現(xiàn)這些方法。
實(shí)現(xiàn)接口是 對(duì) java單繼承機(jī)制 的一種很好的補(bǔ)充。
-
接口比繼承更靈活
繼承是滿足 is-a 關(guān)系,而接口只需要滿足 like-a 關(guān)系。
-
接口在一定程度上實(shí)現(xiàn) 代碼解耦(接口規(guī)范化+動(dòng)態(tài)綁定機(jī)制)
【核心代碼】
Build類
public interface Build {public final static double PI = 3.14;/*** 切面積*/public void area();/*** 體積*/public void volume();/*** 用途*/public void use(); }Tree類
public class Tree implements Build {/*** 樹的半徑(單位:m)*/private double r;/*** 樹的高度(單位:m)*/private double h;public Tree(double r, double h) {this.r = r;this.h = h;}@Overridepublic void area() {System.out.println("切面積是:" + PI * r * r);}@Overridepublic void volume() {System.out.println("體積是:" + PI * r * r * h);}@Overridepublic void use() {System.out.println("我的小樹用來(lái)造我們的小家");} }Test類
public class Test {public static void main(String[] args) {Tree tree = new Tree(0.5, 5);tree.area();tree.volume();tree.use();} }【運(yùn)行流程】
8.2.3 定義個(gè)類Plant,修改(2)聲明Tree類繼承Plant類,同時(shí)實(shí)現(xiàn)的Bulid接口內(nèi)容不變。
【前提引入】
繼承不多解釋,主要談?wù)?super 關(guān)鍵字
-
基本介紹
super代表對(duì)父類(可以不是直接父類,也可以是超類)的引用,用于訪問父類的屬性、方法、構(gòu)造器。
-
基本語(yǔ)法
- 可以訪問父類的屬性:super.屬性名,但不能訪問父類的 private屬性。
- 可以訪問父類的方法:super.方法名(實(shí)參列表),但不能訪問父類的 private方法。
- 能訪問父類的構(gòu)造器:super(實(shí)參列表),完成父類的初始化工作,只能放在構(gòu)造器的第一句,且只能出現(xiàn)一句。
-
注意事項(xiàng):默認(rèn)情況下構(gòu)造器中都會(huì)隱式存在super(),調(diào)用父類的無(wú)參構(gòu)造器。我們舉個(gè)例子,看下如下代碼:
public class Animal {String name;/*** 這是有參構(gòu)造器,* 因此如果沒有聲明無(wú)參構(gòu)造器,那么該類中不會(huì)存在無(wú)參構(gòu)造器*/public Animal(String name) {this.name = name;} }class Dog extends Animal{public Dog(){} }這段代碼會(huì)是錯(cuò)的,因?yàn)槲覀冊(cè)谡{(diào)用Dog類的無(wú)參構(gòu)造器中會(huì)默認(rèn)存在一句super(),但是父類 Animal類 中并不存在無(wú)參構(gòu)造器,因此發(fā)生錯(cuò)誤,修改:
public class Animal {String name;/*** 這是有參構(gòu)造器,* 因此如果沒有聲明無(wú)參構(gòu)造器,那么該類中不會(huì)存在無(wú)參構(gòu)造器*/public Animal(String name) {this.name = name;} }class Dog extends Animal{public Dog(String name){//如果顯示的聲明了 super調(diào)用,那么默認(rèn)的 super() 就不會(huì)存在在代碼中了super(name);} }
【核心代碼】
創(chuàng)建Plant類
public class Plant {private String name;private int age;public Plant(String name, int age) {this.name = name;this.age = age;}public void introduce() {System.out.println("我是一顆生長(zhǎng)了 " + age + " 年的 " + name + " 樹");} }修改Tree類
public class Tree extends Plant implements Build {/*** 樹的半徑(單位:m)*/private double r;/*** 樹的高度(單位:m)*/private double h;public Tree(double r, double h, String name, int age) {//父類構(gòu)造器初始化super(name, age);this.r = r;this.h = h;}@Overridepublic void introduce() {//調(diào)用父類的 introduce 方法super.introduce();}@Overridepublic void area() {System.out.println("切面積是:" + PI * r * r);}@Overridepublic void volume() {System.out.println("體積是:" + PI * r * r * h);}@Overridepublic void use() {System.out.println("我的小樹用來(lái)造我們的小家");} }修改Test類
public class Test {public static void main(String[] args) {Tree tree = new Tree(0.5, 5,"逐浪",18);tree.introduce();} }【運(yùn)行流程】
總結(jié)
以上是生活随笔為你收集整理的中南林业科技大学Java实验报告八:包与接口的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Springboot+easyUI fi
- 下一篇: 电动自行车16 CFR 1512标准要求