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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第五讲 类的封装和类的继承

發布時間:2025/4/5 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第五讲 类的封装和类的继承 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

第五講 類的封裝和類的繼承

主要內容

軟件包的創建和使用

Java訪問權限修飾詞

類的訪問權限修飾詞

Java中類的層次結構和類的繼承

對象的初始化再討論

?

軟件包的創建和使用

什么是軟件包(package)

包的組成:由一組類(class)和接口(interface)組成。

Java允許把多個類收集在一起成為一組,稱作包(package)。


包的作用:包是Java提供的一種類庫的封裝機制。專有的名字空間,解決了不同包中的類同名的問題。使自己的任務和其他人提供的代碼庫相分離。

?

軟件包的建立

從示例程序理解

編譯如下程序,查看所編譯文件的位置。

package mylib.simple;

public class List{

?? public List(){

??????? System.out.println("mylib.simple.List");

?? }

}

結論

1、包對應著文件系統的目錄層次結構。

2、編譯生成的字節碼文件將置放到包中,即包名所指定的目錄中。

?

軟件包的創建

package packagename;

幾個要點:

l?package語句必須是文件中的第一條語句。

l?用“.”作為分隔符來指明包(目錄)的層次。

l?包名由小寫字母組成。

l?沒有注明放入到某個包中去的類,自動地歸在一個無名包中

?

軟件包的使用

l?設置環境變量classpath

l?在Jcreator中添加classpath

l?使用如下兩種方法之一:

2?用import加載包中的類:import 包名; import 包名.類名;

2?直接用包名.類名去訪問類

?

說明

2?import語句必須放在package語句和類的定義之間。

2?某個類若用到其他類,會優先在所在軟件包中查找,繼而在classpath指定的路徑下查找。

?

例:創建一個newjw目錄,在此新目錄下創建如下java文件。

import mylib.simple.List;

class TestList{

?? public static void main(String[] aa){

??????? new List();

?? }

}

試用方法二改寫并編譯執行之。

思考

1.?? 一個程序的首語句是package a.b.c.d;其意是?

2.?? 一個程序中可含多個類,它們可分放到不同的軟件包嗎?

3.?? 若要使用d:\java07下的軟件包,classpath如何設置?

4.?? 如何用到不同目錄下的軟件包myclass.lib1中的類?

5.?? 同一個軟件包中的類可否直接使用?

6.?? 一個類設計成可被到處使用,應聲明為public類嗎?

7.?? 一個類用到其他類時,編譯時的類查找路徑是?

?

軟件包的操作練習

練習:建立工具包,并使用之。

1.?設計一個P類置入mylib.tools包中,該P類含rint和rintln方法,可實現字符串的輸出。

2.?用mylib.tools中的類P,分別輸出字符串和數字。

import ????????????????????????;

class TestP{

?? public static void main(String[] aa){

?

?

?? }

}

3. 創建一個Input類,含有來輸入整數或字符串的方法,以使下面的程序能正確編譯和執行。

import mylib.tools.Input;

import mylib.tools.P;

class TestInput{

?? public static void main(String[] aa){

??????? int y=Input.aInt();

??????? P.rintln(y+"");

??????? String s=Input.aString();

??????? P.rintln(s);

?? }

}

練習

1. 分別構造一個Circle類和Square類,可接受半徑(邊長),包含求面積的方法。將它們放在myclass.simple包中。

2. 利用上述類,求半徑為4.5的圓面積,邊長為4.5和6.5的矩形面積。

?

Java訪問權限修飾符

決定類成員的訪問權限的修飾符有:public 、protected 、private。

權限的設定對于類的封裝有著重要的意義。公開需要公開的,隱藏必須隱藏的。這樣就讓類的繼承變得簡單。

?

無權限修飾符的成員

允許本類、同一軟件包中的類訪問即享受“包訪問權限”。

?

public成員

public描述的是一個類中可向外公開的信息(屬性和方法)。

允許本類、繼承類、同一軟件包中的類、不同軟件包中的類訪問。

示例:不同軟件包之間一個類訪問另一個類的public成員。

package mylib.lib1;??? //Base.java

public class Base{

?? public int x=5;

?? public void print(){

??????? System.out.println("base"+x);//本類訪問

?? }

}

?

package mylib.lib2;??? //Derive.java

