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