收藏 分享(赏)

第三讲 java面向对象(上).ppt

上传人:hwpkd79526 文档编号:10069979 上传时间:2019-10-05 格式:PPT 页数:88 大小:1,016KB
下载 相关 举报
第三讲 java面向对象(上).ppt_第1页
第1页 / 共88页
第三讲 java面向对象(上).ppt_第2页
第2页 / 共88页
第三讲 java面向对象(上).ppt_第3页
第3页 / 共88页
第三讲 java面向对象(上).ppt_第4页
第4页 / 共88页
第三讲 java面向对象(上).ppt_第5页
第5页 / 共88页
点击查看更多>>
资源描述

1、1,课前回顾,Java中的标识符是由哪些字符组成的? Java中有哪些保留字?简单数据类型包含哪几种?各种数据类型变量的定义方法和常量的表示方法及取值范围。 Java 中各简单数据类型间的优先次序和自动转换规则是什么?各数据类型间在什么情况下,进行自动转换,在什么情况下使用强制转换? Java中有哪些运算符?这些运算符的优先关系是怎样的? Java 中有哪些控制语句?你了解每一种控制语句的语法规则吗?,2,回顾2-1,Java 具有8种基本数据类型:byte、 short、 int、 long、 boolean、char、float 及 double Java 中的运算符可划分为四个子集:算术

2、运算符、位运算符、关系运算符、逻辑运算符 & 运算符适用于如下子集:逻辑和位。逻辑 & 以条件表达式为操作数,而位 & 则以数字为操作数,3,回顾2-2,Java 支持下列控制结构: 选择( if-else、switch) 循环(while、do-while、for) 跳转(break、continue) break 语句在循环中用于立即从当前循环终止控制或者终止所标识的循环 continue 语句则是从其调用处跳至循环的开始处或者跳至所标识的循环开始处 数组可用来将同一类型的数据存储在连续的内存位置,4,5,Lesson 3: Classes and Objects (Part 1) 面向对

3、象(上),2012,6,面向对象特征(上),【学习目标】 本讲主要讲述java语言的面向对象技术,包括面向对象的基本概念、面向对象的程序设计方法及java中的类、包、对象及其面向对象的特性。通过本讲的学习,同学们可以使用面向对象技术编写java程序。 【学习指南】 应深刻理解各知识点的概念,使用上一讲的编程基础知识及面向对象技术,编写简单的java类,由浅至深,养成风格良好的编程习惯。 【参考书】 Java编程思想,4th,第5,6,7,8章 疯狂Java讲义,第5章,7,第三讲 面向对象(上),基本概念 类的定义 对象 类的继承和多态 接口和包,8,基本概念,什么是编程语言? 人和计算机进行

4、交流的工具和手段 编程语言的发展 机器语言: 0101001 汇编语言: mov, push, add, call 第三代语言: 高级语言,以C语言为代表,过程式编程语言(Procedural Programming Language) 第四代语言: 非过程化/面向对象的编程语言 语言的发展: 抽象的过程,9,面向对象(Object Oriented-OO) 面向对象编程(Object Oriented Programming-OOP) 面向对象是一种软件开发的方法,“面向对象的分析与设计”(OOA&OOD研究生课程) 第一个面向对象的语言: Simula-67 第一个成功的面向对象编程语言:

5、 Smalltalk C+, JAVA, C#, PERL等 用客观世界中描述事物的方法来描述程序中要解决的问题 万事万物都是对象 程序便是成堆的对象,彼此通过消息的传递,请求其他对象进行工作,基本概念,10,五个基本概念 对象 类 封装性 继承性 多态性,基本概念,11,对象 (object) everything is an object 现实世界的对象: 桌子、书、自行车、电视、狗、文件、表格、按钮、窗口 对象包含两个特性 状态: 指对象本身的信息(内部信息/内部变量) 行为: 实现对信息的访问/对象的操作 对象标志: 代表对象的标识符,基本概念,12,对象 (object) 状态变量(

6、variables) 行为方法(method) 对象就是变量和相关方法的软件集合 一个对象可以由其他对象组合而成,窗口(按钮,菜单条,文本框,状态栏等) 程序就是对象的集合,对象之间相互交互和通信完成任务 A program is a bunch of objects telling each other what to do by sending messages,基本概念,13,类 (class) 现实世界中,存在很多同类的对象,很多桌子、书、自行车 一种原型,一种抽象,一种共性,一个模板 Every object has a type 实例(instance),某类对象的一个特定实体,类

