日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

中南林业科技大学Java实验报告八:包与接口

發布時間:2023/12/18 java 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 中南林业科技大学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是會報錯:不可映射的字符集編碼

  • 這是因為我們的代碼文件Tree.java是使用的unicode字符集的UTF-8編碼,則存儲方式(編碼)就為UTF-8。
  • 但是如果在cmd命令行執行javac編碼指令,那么首先是需要讀取 Tree.java 文件信息的,但是Windows操作系統默認使用 GBK 字符集,這對程序員就很不友好,導致在對 Tree.java 讀取時是使用GBK的解碼方式。
  • Tree.java存儲時是 UTF-8 編碼,而讀取時是 GBK 解碼,因此造成了亂碼問題。
  • 但是如果 Tree.java 中不含有中文,我們使用 javac Tree.java 是沒有問題的,因為** Unicode字符集和GBK字符集是完全兼容 ASCII字符集的。**
  • 📍 解決方案:

  • 在寫Tree.java文件時指定字符集為GBK。但是windows11是沒有該功能了似乎。
  • 使用 sublime,notepad 等編譯軟件,可以指定編碼方式為GBK。
  • 修改windows默認的字符集編碼為UTF-8。
  • 在cmd控制臺寫命令時指定解碼方式為UTF-8,如:javac -encoding utf8 Tree.java。(推薦)
  • 2?? 對下面的代碼顯示的結果分析:

    Tree.java 和 Bamboo.java 文件中都含有 Living 類,因此我們如果這樣執行:

  • 編譯Tree.java文件:javac -encoding utf8 Tree.java。這樣就會在 package-interface文件夾中 生成 Tree.class 和 Living.class 兩個字節碼二進制文件。
  • 編譯Bamboo.java文件:javac -encoding utf8 Bamboo.java。這樣就會生成在 package-interface文件夾中 Bamboo.class 和 Living.class 兩個字節碼二進制文件。
  • Living.class命名沖突問題:由于編譯 Tree.java 和 Bamboo.java 時都會生成 Living.java 文件,并且會生成在同一級目錄package-interface文件夾下,這必然會沖突。那會發生聲明呢?即在編譯 Bamboo.java 時生成的 Living.class 會發現 package-interface 文件夾下已經有了 Tree.java編譯生成的 Living.class,那么就會覆蓋掉有 Tree.java編譯生成的 Living.class,在 package-interface 文件下就只有由 Bamboo.java 編譯生成的 Living.class 字節碼二進制文件了。
  • 【核心代碼】

    🌿 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实验报告八:包与接口的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。