class Derive {

?? public static void main(String args[]){

??????? mylib.lib1.Base b = new mylib.lib1.Base();

??????? b.x=5;?//不同軟件包的類訪問

??????? b.print();

?? }

}

思考

1.?? 程序編譯后,磁盤上新增的目錄結構?

2.?? Base類中,可以公開的信息是?

3.?? public的公開范圍?

4.?? 如果Base類中的成員變量x前無public,會在何環節產生問題?

?

?

private成員

private修飾的成員變量和成員方法都只能在本類中訪問

修飾不希望被其它類訪問的變量和方法。有兩種限制:

2?其它類中的該類對象不能訪問private成員。

2?派生子類時,子類不能繼承父類的private成員

class Base1{

?? private int x=1;

?? private void print(){

??????? System.out.println("base"+x);

?? }

?? void doprint(){

??????? print();

?? }

}

class Derive1{

?? public static void main(String args[]){

?? ???? Base1 b = new Base1();

??????? b.doprint();?//直接調用b.print();試試!

?? }

}

觀察JCreator中的數據視圖(ctrl+alt+c),加深對private成員的認識。

?

假如構造方法是private的,類就不可直接實例化成對象:

class Sundae{

?? private Sundae(){

??????? System.out.println("Here is a sundae");

?? }

?? static Sundae getASundae(){

??????? return new Sundae();

?? }

}

class TestSundae{

?? public static void main(String[] aa){

??????? Sundae s=Sundae.getASundae();

?? }

}

protected成員

這是受保護成員。其修飾的數據和方法對繼承它的子類公開。

protected成員允許本類、繼承類和同一軟件包中的類訪問

包權限訪問

class Base1{

?? protected int x=1;

?? protected void print(){

??????? System.out.println("base"+x);

?? }

}

class Derive1{

?? public static void main(String args[]){

??????? Base1 b = new Base1();

??????? b.print();

?? }

}

繼承類對protected成員的訪問

package mylib.simple;//Cookie.java

public class Cookie{

?? public Cookie(){

??????? System.out.println("Cookie constructor");

?? }

?? protected void bite(){System.out.println("bite");}

}

?

import mylib.simple.Cookie; //Chocolatechip.java

class Chocolatechip extends Cookie{

?? Chocolatechip(){

??????? System.out.println("Chocolatechip");

?? }

?? public static void main(String[] aa){

??????? Chocolatechip c=new Chocolatechip();

??????? c.bite();????

?? }

}

思考

1.?? 何謂類的封裝?

2.?? 從封裝角度比較以上不同的權限修飾?

3.?? 一個public成員向誰公開信息?

4.?? 一個protected成員向誰公開信息?

5.?? 一個private成員向其它類公開信息嗎?

6.?? private有何意義?

?

練習:試填表說明不同訪問修飾符的訪問權限

訪問修飾符

本類

同軟件包

不同包中子類

不同包且無繼承

public

?

?

?

?

protected

?

?

?

?

無修飾詞

?

?

?

?

private

?

?

?

?

?

類的訪問權限

無訪問修飾符

即為缺省類。可以被同一個軟件包中的類訪問。

?

public

通過import導入(配合classpath的設置),可以被任何其它的類訪問。

public class 類名

思考

假如某一程序中定義了一個public類,框架如下:

package mylib.abc;

public class Abc{…}

?

1.?? 該程序應命名為?

2.?? 在另一個程序中如何能訪問到Abc類?

3.?? 如果該類有顯式的構造方法,并允許在其它類中創建該類的對象,構造方法的權限設置應是?

?

private類

專用于修飾內部類,內部類常用于處理本類中的事件。

?

類的繼承

類的層次結構

指的是繼承關系可以層次地遞延下去。

在Java程序中創建的所有類都是類層次結構的部件

每個類都有父類

如果沒有使用extends關鍵字,則Object類就是缺省的父類。

Object類包含在java.lang包中。所有的類都是從這個類繼承而來的。

Object類定義和執行了在Java系統需要的所有類的行為。

?

類的層次結構圖

?

思考

?

1.?? 根據層次結構圖,每個類都有父類嗎?

2.?? 如果類定義時無extends部分,該類的父類是?

3.?? 多個子類可以繼承自一個父類嗎?

4.?? 一個類可以同時繼承多個父類嗎?

5.?? Object類在哪個軟件包中?

?

?

類的繼承(inheritance)

使用extends關鍵字實現繼承