7、是对象的一个抽象 表格(类) 填入不同的个人信息不同的对象,基本概念,14,封装性 对象本身的数据得到保护/隐藏 其他对象仅仅需要知道对该对象的访问方法(接口/interface)即可 好处 模块化-每个对象的源文件可以是相互独立的,可以被不同的程序调用,每个对象是一块积木,可以搭建不同的形状 信息隐藏-通常定义一个公共接口/方法实现对对象的访问,可以调整对象的私有信息和方法,而不会对其他调用它的对象产生影响 可重用性,基本概念,15,继承性 为什么会有继承? 建立一个类后,发现另一个新的类有相同的特性,两个选择:重新定义一个新的类;在已有类的基础上,修改(加加/减减) 父类和子类,子类继承(

8、拥有)父类所有的数据和方法,同时子类可以有新的数据和方法,“青出于蓝,而胜于蓝” 树型结构(层次化结构) 根(基类),基本概念,16,继承性,运输工具,航空运输工具,陆地运输工具,水上运输工具,人力驱动,引擎驱动,二轮,四轮,客运,货运,基本概念,17,继承性 多重继承,类A,类B,类C,类D,类F,类G,一个类拥有多个父类产生二义性,例类C和类D都有一个同名的方法,类G? Java中仅仅支持单一继承,同时Java采用Interface(接口)实现多重继承而避免父类二义性,基本概念,18,多态性 表现在继承中方法的重写 子类从父类继承(extends扩展)而来 多个子类同属一个父类,所有子类有

9、相同的父类 继承父类的方法 在不同的子类中有不同的表现形式 表现在用一个类中方法的重载,基本概念,19,一个程序中同名的不同方法共存 主要通过子类对父类方法的覆盖来实现 不同类的对象可以响应同名的消息(方法) ,具体的实现方法却不同 使语言具有灵活、抽象、行为共享、代码共享的优势,很好地解决了应用程序函数同名问题,基本概念,多态性,20,多态性,class Shape void draw() void erase() class Circle extends Shape void draw() System.out.println(“Circle.draw()“); void erase()

10、System.out.println(“Circle.erase()“); ,基本概念,class Square extends Shape void draw() System.out.println(“Square.draw()“); void erase() System.out.println(“Square.erase()“); class Triangle extends Shape void draw() System.out.println(“Triangle.draw()“); void erase() System.out.println(“Triangle.erase()

11、“); ,21,多态性,public class Test public static Shape randShape() switch(int)(Math.random() * 3) default:case 0: return new Circle();case 1: return new Square();case 2: return new Triangle();,public static void main(String args) Shape s = new Shape9;for(int i = 0; i s.length; i+)si = randShape();for(int

12、 i = 0; i s.length; i+)si.draw(); ,Circle.draw() Triangle.draw() Circle.draw() Circle.draw() Circle.draw() Square.draw() Triangle.draw() Square.draw() Square.draw(),基本概念,22,第三讲 面向对象(上),基本概念 类的定义 对象 类的继承和多态 接口和包,23,程序是对象的集合,而对象是类的实例化 源程序就是一个个的Java类 Java本身提供的类(核心API) 见Java文档中描述 程序员可以对其进行调用 j2sdk1.4.1_

13、01jrelibrt.jar(22.4MB) 程序员自己定义的类,类的定义,24,类的定义格式 类的修饰符class 类名 extends 父类名 implements接口名 类型 成员变量1;类型 成员变量2; 类型 成员方法1(参数1, 参数2, ) 方法体;类型 成员方法2(参数1, 参数2, ) 方法体; ,类的定义,25,类的定义格式 类的修饰符 class 类名 extends 父类名 implements 接口名 类的修饰符 public: 公共类,可以被其他类所使用,declares that the class can be used by any class regardl

14、ess 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 that the class cannot be subclassed (宣布该类不能有子类),类的描述,26,类的修饰符 final - Declares that the class can

