

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、1,Java語言程序設計,2,第三章 面向?qū)ο筇卣?基本概念類的定義對象類的繼承和多態(tài)接口和包常用工具類,3,基本概念,什么是編程語言?人和計算機進行交流的工具和手段編程語言的發(fā)展機器語言: 0101001匯編語言: mov, push, add, call第三代語言: 高級語言,以C語言為代表,過程式編程語言(Procedural Programming Language)第四代語言: 非過程化/面向?qū)ο蟮木幊陶Z
2、言語言的發(fā)展: 抽象的過程,4,面向?qū)ο?Object Oriented-OO) 面向?qū)ο缶幊?Object Oriented Programming-OOP)面向?qū)ο笫且环N軟件開發(fā)的方法,“面向?qū)ο蟮姆治雠c設計”(OOA&OOD—研究生課程)第一個面向?qū)ο蟮恼Z言: Simula-67第一個成功的面向?qū)ο缶幊陶Z言: SmalltalkC++, JAVA, C#, PERL等用客觀世界中描述事物的方法來描述程序中要解
3、決的問題萬事萬物都是對象程序便是成堆的對象,彼此通過消息的傳遞,請求其他對象進行工作,基本概念,5,五個基本概念對象類封裝性繼承性多態(tài)性,基本概念,6,對象 (object)everything is an object現(xiàn)實世界的對象: 桌子、書、自行車、電視、狗、文件、表格、按鈕、窗口對象包含三個特性狀態(tài): 指對象本身的信息(內(nèi)部信息/內(nèi)部變量)行為: 實現(xiàn)對信息的訪問/對象的操作標志: 代表對象的標識符山
4、地車的狀態(tài)(兩個車輪、一些齒輪、速度、擋數(shù)),行為(剎車、加速、減速和換擋),基本概念,7,對象 (object)狀態(tài)?變量(variables)行為?方法(method)對象就是變量和相關方法的軟件集合一個對象可以由其他對象組合而成,窗口(按鈕,菜單條,文本框,狀態(tài)欄等)程序就是對象的集合,對象之間相互交互和通信完成任務搭積木A program is a bunch of objects telling each oth
5、er what to do by sending messages,基本概念,8,類 (class)現(xiàn)實世界中,存在很多同類的對象,很多桌子、書、自行車一種原型,一種抽象,一種共性,一個模板Every object has a type實例(instance),某類對象的一個特定實體,類是對象的一個抽象表格(類) 填入不同的個人信息?不同的對象,基本概念,9,封裝性對象本身的數(shù)據(jù)得到保護/隱藏其他對象僅僅需要知道對該對象
6、的訪問方法(接口/interface)即可好處模塊化--每個對象的源文件可以是相互獨立的,可以被不同的程序調(diào)用,每個對象是一塊積木,可以搭建不同的形狀信息隱藏--通常定義一個公共接口/方法實現(xiàn)對對象的訪問,可以調(diào)整對象的私有信息和方法,而不會對其他調(diào)用它的對象產(chǎn)生影響可重用性黑盒子電腦的DIY噴墨打印機,硒鼓壞/彩色硒鼓,基本概念,10,繼承性為什么會有繼承?建立一個類后,發(fā)現(xiàn)另一個新的類有相同的特性,兩個選擇:重新定
7、義一個新的類;在已有類的基礎上,修改(加加/減減)父類和子類,子類繼承(擁有)父類所有的數(shù)據(jù)和方法,同時子類可以有新的數(shù)據(jù)和方法,“青出于藍,而勝于藍”樹型結構(層次化結構) 根(基類),基本概念,11,繼承性,運輸工具,航空運輸工具,陸地運輸工具,水上運輸工具,人力驅(qū)動,引擎驅(qū)動,二輪,四輪,客運,貨運,,,,,,,,,,基本概念,12,繼承性多重繼承,類A,類B,類C,類D,類F,類G,,,,,,,一個類擁有多個父類?產(chǎn)生二
8、義性,例類C和類D都有一個同名的方法,類G?Java中僅僅支持單一繼承,同時Java采用Interface(接口)實現(xiàn)多重繼承而避免父類二義性,基本概念,13,多態(tài)性表現(xiàn)在繼承中?方法的重寫子類從父類繼承(extends擴展)而來多個子類同屬一個父類,所有子類有相同的父類繼承父類的方法在不同的子類中有不同的表現(xiàn)形式表現(xiàn)在用一個類中?方法的重載,基本概念,14,多態(tài)性多態(tài)性在繼承中的表現(xiàn),基本概念,15,多態(tài)性,class
9、 Square extends Shape{ double getArea(float x) { return x*x; }} class Triangle extends Shape{ float getArea(int x,float y) { return x*y/2; },class Shape{float getArea(){}}class Circle ext
10、ends Shape { float getArea(float r) { return 3.14f*r*r; }},基本概念,16,多態(tài)性class Area { float getArea(float r) { return 3.14f*r*r; } double getArea(float x,int y) { return x*y; } fl
11、oat getArea(int x,float y) { return x*y/2; } double getArea(float x,float y,float z) { return (x*x+y*y+z*z)*2.0; }},基本概念,17,第三章 面向?qū)ο筇卣?基本概念類的定義對象類的繼承和多態(tài)接口和包常用工具類,18,程序是對象的集合,而對象是類的實例化源程序就是一
12、個個的Java類Java本身提供的類(核心API)見Java文檔中描述程序員可以對其進行調(diào)用j2sdk1.4.1_01\jre\lib\rt.jar(22.4MB)程序員自己定義的類,類的定義,19,,,,類的定義格式[類的修飾符]class 類名 [extends 父類名] implements[接口名] {類型成員變量1;類型成員變量2;… …… … … …類型成員方法1(參數(shù)1, [參數(shù)2, …
13、]) {方法體;}類型成員方法2(參數(shù)1, [參數(shù)2, …]) {方法體;}… …… … … …},類的定義,20,類的定義格式[類的修飾符] class 類名 [extends 父類名] [implements 接口名] {… …… … … …}類的修飾符public: 公共類,可以被其他類所使用,declares that the class can be used by an
14、y class regardless of its package (無任何限制)無修飾/默認說明: a class can be used only by other classes in the same package (僅僅能在同一個包中的其他類引用)abstract: declares that the class cannot be instantiated (宣布該類不能被實例化)final: declares th
15、at the class cannot be subclassed (宣布該類不能有子類),類的描述,21,類的修飾符final -- Declares that the class cannot be subclassed.(宣布該類不能有子類),類的描述,final class ChessAlgorithm { . . .},class BetterChessAlgorithm extends ChessAlgorith
16、m { . . .},Can't subclass final classes: class ChessAlgorithmclass BetterChessAlgorithm extends ChessAlgorithm { ^1 error,22,類的定義格式[類的修飾符] class 類名 [extends 父類名] [implements 接口名] {… …… … … …}exten
17、ds: 繼承的關系implements: 實現(xiàn)哪些接口(interface)的方法,實現(xiàn)多重繼承public class Test extends Frame implements ActionListener, ItemListener { … …… …},類的描述,23,一個簡單的類class Student {String name, stuNumber;double score1, sco
18、re2, score3;void set1(String s1, String s2) {name = s1;stuNumber = s2;System.out.println(name + “ “ + stuNumber);}double setScore(double d1, double d2, double d3) {double d;score1 = d1;score2 = d2
19、;score3 = d3;d = d1 + d2 + d3;return d;}},類的描述,,24,包(Package)的概念package org.jalpha;class test {… …}源文件位置: “D:\src\org\jalpha\test.java”編譯方法1: “cd D:\src\org\jalpha\” “javac
20、 test.java”編譯方法2: “cd D:\src\” “javac org\jalpha\test.java”class文件位置: “D:\src\org\jalpha\test.class”運行: “cd D:\src\” “java org.jalpha.test”,類的描述,25,包(Package)的概念通過包來管理類名空間防止同名類名的沖突層次化的結
21、構,類的描述,對個體(個人和機構)將類文件放在不同的目錄下防止重名org\jalpha\method1\***.java method2\***.java,ABC 公司Engine.java,XYZ 公司Engine.java,需調(diào)用Engine.java?,ABC 公司com\abc\Engine.java,XYZ 公司com\xyz\Engine.java,26,包(Package)的概
22、念package org.jalpha;class test {… …},類的描述,D:\src\org\jalpha\test.javaD:\src\org\jalpha\test1.javaD:\src\org\jalpha\test2.java,27,對象具有狀態(tài)和行為成員變量定義[訪問權限修飾符] 類型 變量名;[訪問權限修飾符] 類型 變量名 [=初值];[訪問權限修飾符] 類型 變量名 [=初值] [,
23、變量名 [=初值]…];成員方法定義[訪問權限修飾符] 方法返回類型 方法名 () [throws 異常名] {方法體;}類型:基本類型,復合類型(數(shù)組、類和接口),類成員-變量和方法,28,訪問控制修飾符公共訪問控制符-public 被所有類訪問默認訪問控制符被同一包中其他類訪問私有訪問控制符- private被該類自身訪問保護訪問控制符- protected該類自身、同一個包中的其他類、其他
24、包中的子類訪問私有保護訪問控制符-private protected該類自身、所有子類訪問,類成員變量的訪問,29,非訪問控制修符靜態(tài)變量static屬于類的變量最終變量final值在程序的執(zhí)行過程中不會改變易失變量volatile可能同時被多個線程所控制和修改,類成員變量的訪問,30,public (公共變量/公共方法)容許全權訪問,無任何限制(先構造對象,再訪問),類成員的訪問,class A {public
25、int x;public void print() { … }}class B {void test() {A a = new A();a.x = 100;a.print();}},package abc;class A {public int x;public void print() { … }}package xyz;import abc.A;class B {void
26、 test() {A a = new A();a.x = 100;a.print();}},直接訪問公有變量x和公共方法print(),31,private (私有變量/私有方法)僅能在其所定義的類中被訪問(先構造對象,再訪問),D:\>javac A.javax has private access in A a.x = 100; ^
27、print() has private access in A a.print(); ^2 errors,類成員的訪問,class A {private int x;private void print() { … }}class B {void test() {A a = new A();a.x = 100;a.print();
28、}},32,protected (保護變量/保護方法)容許類本身、子類(有一定限制)以及同一個包中所有類訪問(先構造對象,再訪問),類成員的訪問,class A {protected int x;protected void print() { … }}class B {void test() {A a = new A();a.x = 100;a.print();}},package abc
29、;class A {protected int x;protected void print() { … }}package xyz;import abc.A;class B extends A {void test(A a, B b) {a.x = 100;a.print();b.x = 100;b.print();}},//illegal//illegal//legal//l
30、egal,33,無修飾 (友好變量/友好方法)容許類本身以及同一個包中所有類訪問,類成員的訪問,class A {int x;void print() { … }}class B {void test() {A a = new A();a.x = 100;a.print();}},package abc;class A {int x;void print() { … }}packa
31、ge abc;class B {void test() {A a = new A();a.x = 100;a.print();}},34,小結,* 指子類與父類不在同一個包中的情況,類成員變量的訪問,35,static (靜態(tài)變量/靜態(tài)方法)類的變量/方法,獨立于類的對象,可以直接根據(jù)類名調(diào)用class S {static int A = 12, B = 34;static void print
32、() { … }}class Test {public static void main(String args[]) {System.out.println(“A=“ + S.A + “ B=“ + S.B);S.print();}},類成員變量,36,static (靜態(tài)變量/靜態(tài)方法),class Test { public void print(int x) { System
33、.out.println(x); } public static void main(String args[]) {int x = 3;print(x);}},D:\>javac Test.javaTest.java:9: non-static method print(int) cannot be referenced from a static context
34、 print(x); ^1 error,class Test { public void print(int x) { System.out.println(x); } public static void main(String args[]) {int x = 3;Test t = new Test();
35、t.print(x);}},class Test { public static void print(int x) { System.out.println(x); } public static void main(String args[]) {int x = 3;print(x);}},static方法中僅僅可以調(diào)用其他static方法,類成員,
36、37,final 變量/方法final變量: 定義一個常數(shù),即變量值不能改變final double AVOGADRO = 6.022e23;final類: 不能有子類final方法: 方法不能被重寫(overriding)class ChessAlgorithm { . . . final void nextMove(ChessPiece pieceMoved,
37、 BoardLocation newLocation) { ... } . . .},類成員變量,38,小結類: public, abstract, final, 無修飾, [private]類成員publicprotectedprivate無修飾staticfinal,類成員變量,39,方法: 對象行為的描述完成某種功能的程序塊定義: [訪問權限修飾符] 方法返回類型 方法名
38、() [throws 異常名] {方法體;}方法參數(shù)的傳遞變量的作用域方法的重載(overloading)/重寫(overriding)方法的遞歸調(diào)用,類成員方法,40,訪問控制修飾符公共訪問控制符-public 被所有類訪問默認訪問控制符被同一包中其他類訪問私有訪問控制符- private被該類自身訪問保護訪問控制符- protected該類自身、同一個包中的其他類、其他包中的子類訪問私有保護訪
39、問控制符-private protected該類自身、所有子類訪問,類成員方法的訪問,41,非訪問控制修符靜態(tài)方法static屬于類的方法最終方法final不能被子類重新定義的方法抽象方法abstract只有方法說明,沒有具體實現(xiàn)本地方法native以其他語言實現(xiàn)方法功能同步方法synchronized用于多線程程序中的協(xié)調(diào)和同步,類成員方法的訪問,42,例,成員方法,class Test { public s
40、tatic void main(String args[]) {double d_product;Area myArea;myArea = new Area(); d_product = myArea.product();System.out.println(“myArea的面積是: ” + d_product);}},class Area {double width, height; voi
41、d setV(double w, double h) {width = w;height = h;} double product() {return width*height;}},43,方法參數(shù),成員方法,形參和實參,D:\>java Parameter3 43 423,注意1: 類型匹配注意2:基本類型與復合類型參數(shù)傳遞的結果不同,Pass by ValueIn Java m
42、ethods, arguments are passed by value. When invoked, the method receives the value of the variable passed in. When the argument is of primitive type, pass-by-value means that the method cannot change its value. When
43、the argument is of reference type, pass-by-value means that the method cannot change the object reference, but can invoke the object's methods and modify the accessible variables within the object.,44,例,成員方法,u=3;
44、v=2;,u=5; v=10;,輸出結果:3 4 511 12 13 14 15,45,變量的作用域(成員變量/局部變量),成員方法,46,方法的重載(overload)方法名相同,但方法的參數(shù)不同方法描述 方法名(標識符) 參數(shù)類型 方法返回值 絕對值 abs(a) int int絕對值 abs(a)
45、 long long絕對值 abs(a) float float絕對值 abs(a) double double… … … … … … … …public static int abs(int a
46、) public static long abs(long a) public static float abs(float a)public static double abs(double a),成員方法,47,方法的重寫(overriding)子類重寫父類的方法,成員方法,class Father {… …void display( ) { … …; }… …},
47、class Son extends Father {… …void display() {… …;}… …},Father f = new Father();f.display();,Son s = new Son();s.display();,48,構造方法,創(chuàng)建對象/實例化對象—new 例1: Apple a = new Apple(); (創(chuàng)建對象)例2: Apple a;
48、 (對象的說明) a = new Apple(); (實例化對象)對象的實例化通過構造方法(constructor)來實現(xiàn)構造方法的名字與類名相同構造方法沒有返回值構造方法可以有多個,構成方法的重載(overload),49,例: 對象的實例化和初始化,輸出結果: 2020 5010 20,構造方法,50,再談方法的重載(overload),構造方法,class Tree
49、 { int height; Tree() { prt(“Planting a seeding”); height = 0; } Tree(int i) { prt(“Creating new Tree that is ” + i + “ feet tall”);height = i; },void info() { prt(“Tree is ” + height +
50、 “ feet height”); } void info(String s) { prt(s + “: Tree is ” + height +“ feet height”); } static void prt(String s) { System.out.println(s); }},for (int i =0; i
51、 < 5; i++) { Tree t = new Tree(i); t.info(); t.info(“my tree”);}new Tree();,51,默認構造方法例 class Apple {int color; }Apple a = new Apple();對象實例的判斷: null例 Apple a; if (a == null) System.out.
52、println(“Day dream”);,構造方法,運行時系統(tǒng)自動賦予一個空構造函數(shù)如 Apple() { },52,再談構造方法,構造方法,class Cmethod { Cmethod (boolean b) { } public static void main (String args[]) { Cmethod c1 = new Cmethod(); Cmethod c2 = new Cmetho
53、d(false); } },class Cmethod { Cmethod (boolean b) { } public static void main (String args[]) { //Cmethod c1 = new Cmethod(); Cmethod c2 = new Cmethod(false); } },class Cmethod { Cmethod (boolean b)
54、 { } Cmethod () {} public static void main (String args[]) { Cmethod c1 = new Cmethod(); Cmethod c2 = new Cmethod(false); } },運行時系統(tǒng)自動賦予一個空構造方法,僅僅當該類沒定義構造方法的情況下,53,static變量的初始化,class Smember {static int
55、i = 100;static boolean b = true;char c = ‘t’;public Smember() {}public static void main(String args[]) {Smember m1 = new Smember();Smember m2 = new Smember();}},不論產(chǎn)生多少個對象,屬于類的靜態(tài)變量只有一份,即只占有一份存儲空間,class
56、 Smember {static int i; static boolean b;static {i = 100;b = true;System.out.println(“In static block”);}char c = ‘t’;public Smember() { System.out.println(“In constructor”); }public static void m
57、ain(String args[]) {Smember m1 = new Smember();Smember m2 = new Smember();}},輸出結果In static blockIn constructorIn constructor,54,設計模式的例子,class Singleton {private static Singleton me = new Singleton();publi
58、c static Singleton getSingleton() {return me;}private Singleton() {}public static void main(String args[]) {Singleton s1 = Singleton.getSingleton();Singleton s2 = Singleton.getSingleton();if (s1 == s2)
59、 System.out.println("s1 is s2");else System.out.println("s1 is not s2");}},該Singleton類只有一個實例,即該Singleton類只能構造一個對象,55,“Design Patterns: Elements of Reusable Object-Oriented Sof
60、tware”(設計模式)Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides Addison-Wesley, 1995這幾位作者常被稱為“四人組(Gang of Four)”, 而這本書也就被稱為“四人組(或 GoF)”書設計模式: 在一定的環(huán)境中解決某一問題的方案23 種設計模式, 3大類創(chuàng)建型模式(Creational pattern)規(guī)定了創(chuàng)建對象的方式,如Sing
61、leton模式、Factory Method模式結構型模式(Structural pattern)規(guī)定了如何組織類和對象。這些模式涉及類如何相互繼承或如何從其它類組合,如Adapter、Proxy 和 Decorator 模式行為模式(Behavioral pattern)規(guī)定了對象之間交互的方式。如Observer模式、Strategy和Template 模式并發(fā)模式(Concurrency pattern)規(guī)定協(xié)調(diào)或順序?qū)蚕?/p>
62、資源訪問的方式MVC(Model/View/Controller, 模型/視圖/控制器),56,設計模式的例子,public class Sequence { private static Sequence instance; private static int counter; private Sequence() { counter = 0; } public static synchroniz
63、ed Sequence getInstance() { if (instance==null) { instance = new Sequence(); } return instance; } public static synchronized int getNext() { return ++counter; }},這個類不可以再有子類,因為構造方法
64、是privateLazy instantiation (Lazy initialization),僅在需要的時候才實例化對象,private static Sequence instance = new Sequence();,57,抽象類(abstract class),一個未完成的類僅僅抽象類可以包含抽象方法(abstract methods)抽象方法: 僅僅申明了方法,但未實現(xiàn)有訪問修飾詞返回值類型方法名參數(shù)列表無
65、方法體,58,抽象類(abstract class),abstract class Point {int x = 1, y = 1;void move(int dx, int dy) {x += dx;y += dy;alert();}abstract void alert();},abstract class ColoredPoint extends Point {int color;},cl
66、ass SimplePoint extends Point {void alert() { }},抽象方法: 有訪問修飾詞、返回值類型、方法名和參數(shù)列表,無方法體,59,抽象類(abstract class),抽象類不能被實例化,例Point p = new Point(); 子類繼承抽象類時,必須重寫抽象方法,否則仍為抽象類,abstract class Point {int x = 1, y = 1;void m
67、ove(int dx, int dy) {x += dx;y += dy;alert();}abstract void alert();},abstract class ColoredPoint extends Point {int color;},class SimplePoint extends Point {void alert() { }},Point p = new SimplePoin
68、t();,60,抽象類(abstract class),多態(tài)性,abstract class Graphics {abstract void parameter();abstract void area();},class Rectangle extends Graphics {double h, w;Rectangle (double u, double v) {h = u; w = v;}void p
69、arameter() {System.out.println(h + “ “ + w);}void area() { System.out.println(h*w); }},Rectangle rec = new Rectangle(1.0, 2.0);Circle cir = new Circle(3.0, “Red”);Graphics[] g = {rec, cir};for (int i = 0; i &l
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。