class SubClass extends SuperClass {

??? ClassBody

}

?

父類和子類

繼承另一個類的類稱為子類,被繼承的類稱為父類。

在Java中一個類只能直接繼承一個父類。

?

?

繼承的意義

一個類能從其它類繼承行為與屬性。

?

例:通過對Person類的繼承,定義Children類

class Person{

?int salary;

?void employed(){

?????? System.out.print("Work state:");

?????? if (salary==0) System.out.println("no job");

?????? else System.out.println("job");

?}

}

class Children extends Person{

?int age;

?void printAge(){

?????? System.out.println("Age:"+age);

?}

}

?

class Test{

?public static void main(String[] aa){

?????? Children c=new Children();

?????? c.salary=560;

?????? c.age=12;

?????? c.printAge();

?????? c.employed();

?}

}

思考

1.?? 一個類如何去繼承另一個類?

2.?? 示例中Children繼承了Persons類的什么?

3.?? Children的實例化對象與Persons的實例化對象區別在哪里?

4.?? 若希望父類中的某成員不被子類所繼承,如何實現?

?

練習:閱讀和分析程序,理解繼承。

import javax.swing.*;

class Test extends JFrame{

?public static void main(String[] aa){

?????? Test t=new Test();

?????? t.setVisible(true);

?????? t.setSize(300,200);

?}

}

?

對象的初始化再討論

基本的初始化過程

2?初始化時涉及到成員變量和構造方法;

2?實例變量的初始化在構造方法之前。

class Tag{

?? Tag(int m){

??????? System.out.println("Tag("+m+")");

?? }

}

class Card{

?? Tag t1=new Tag(1);

?? Card(){

??????? System.out.println("Card()");

??????? t3=new Tag(33);

?? }

?? Tag t2=new Tag(2);

?? void f(){

??????? System.out.println("f()");???????

?? }

?? Tag t3=new Tag(3);

}

class TestInit2{

?? public static void main(String[] aa){

??????? Card t=new Card();

??????? t.f();

?? }

}

?

靜態變量的初始化

類中的靜態成員變量的初始化在編譯時進行

靜態變量只初始化一次

class Bow{

?Bow(int m){

?????? System.out.println("Bow("+m+")");

?}

?void f(int m){

?????? System.out.println("f("+m+")");??????

?}

}

class Table{

?Bow b1=new Bow(1);

?Table(){

?????? System.out.println("Table()");

?????? b2.f(1);

?}

?static Bow b2,b3;

?static{

?????? b2=new Bow(2);

?????? b3=new Bow(3);

?}???

}

class TestInit{

?public static void main(String[] aa){

?????? System.out.println("Creating new Table()");

?????? new Table();

?????? System.out.println("Creating new Table()");

?????? new Table();

?}

}

?

思考

1.?對象的初始化在什么時候進行?

2.?靜態變量和實例變量的初始化時機?

3.?實例變量和構造方法哪個先初始化?

4.?除了構造方法外,通常的成員方法會自動初始化嗎?

5.?類有多個成員變量,這些變量的初始化順序?

?

帶有繼承時的初始化過程

2?靜態變量初始化

2?運行父類的無參數構造方法(按級別高到低)

2?本類實例變量初始化

2?運行本類的構造方法

class GrandParent{

?GrandParent(){

?????? System.out.println("GrandParent");

?}

}

class Parent extends GrandParent{

?Parent(){

?????? System.out.println("Parent");

?}

}

class Children extends Parent{

?Children(){

?????? System.out.println("Children");

?}

?public static void main(String[] a){

?????? new Children();

?}

}

問題:若類GrandParent類定義如下,程序運行結果?

class GrandParent{

?GrandParent(){}

?GrandParent(String s){

?????? System.out.println("GrandParent "+s);

?}

}

思考

1.?對象的初始化時,父類的什么樣的構造方法能自動執行?

2.?父類構造方法的執行時機?

?

有關對象初始化的結論

繼承時,初始化的順序(包括構造方法):

主類中的靜態成員初始化

運行父類的默認構造方法

(按級別高到低的順序)

主類中非靜態成員初始化

調用主類的構造方法

?

?

轉載于:https://www.cnblogs.com/baoguo/archive/2010/12/08/1899881.html

總結

以上是生活随笔為你收集整理的第五讲 类的封装和类的继承的全部內容,希望文章能夠幫你解決所遇到的問題。

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