版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1,Java語(yǔ)言程序設(shè)計(jì),2,第三章 面向?qū)ο筇卣?基本概念類(lèi)的定義對(duì)象類(lèi)的繼承和多態(tài)接口和包常用工具類(lèi),3,基本概念,什么是編程語(yǔ)言?人和計(jì)算機(jī)進(jìn)行交流的工具和手段編程語(yǔ)言的發(fā)展機(jī)器語(yǔ)言: 0101001匯編語(yǔ)言: mov, push, add, call第三代語(yǔ)言: 高級(jí)語(yǔ)言,以C語(yǔ)言為代表,過(guò)程式編程語(yǔ)言(Procedural Programming Language)第四代語(yǔ)言: 非過(guò)程化/面向?qū)ο蟮木幊陶Z(yǔ)
2、言語(yǔ)言的發(fā)展: 抽象的過(guò)程,4,面向?qū)ο?Object Oriented-OO) 面向?qū)ο缶幊?Object Oriented Programming-OOP)面向?qū)ο笫且环N軟件開(kāi)發(fā)的方法,“面向?qū)ο蟮姆治雠c設(shè)計(jì)”(OOA&OOD—研究生課程)第一個(gè)面向?qū)ο蟮恼Z(yǔ)言: Simula-67第一個(gè)成功的面向?qū)ο缶幊陶Z(yǔ)言: SmalltalkC++, JAVA, C#, PERL等用客觀(guān)世界中描述事物的方法來(lái)描述程序中要解
3、決的問(wèn)題萬(wàn)事萬(wàn)物都是對(duì)象程序便是成堆的對(duì)象,彼此通過(guò)消息的傳遞,請(qǐng)求其他對(duì)象進(jìn)行工作,基本概念,5,五個(gè)基本概念對(duì)象類(lèi)封裝性繼承性多態(tài)性,基本概念,6,對(duì)象 (object)everything is an object現(xiàn)實(shí)世界的對(duì)象: 桌子、書(shū)、自行車(chē)、電視、狗、文件、表格、按鈕、窗口對(duì)象包含三個(gè)特性狀態(tài): 指對(duì)象本身的信息(內(nèi)部信息/內(nèi)部變量)行為: 實(shí)現(xiàn)對(duì)信息的訪(fǎng)問(wèn)/對(duì)象的操作標(biāo)志: 代表對(duì)象的標(biāo)識(shí)符山
4、地車(chē)的狀態(tài)(兩個(gè)車(chē)輪、一些齒輪、速度、擋數(shù)),行為(剎車(chē)、加速、減速和換擋),基本概念,7,對(duì)象 (object)狀態(tài)?變量(variables)行為?方法(method)對(duì)象就是變量和相關(guān)方法的軟件集合一個(gè)對(duì)象可以由其他對(duì)象組合而成,窗口(按鈕,菜單條,文本框,狀態(tài)欄等)程序就是對(duì)象的集合,對(duì)象之間相互交互和通信完成任務(wù)搭積木A program is a bunch of objects telling each oth
5、er what to do by sending messages,基本概念,8,類(lèi) (class)現(xiàn)實(shí)世界中,存在很多同類(lèi)的對(duì)象,很多桌子、書(shū)、自行車(chē)一種原型,一種抽象,一種共性,一個(gè)模板Every object has a type實(shí)例(instance),某類(lèi)對(duì)象的一個(gè)特定實(shí)體,類(lèi)是對(duì)象的一個(gè)抽象表格(類(lèi)) 填入不同的個(gè)人信息?不同的對(duì)象,基本概念,9,封裝性對(duì)象本身的數(shù)據(jù)得到保護(hù)/隱藏其他對(duì)象僅僅需要知道對(duì)該對(duì)象
6、的訪(fǎng)問(wèn)方法(接口/interface)即可好處模塊化--每個(gè)對(duì)象的源文件可以是相互獨(dú)立的,可以被不同的程序調(diào)用,每個(gè)對(duì)象是一塊積木,可以搭建不同的形狀信息隱藏--通常定義一個(gè)公共接口/方法實(shí)現(xiàn)對(duì)對(duì)象的訪(fǎng)問(wèn),可以調(diào)整對(duì)象的私有信息和方法,而不會(huì)對(duì)其他調(diào)用它的對(duì)象產(chǎn)生影響可重用性黑盒子電腦的DIY噴墨打印機(jī),硒鼓壞/彩色硒鼓,基本概念,10,繼承性為什么會(huì)有繼承?建立一個(gè)類(lèi)后,發(fā)現(xiàn)另一個(gè)新的類(lèi)有相同的特性,兩個(gè)選擇:重新定
7、義一個(gè)新的類(lèi);在已有類(lèi)的基礎(chǔ)上,修改(加加/減減)父類(lèi)和子類(lèi),子類(lèi)繼承(擁有)父類(lèi)所有的數(shù)據(jù)和方法,同時(shí)子類(lèi)可以有新的數(shù)據(jù)和方法,“青出于藍(lán),而勝于藍(lán)”樹(shù)型結(jié)構(gòu)(層次化結(jié)構(gòu)) 根(基類(lèi)),基本概念,11,繼承性,運(yùn)輸工具,航空運(yùn)輸工具,陸地運(yùn)輸工具,水上運(yùn)輸工具,人力驅(qū)動(dòng),引擎驅(qū)動(dòng),二輪,四輪,客運(yùn),貨運(yùn),,,,,,,,,,基本概念,12,繼承性多重繼承,類(lèi)A,類(lèi)B,類(lèi)C,類(lèi)D,類(lèi)F,類(lèi)G,,,,,,,一個(gè)類(lèi)擁有多個(gè)父類(lèi)?產(chǎn)生二
8、義性,例類(lèi)C和類(lèi)D都有一個(gè)同名的方法,類(lèi)G?Java中僅僅支持單一繼承,同時(shí)Java采用Interface(接口)實(shí)現(xiàn)多重繼承而避免父類(lèi)二義性,基本概念,13,多態(tài)性表現(xiàn)在繼承中?方法的重寫(xiě)子類(lèi)從父類(lèi)繼承(extends擴(kuò)展)而來(lái)多個(gè)子類(lèi)同屬一個(gè)父類(lèi),所有子類(lèi)有相同的父類(lèi)繼承父類(lèi)的方法在不同的子類(lèi)中有不同的表現(xiàn)形式表現(xiàn)在用一個(gè)類(lèi)中?方法的重載,基本概念,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ū)ο筇卣?基本概念類(lèi)的定義對(duì)象類(lèi)的繼承和多態(tài)接口和包常用工具類(lèi),18,程序是對(duì)象的集合,而對(duì)象是類(lèi)的實(shí)例化源程序就是一
12、個(gè)個(gè)的Java類(lèi)Java本身提供的類(lèi)(核心API)見(jiàn)Java文檔中描述程序員可以對(duì)其進(jìn)行調(diào)用j2sdk1.4.1_01\jre\lib\rt.jar(22.4MB)程序員自己定義的類(lèi),類(lèi)的定義,19,,,,類(lèi)的定義格式[類(lèi)的修飾符]class 類(lèi)名 [extends 父類(lèi)名] implements[接口名] {類(lèi)型成員變量1;類(lèi)型成員變量2;… …… … … …類(lèi)型成員方法1(參數(shù)1, [參數(shù)2, …
13、]) {方法體;}類(lèi)型成員方法2(參數(shù)1, [參數(shù)2, …]) {方法體;}… …… … … …},類(lèi)的定義,20,類(lèi)的定義格式[類(lèi)的修飾符] class 類(lèi)名 [extends 父類(lèi)名] [implements 接口名] {… …… … … …}類(lèi)的修飾符public: 公共類(lèi),可以被其他類(lèi)所使用,declares that the class can be used by an
14、y class regardless of its package (無(wú)任何限制)無(wú)修飾/默認(rèn)說(shuō)明: a class can be used only by other classes in the same package (僅僅能在同一個(gè)包中的其他類(lèi)引用)abstract: declares that the class cannot be instantiated (宣布該類(lèi)不能被實(shí)例化)final: declares th
15、at the class cannot be subclassed (宣布該類(lèi)不能有子類(lèi)),類(lèi)的描述,21,類(lèi)的修飾符final -- Declares that the class cannot be subclassed.(宣布該類(lèi)不能有子類(lèi)),類(lèi)的描述,final class ChessAlgorithm { . . .},class BetterChessAlgorithm extends ChessAlgorith
16、m { . . .},Can't subclass final classes: class ChessAlgorithmclass BetterChessAlgorithm extends ChessAlgorithm { ^1 error,22,類(lèi)的定義格式[類(lèi)的修飾符] class 類(lèi)名 [extends 父類(lèi)名] [implements 接口名] {… …… … … …}exten
17、ds: 繼承的關(guān)系implements: 實(shí)現(xiàn)哪些接口(interface)的方法,實(shí)現(xiàn)多重繼承public class Test extends Frame implements ActionListener, ItemListener { … …… …},類(lèi)的描述,23,一個(gè)簡(jiǎn)單的類(lèi)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;}},類(lèi)的描述,,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”運(yùn)行: “cd D:\src\” “java org.jalpha.test”,類(lèi)的描述,25,包(Package)的概念通過(guò)包來(lái)管理類(lèi)名空間防止同名類(lèi)名的沖突層次化的結(jié)
21、構(gòu),類(lèi)的描述,對(duì)個(gè)體(個(gè)人和機(jī)構(gòu))將類(lèi)文件放在不同的目錄下防止重名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 {… …},類(lèi)的描述,D:\src\org\jalpha\test.javaD:\src\org\jalpha\test1.javaD:\src\org\jalpha\test2.java,27,對(duì)象具有狀態(tài)和行為成員變量定義[訪(fǎng)問(wèn)權(quán)限修飾符] 類(lèi)型 變量名;[訪(fǎng)問(wèn)權(quán)限修飾符] 類(lèi)型 變量名 [=初值];[訪(fǎng)問(wèn)權(quán)限修飾符] 類(lèi)型 變量名 [=初值] [,
23、變量名 [=初值]…];成員方法定義[訪(fǎng)問(wèn)權(quán)限修飾符] 方法返回類(lèi)型 方法名 () [throws 異常名] {方法體;}類(lèi)型:基本類(lèi)型,復(fù)合類(lèi)型(數(shù)組、類(lèi)和接口),類(lèi)成員-變量和方法,28,訪(fǎng)問(wèn)控制修飾符公共訪(fǎng)問(wèn)控制符-public 被所有類(lèi)訪(fǎng)問(wèn)默認(rèn)訪(fǎng)問(wèn)控制符被同一包中其他類(lèi)訪(fǎng)問(wèn)私有訪(fǎng)問(wèn)控制符- private被該類(lèi)自身訪(fǎng)問(wèn)保護(hù)訪(fǎng)問(wèn)控制符- protected該類(lèi)自身、同一個(gè)包中的其他類(lèi)、其他
24、包中的子類(lèi)訪(fǎng)問(wèn)私有保護(hù)訪(fǎng)問(wèn)控制符-private protected該類(lèi)自身、所有子類(lèi)訪(fǎng)問(wèn),類(lèi)成員變量的訪(fǎng)問(wèn),29,非訪(fǎng)問(wèn)控制修符靜態(tài)變量static屬于類(lèi)的變量最終變量final值在程序的執(zhí)行過(guò)程中不會(huì)改變易失變量volatile可能同時(shí)被多個(gè)線(xiàn)程所控制和修改,類(lèi)成員變量的訪(fǎng)問(wèn),30,public (公共變量/公共方法)容許全權(quán)訪(fǎng)問(wèn),無(wú)任何限制(先構(gòu)造對(duì)象,再訪(fǎng)問(wèn)),類(lèi)成員的訪(fǎng)問(wèn),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();}},直接訪(fǎng)問(wèn)公有變量x和公共方法print(),31,private (私有變量/私有方法)僅能在其所定義的類(lèi)中被訪(fǎng)問(wèn)(先構(gòu)造對(duì)象,再訪(fǎng)問(wèn)),D:\>javac A.javax has private access in A a.x = 100; ^
27、print() has private access in A a.print(); ^2 errors,類(lèi)成員的訪(fǎng)問(wèn),class A {private int x;private void print() { … }}class B {void test() {A a = new A();a.x = 100;a.print();
28、}},32,protected (保護(hù)變量/保護(hù)方法)容許類(lèi)本身、子類(lèi)(有一定限制)以及同一個(gè)包中所有類(lèi)訪(fǎng)問(wèn)(先構(gòu)造對(duì)象,再訪(fǎng)問(wèn)),類(lèi)成員的訪(fǎng)問(wèn),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,無(wú)修飾 (友好變量/友好方法)容許類(lèi)本身以及同一個(gè)包中所有類(lèi)訪(fǎng)問(wèn),類(lèi)成員的訪(fǎng)問(wèn),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,小結(jié),* 指子類(lèi)與父類(lèi)不在同一個(gè)包中的情況,類(lèi)成員變量的訪(fǎng)問(wèn),35,static (靜態(tài)變量/靜態(tài)方法)類(lèi)的變量/方法,獨(dú)立于類(lèi)的對(duì)象,可以直接根據(jù)類(lèi)名調(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();}},類(lèi)成員變量,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方法,類(lèi)成員,
36、37,final 變量/方法final變量: 定義一個(gè)常數(shù),即變量值不能改變final double AVOGADRO = 6.022e23;final類(lèi): 不能有子類(lèi)final方法: 方法不能被重寫(xiě)(overriding)class ChessAlgorithm { . . . final void nextMove(ChessPiece pieceMoved,
37、 BoardLocation newLocation) { ... } . . .},類(lèi)成員變量,38,小結(jié)類(lèi): public, abstract, final, 無(wú)修飾, [private]類(lèi)成員publicprotectedprivate無(wú)修飾staticfinal,類(lèi)成員變量,39,方法: 對(duì)象行為的描述完成某種功能的程序塊定義: [訪(fǎng)問(wèn)權(quán)限修飾符] 方法返回類(lèi)型 方法名
38、() [throws 異常名] {方法體;}方法參數(shù)的傳遞變量的作用域方法的重載(overloading)/重寫(xiě)(overriding)方法的遞歸調(diào)用,類(lèi)成員方法,40,訪(fǎng)問(wèn)控制修飾符公共訪(fǎng)問(wèn)控制符-public 被所有類(lèi)訪(fǎng)問(wèn)默認(rèn)訪(fǎng)問(wèn)控制符被同一包中其他類(lèi)訪(fǎng)問(wèn)私有訪(fǎng)問(wèn)控制符- private被該類(lèi)自身訪(fǎng)問(wèn)保護(hù)訪(fǎng)問(wèn)控制符- protected該類(lèi)自身、同一個(gè)包中的其他類(lèi)、其他包中的子類(lèi)訪(fǎng)問(wèn)私有保護(hù)訪(fǎng)
39、問(wèn)控制符-private protected該類(lèi)自身、所有子類(lèi)訪(fǎng)問(wèn),類(lèi)成員方法的訪(fǎng)問(wèn),41,非訪(fǎng)問(wèn)控制修符靜態(tài)方法static屬于類(lèi)的方法最終方法final不能被子類(lèi)重新定義的方法抽象方法abstract只有方法說(shuō)明,沒(méi)有具體實(shí)現(xiàn)本地方法native以其他語(yǔ)言實(shí)現(xiàn)方法功能同步方法synchronized用于多線(xiàn)程程序中的協(xié)調(diào)和同步,類(lèi)成員方法的訪(fǎng)問(wèn),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ù),成員方法,形參和實(shí)參,D:\>java Parameter3 43 423,注意1: 類(lèi)型匹配注意2:基本類(lèi)型與復(fù)合類(lèi)型參數(shù)傳遞的結(jié)果不同,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;,輸出結(jié)果:3 4 511 12 13 14 15,45,變量的作用域(成員變量/局部變量),成員方法,46,方法的重載(overload)方法名相同,但方法的參數(shù)不同方法描述 方法名(標(biāo)識(shí)符) 參數(shù)類(lèi)型 方法返回值 絕對(duì)值 abs(a) int int絕對(duì)值 abs(a)
45、 long long絕對(duì)值 abs(a) float float絕對(duì)值 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,方法的重寫(xiě)(overriding)子類(lèi)重寫(xiě)父類(lèi)的方法,成員方法,class Father {… …void display( ) { … …; }… …},
47、class Son extends Father {… …void display() {… …;}… …},Father f = new Father();f.display();,Son s = new Son();s.display();,48,構(gòu)造方法,創(chuàng)建對(duì)象/實(shí)例化對(duì)象—new 例1: Apple a = new Apple(); (創(chuàng)建對(duì)象)例2: Apple a;
48、 (對(duì)象的說(shuō)明) a = new Apple(); (實(shí)例化對(duì)象)對(duì)象的實(shí)例化通過(guò)構(gòu)造方法(constructor)來(lái)實(shí)現(xiàn)構(gòu)造方法的名字與類(lèi)名相同構(gòu)造方法沒(méi)有返回值構(gòu)造方法可以有多個(gè),構(gòu)成方法的重載(overload),49,例: 對(duì)象的實(shí)例化和初始化,輸出結(jié)果: 2020 5010 20,構(gòu)造方法,50,再談方法的重載(overload),構(gòu)造方法,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,默認(rèn)構(gòu)造方法例 class Apple {int color; }Apple a = new Apple();對(duì)象實(shí)例的判斷: null例 Apple a; if (a == null) System.out.
52、println(“Day dream”);,構(gòu)造方法,運(yùn)行時(shí)系統(tǒng)自動(dòng)賦予一個(gè)空構(gòu)造函數(shù)如 Apple() { },52,再談構(gòu)造方法,構(gòu)造方法,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); } },運(yùn)行時(shí)系統(tǒng)自動(dòng)賦予一個(gè)空構(gòu)造方法,僅僅當(dāng)該類(lèi)沒(méi)定義構(gòu)造方法的情況下,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)生多少個(gè)對(duì)象,屬于類(lèi)的靜態(tài)變量只有一份,即只占有一份存儲(chǔ)空間,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();}},輸出結(jié)果In static blockIn constructorIn constructor,54,設(shè)計(jì)模式的例子,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類(lèi)只有一個(gè)實(shí)例,即該Singleton類(lèi)只能構(gòu)造一個(gè)對(duì)象,55,“Design Patterns: Elements of Reusable Object-Oriented Sof
60、tware”(設(shè)計(jì)模式)Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides Addison-Wesley, 1995這幾位作者常被稱(chēng)為“四人組(Gang of Four)”, 而這本書(shū)也就被稱(chēng)為“四人組(或 GoF)”書(shū)設(shè)計(jì)模式: 在一定的環(huán)境中解決某一問(wèn)題的方案23 種設(shè)計(jì)模式, 3大類(lèi)創(chuàng)建型模式(Creational pattern)規(guī)定了創(chuàng)建對(duì)象的方式,如Sing
61、leton模式、Factory Method模式結(jié)構(gòu)型模式(Structural pattern)規(guī)定了如何組織類(lèi)和對(duì)象。這些模式涉及類(lèi)如何相互繼承或如何從其它類(lèi)組合,如Adapter、Proxy 和 Decorator 模式行為模式(Behavioral pattern)規(guī)定了對(duì)象之間交互的方式。如Observer模式、Strategy和Template 模式并發(fā)模式(Concurrency pattern)規(guī)定協(xié)調(diào)或順序?qū)蚕?/p>
62、資源訪(fǎng)問(wèn)的方式MVC(Model/View/Controller, 模型/視圖/控制器),56,設(shè)計(jì)模式的例子,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; }},這個(gè)類(lèi)不可以再有子類(lèi),因?yàn)闃?gòu)造方法
64、是privateLazy instantiation (Lazy initialization),僅在需要的時(shí)候才實(shí)例化對(duì)象,private static Sequence instance = new Sequence();,57,抽象類(lèi)(abstract class),一個(gè)未完成的類(lèi)僅僅抽象類(lèi)可以包含抽象方法(abstract methods)抽象方法: 僅僅申明了方法,但未實(shí)現(xiàn)有訪(fǎng)問(wèn)修飾詞返回值類(lèi)型方法名參數(shù)列表無(wú)
65、方法體,58,抽象類(lèi)(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() { }},抽象方法: 有訪(fǎng)問(wèn)修飾詞、返回值類(lèi)型、方法名和參數(shù)列表,無(wú)方法體,59,抽象類(lèi)(abstract class),抽象類(lèi)不能被實(shí)例化,例Point p = new Point(); 子類(lèi)繼承抽象類(lèi)時(shí),必須重寫(xiě)抽象方法,否則仍為抽象類(lèi),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,抽象類(lèi)(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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- java的面向?qū)ο缶幊?-------課堂筆記
- java的面向?qū)ο缶幊掏馕馁Y料翻譯
- java面向?qū)ο缶幊叹毩?xí)題答案
- 面向?qū)ο笈c圖形編程
- java面向?qū)ο罂偨Y(jié)
- java面向?qū)ο蟪绦蛟O(shè)計(jì)03類(lèi)與對(duì)象
- 面向?qū)ο蟮母呒?jí)編程
- 面向?qū)ο蟮膉ava語(yǔ)言練習(xí)
- 《面向?qū)ο蟪绦蛟O(shè)計(jì)(java)》
- java面向?qū)ο罂碱}和答案
- java面向?qū)ο鬁y(cè)試試題
- java面向?qū)ο蠼坛坦P記01
- java-面向?qū)ο蠹夹g(shù)基礎(chǔ)
- 09_java面向?qū)ο骭講義
- java面向?qū)ο蟮膶W(xué)習(xí)心得
- java面向?qū)ο蟪绦蛟O(shè)計(jì)教案
-
評(píng)論
0/150
提交評(píng)論