15、not be subclassed.(宣布该类不能有子类),类的描述,final class ChessAlgorithm . . . ,class BetterChessAlgorithm extends ChessAlgorithm . . . ,Cant subclass final classes: class ChessAlgorithm class BetterChessAlgorithm extends ChessAlgorithm 1 error,27,类的定义格式 类的修饰符 class 类名 extends 父类名 implements 接口名 extends: 继承的关系

16、 implements: 实现哪些接口(interface)的方法,实现多重继承 public class Test extends Frame implements ActionListener, ItemListener ,类的描述,28,一个简单的类 class Student String name, stuNumber;double score1, score2, score3;void set1(String s1, String s2) name = s1; stuNumber = s2;System.out.println(name + “ “ + stuNumber);dou

17、ble setScore(double d1, double d2, double d3) double d;score1 = d1;score2 = d2;score3 = d3;d = d1 + d2 + d3;return d; ,类的描述,29,包(Package)的概念 package org.jalpha; class test 源文件位置: “D:srcorgjalphatest.java” 编译方法1: “cd D:srcorgjalpha” “javac test.java” 编译方法2: “cd D:src”“javac orgjalphatest.java” class文

18、件位置: “D:srcorgjalphatest.class” 运行: “cd D:src” “java org.jalpha.test”,类的描述,30,包(Package)的概念 通过包来管理类名空间 防止同名类名的冲突 层次化的结构,类的描述,对个体(个人和机构) 将类文件放在不同的目录下 防止重名 orgjalphamethod1*.javamethod2*.java,ABC 公司 Engine.java,XYZ 公司 Engine.java,需调用Engine.java?,ABC 公司 comabcEngine.java,XYZ 公司 comxyzEngine.java,31,包(P

19、ackage)的概念 package org.jalpha; class test ,类的描述,D:srcorgjalphatest.java D:srcorgjalphatest1.java D:srcorgjalphatest2.java,32,对象具有状态和行为 成员变量定义 访问权限修饰符 类型 变量名; 访问权限修饰符 类型 变量名 =初值; 访问权限修饰符 类型 变量名 =初值 ,变量名 = 初值; 成员方法定义 访问权限修饰符 方法返回类型 方法名 () throws 异常名 方法体; 类型:基本类型,复合类型(数组、类和接口),类成员-变量和方法,33,访问控制修饰符 公共访问

20、控制符public 被所有类访问 默认访问控制符 被同一包中其他类访问 私有访问控制符 private 被该类自身访问 保护访问控制符 protected 该类自身、同一个包中的其他类、其他包中的子类访问 私有保护访问控制符private protected 该类自身、所有子类访问,类成员变量的访问,34,非访问控制修符 静态变量static 属于类的变量 最终变量final 值在程序的执行过程中不会改变 易失变量volatile 可能同时被多个线程所控制和修改,类成员变量的访问,35,public (公共变量/公共方法) 容许全权访问,无任何限制(先构造对象,再访问),类成员的访问,clas

21、s A public 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 test() A a = new A();a.x = 100;a.print(); ,直接访问公有变量x 和公共方法print(),36,private (私有变量/私有方法) 仅能在其所定义的类中被访问(先构造对象,再访问)

22、,D:javac A.java x has private access in Aa.x = 100; print() has private access in Aa.print(); 2 errors,类成员的访问,class A private int x;private void print() class B void test() A a = new A();a.x = 100;a.print(); ,37,protected (保护变量/保护方法) 容许类本身、子类(有一定限制)以及同一个包中所有类访问(先构造对象,再访问),类成员的访问,class A protected in

23、t x;protected void print() class B void test() A a = new A();a.x = 100;a.print(); ,package abc; 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 /legal,38,无修饰 (友好变量/友好方法)

24、 容许类本身以及同一个包中所有类访问,类成员的访问,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() package abc; class B void test() A a = new A();a.x = 100;a.print(); ,39,小结,* 指子类与父类不在同一个包中的情况,类成员变量的访问,40,static (静态变量/静态方法) 类的变量/方法,独立于类的对象,可以直接根据类名调用

25、 class D static int A = 12, B = 34;static void print() class Test public static void main(String args) System.out.println(“A=“ + D.A + “ B=“ + D.B);S.print(); ,类成员变量,41,static (静态变量/静态方法),class Test public void print(int x) System.out.println(x);public static void main(String args) int x = 3;print(x

26、);,D:javac Test.java Test.java:9: non-static method print(int) cannot be referenced from a static contextprint(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();t.print(x); ,class Test public static void print(int

27、 x) System.out.println(x);public static void main(String args) int x = 3;print(x);,static方法中仅仅可以调用其他static方法,类成员,42,final 变量/方法 final变量: 定义一个常数,即变量值不能改变 final double AVOGADRO = 6.022e23; final类: 不能有子类 final方法: 方法不能被重写(overriding) class ChessAlgorithm . . .final void nextMove(ChessPiece pieceMoved,Bo

28、ardLocation newLocation) . . . ,类成员变量,43,小结 类: public, abstract, final, 无修饰, private 类成员 public protected private 无修饰 static final,类成员变量,44,方法: 对象行为的描述 完成某种功能的程序块 定义: 访问权限修饰符 方法返回类型 方法名 () throws 异常名 方法体; 方法参数的传递 变量的作用域 方法的重载(overloading)/重写(overriding) 方法的递归调用,类成员方法,45,访问控制修饰符 公共访问控制符public 被所有类访问

29、默认访问控制符 被同一包中其他类访问 私有访问控制符 private 被该类自身访问 保护访问控制符 protected 该类自身、同一个包中的其他类、其他包中的子类访问 私有保护访问控制符private protected 该类自身、所有子类访问,类成员方法的访问,46,非访问控制修符 静态方法static 属于类的方法 最终方法final 不能被子类重新定义的方法 抽象方法abstract 只有方法说明,没有具体实现 本地方法native 以其他语言实现方法功能 同步方法synchronized 用于多线程程序中的协调和同步,类成员方法的访问,47,例,成员方法,class Test pu

30、blic static 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;void setV(double w, double h) width = w;height = h; double product() return width*height; ,48,方法参数,成员方法,形

31、参和实参,D:java Parameter 3 4 3 4 2 3,注意1: 类型匹配 注意2: 基本类型与复合类型 参数传递的结果不同,49,Java中的引用,在Java中 “引用”是指向一个对象在内存中的位置,在本质上是一种带有很强的完整性和安全性的限制的指针. 指针可以有+,-运算,引用不可以运算.,Pass by Value In Java methods, arguments are passed by value. When invoked, the method receives the value of the variable passed in. When the argu

32、ment is of primitive type, pass-by-value means that the method cannot change its value. When the argument is of reference type, pass-by-value means that the method cannot change the object reference, but can invoke the objects methods and modify the accessible variables within the object.,50,基本类型的值传

33、递,3.14,3.14,A,B,0x2F,0x2F,A,B,引用类型的地址传递,51,基本类型作为参数,class Testint a,b;change(int i,int j) a=i;b=j; /调用:int m=0;int n=1;change(m,n); ,i,j,a,b,拷贝,52,引用类型作为参数,class Testint a,b;Test(int i,int j) a=i;b=j;/可以在函数中改变对象状态void change(Test obj) obj.a=50;obj.b=40;/调用:Test t=new Test(10,20);change(t); ,函数中只能改变该

34、对象的状态,但不能改变该对象的引用,改变对象状态,11001,t,11001,obj,53,Day obj1=new Day(2002,5,30); Day obj2=new Day(2003,7,23); void swapobj(Day x,Day y)Day temp=y;y=x;x=temp; 调用: swapobj(obj1, obj2);,引用本身 按值传递,调用swapobj(obj1,obj2),54,例:值传递与地址传递,public class PassTest float m_float ;void change1(int pi) pi = 100; void chang

35、e2(String ps) ps=new String(“Right”) ; void change3(PassTest po ) po.m_float=100.0f ; ,55,public static void main(String args) PassTest pt = new PassTest() ; int i = 22 ;pt.change1( i ) ;System.out.println(“i value is ” + i);,56,String s = new String( “Hello” ) ;pt.change2( s ) ;System.out.println(“

36、s value is ” + s);pt.m_float = 22.0F ; pt.change3( pt ) ;System.out.println(“Current pt.m_float is ” + pt.m_float); / main() / class,57,程序运行结果,i value is 22 s value is Hello Current pt.m_float is 100.0,58,方法的重载(overload) 方法名相同,但方法的参数不同 方法描述 方法名(标识符) 参数类型 方法返回值 绝对值 abs(a) int int 绝对值 abs(a) long long

37、 绝对值 abs(a) float float public static int abs(int a) public static long abs(long a) public static float abs(float a),成员方法,59,方法重载,方法重载也是Java实现多态性机制的一种方式。 同一个类中多个方法有相同的名字,不同的参数列表,这种情况称为方法重载。 返回类型不同并不足以构成方法重载。 当重载方法被调用时,编译器根据参数的类型和数量来确定实际调用哪个重载方法的版本。,60,方法重载示例,class Calculation public void add( int a,

38、 int b) int c = a + b;System.out.println(“两个整数相加得 “+ c);public void add( float a, float b)float c = a + b;System.out.println(“两个浮点数相加得“+c);public void add( String a, String b) String c = a + b;System.out.println(“两个字符串相加得 “+ c); ,class CalculationDemo public static void main(String args) Calculation

39、 c = new Calculation();c.add(10,20);c.add(40.0F, 35.65F);c.add(“早上“, “好“); ,编译器决定调用版本,61,构造方法,创建对象/实例化对象new 例1: Apple a = new Apple(); (创建对象) 例2: Apple a; (对象的说明)a = new Apple(); (实例化对象) 对象的实例化通过构造方法(constructor)来实现 构造方法的名字与类名相同 构造方法没有返回值 构造方法可以有多个,构成方法的重载(overload),62,例: 对象的实例化和初始化,输出结果:20 20 50 10

40、 20,构造方法,63,再谈方法的重载(overload),构造方法,class Tree int height;Tree() prt(“Planting a seeding”);height = 0;Tree(int i) prt(“Creating new Treethat is ” + i + “ feet tall”);height = i;,void info() prt(“Tree is ” + height +“ feet height”); void info(String s) prt(s + “: Tree is ” +height +“ feet height”); st

41、atic void prt(String s) System.out.println(s); ,for (int i =0; i 5; i+) Tree t = new Tree(i);t.info();t.info(“my tree”); new Tree();,64,默认构造方法 例 class Apple int color; Apple a = new Apple(); 对象实例的判断: null 例 Apple a;if (a = null) System.out.println(“Day dream”);,构造方法,运行时系统自动赋予 一个空构造函数 如 Apple() ,65,再

42、谈构造方法,构造方法,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) public static void main (String args) /Cmethod c1 = new Cmethod();Cmethod c2 = new Cmethod(false);,class Cmethod Cmethod (b

43、oolean b) Cmethod () public static void main (String args) Cmethod c1 = new Cmethod();Cmethod c2 = new Cmethod(false);,运行时系统自动赋予一个空构造方法, 仅仅当该类没定义构造方法的情况下,66,static变量的初始化,class Smember static int i = 100;static boolean b = true;char c = t;public Smember() public static void main(String args) Smember

44、m1 = new Smember();Smember m2 = new Smember(); ,不论产生多少个对象, 属于类的静态变量只有一份, 即只占有一份存储空间,class 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 main(String args) Smembe

45、r m1 = new Smember();Smember m2 = new Smember(); ,输出结果 In static block In constructor In constructor,67,方法的重写(overriding) 子类重写父类的方法,成员方法,class Father void display( ) ; ,class Son extends Father void display() ; ,Father f = new Father(); f.display();,Son s = new Son(); s.display();,68,抽象类(abstract cl

46、ass),一个未完成的类 仅仅抽象类可以包含抽象方法(abstract methods) 抽象方法: 仅仅申明了方法,但未实现 有访问修饰词 返回值类型 方法名 参数列表 无方法体,69,抽象类(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; ,class SimplePoint ex

47、tends Point void alert() ,抽象方法: 有访问修饰词、 返回值类型、方法名和 参数列表,无方法体,70,抽象类(abstract class),抽象类不能被实例化,例Point p = new Point(); 子类继承抽象类时,必须重写抽象方法,否则仍为抽象类,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 in

48、t color; ,class SimplePoint extends Point void alert() ,Point p = new SimplePoint();,71,第三讲 面向对象(上),基本概念 类的定义 对象 类的继承和多态 接口和包,72,对象,引用对象的变量 格式: 对象名.变量名 引用对象的方法 格式: 对象名.方法名 例1 Vector v = new Vector(); v.addElement(“hello world”); 例2 int a= 1, 2, 3, 4, 5; int size = a.length; 例3 System.out.println();,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报