《第一部分Java的类教学课件》由会员分享,可在线阅读,更多相关《第一部分Java的类教学课件(76页珍藏版)》请在金锄头文库上搜索。
1、第一章第一章 Java的类的类北京大学计算机系北京大学计算机系代亚非代亚非1第一章第一章 Java的类的类1.1 有关面向对象的概念有关面向对象的概念1.2 Java语言的特点语言的特点1.3 Java的开发环境的开发环境1.4 第一个第一个Java程序程序1.5 Java类型系统类型系统1.6 Java中字符串的类中字符串的类1.7 Java中的类、方法和变量中的类、方法和变量1.8 Java名空间及访问规则名空间及访问规则1.9 Java中的抽象类、接口和程序包中的抽象类、接口和程序包1.10 对象的构造函数对象的构造函数21.1 有关面向对象的概念有关面向对象的概念面向对象程序设计围绕的
2、几个主要概念面向对象程序设计围绕的几个主要概念:抽象数据类型、类、类型层次(子类),继抽象数据类型、类、类型层次(子类),继承性、多态性。承性、多态性。31.1 有关面向对象的概念有关面向对象的概念class Car int color_number; int door_number; int speed; void brake() void speedUp() ; void slowDown() 计算机中计算机中的对象的原型的对象的原型 现实生活现实生活中的对象中的对象 数据抽象类型数据抽象类型41.1 有关面向对象的概念有关面向对象的概念什么是类?什么是类?类是描述对象的类是描述对象的“基
3、本原型基本原型”,它定义一种,它定义一种对象所能拥有的数据和能完成的操作对象所能拥有的数据和能完成的操作,在面向在面向对象的程序设计中对象的程序设计中,类是程序的基本单元。类是程序的基本单元。variablesmethods 程序中的对象程序中的对象 是类的一个实例,是类的一个实例,是一个软件单元,是一个软件单元,它由一组结构化它由一组结构化的数据和在其上的数据和在其上的一组操作构成的一组操作构成。51.1 有关面向对象的概念有关面向对象的概念变量:即指对象的所知道的状态变量:即指对象的所知道的状态方法:指对象的功能单元。方法:指对象的功能单元。什么是消息?什么是消息?软件对象通过相互间传递消
4、息来相互作用和软件对象通过相互间传递消息来相互作用和通信通信 一个消息由三部分组成一个消息由三部分组成:1. 接受消息的对象接受消息的对象2. 要完成方法的名字要完成方法的名字3. 方法需要的参数方法需要的参数对象对象B对象对象 Amessage61.1 有关面向对象的概念有关面向对象的概念一个例子一个例子在程序中操作对象是类的一个实例在程序中操作对象是类的一个实例:即对象即对象创建一个对象创建一个对象 Hello obj=new Hello();调用方法调用方法 obj.showString(“Hello World!”)class Hello private String s;public
5、 void showString () System.out.println(s);public void changeString(String str) s=str; return s; 71.1 有关面向对象的概念有关面向对象的概念什么是封装什么是封装?封装把对象的所有组成部分组合在一起,封封装把对象的所有组成部分组合在一起,封装定义程序如何引用对象的数据,封装实际装定义程序如何引用对象的数据,封装实际 私有数据私有数据 方法方法上使用方法将类上使用方法将类的数据隐藏起来,的数据隐藏起来,控制用户对类的控制用户对类的修改和访问数据修改和访问数据的程度。的程度。 方法方法数据数据对象对象A
6、对象对象B公有数据公有数据81.1 有关面向对象的概念有关面向对象的概念什么是子类什么是子类?子类是作为另一个类的扩充或修正所定义的子类是作为另一个类的扩充或修正所定义的一个类一个类.bicycle(super class)Mountain bikesRacing bikesTandem bikessub class91.1 有关面向对象的概念有关面向对象的概念什么是继承什么是继承?继承是子类利用父类中定义的方法和变量就继承是子类利用父类中定义的方法和变量就像它们属于子类本身一样像它们属于子类本身一样.class Car int color_number; int door_number; i
7、nt speed; push_break() add_oil() class Trash_Car extends Car double amount; fill_trash() 101.1 有关面向对象的概念有关面向对象的概念什么是方法的覆盖什么是方法的覆盖?在子类中重新定义父类中已有的方法。在子类中重新定义父类中已有的方法。class Car int color_number; int door_number; int speed; push_break() speed=0; add_oil() class Trash_Car extends Car double amount; fill_
8、trash() push_break() speed=speed-10; 111.1 有关面向对象的概念有关面向对象的概念什么是方法的重载什么是方法的重载(多态性多态性)?在同一个类中至少有两个方法用同一个名字,在同一个类中至少有两个方法用同一个名字,但有不同的参数。但有不同的参数。类类void show(int int_num)void show(double double_num)void show(int int_ num, float float_num)1231.23123,1.23121.2 Java语言的特点语言的特点Java是什么?是什么? Java= “C+”-“复杂性和奇异
9、性复杂性和奇异性”+“安全性和可移植安全性和可移植性性”Java由那些特性?由那些特性?(1) 面向对象面向对象封装性、多态性、继承性、动态链接封装性、多态性、继承性、动态链接(2) 操作平台无关性操作平台无关性严格的语言定义严格的语言定义:“没有依据机器的不同而不没有依据机器的不同而不同同” 或或“由编译器决定由编译器决定”等字眼等字眼,最后的目最后的目标码都是一致的标码都是一致的,初值都是确定的初值都是确定的131.2 Java语言的特点语言的特点两种工作模式的比较两种工作模式的比较源源程程序序Java编译器编译器SPARCpentiumPowerpc中中间间码码Powerpcpentiu
10、mSPARC二进制二进制源源程程序序SPARCPowerpcpentiumPowerpcpentiumSPARC编译器编译器二进制二进制Java解释器解释器141.2 Java语言的特点语言的特点.编译编译,没有绝对地址没有绝对地址调入包含调入包含,继承所用继承所用道的所有类道的所有类, 内存分内存分配确定配确定,编程真正可编程真正可执行的机器码执行的机器码 Java源程序源程序(.java文件文件)Java编译器编译器Java Bytecode(.class文件文件)系统执行平台系统执行平台Bytecode 解释器解释器Bytecode 载入器载入器字节码校验器字节码校验器不存在伪造的指针不
11、存在伪造的指针不违反访问权限不违反访问权限不非法访问对象不非法访问对象不导致操作栈溢出不导致操作栈溢出 151.2 Java语言的特点语言的特点Java虚拟机虚拟机JavainterpreterJust-in-timecompilerRuntime SystemOperating SystemHardware不同的操作系统有不同的虚不同的操作系统有不同的虚拟机拟机.它类似一个小巧而高效的它类似一个小巧而高效的CPU.byte-code代码是与平台无关的代码是与平台无关的是虚拟机的机器指令是虚拟机的机器指令.Java字节代码运行的两种方式字节代码运行的两种方式:interpreter(解释方式解
12、释方式)Just-in-time(即时编译即时编译):有代码有代码生成器将字节代码转换成本机生成器将字节代码转换成本机的机器代码的机器代码,然后可以以较高速然后可以以较高速度执行度执行. 161.2 Java语言的特点语言的特点(3) 安全问题安全问题Java是在网络环境下使用的语言是在网络环境下使用的语言一个安全的网络至少要防止以下几种破坏的一个安全的网络至少要防止以下几种破坏的可能性可能性:毁灭系统资源毁灭系统资源消耗系统资源消耗系统资源挖掘系统或个人机密挖掘系统或个人机密骚扰正常工作的进行骚扰正常工作的进行171.2 Java语言的特点语言的特点Java源程序源程序(.java文件文件)
13、Java编译器编译器Java Bytecode(.class文件文件)Bytecode 载入器载入器Bytecode 解释器解释器系统执行平台系统执行平台语言定义语言定义publicprotectedprivatefinal取消指针取消指针自动回收自动回收垃圾垃圾Bytecode检查检查限定对象的限定对象的存取权限存取权限系统堆栈溢出系统堆栈溢出参数类型一致参数类型一致程序执行系统程序执行系统WWW浏览器浏览器限制限制Java小应用程序小应用程序的不正当使用的不正当使用181.2 Java语言的特点语言的特点(4) 多线程多线程Java提供现成的类提供现成的类Thread,只要继承这个类就可以
14、只要继承这个类就可以编写多线程的程序。编写多线程的程序。(5) Java与与C及及C+的区别的区别不再有不再有#include 和和#define 等于处理功能等于处理功能不再有不再有structure,union及及typedef不再有函数、不再有指针、不再有多重继承不再有函数、不再有指针、不再有多重继承不再有不再有goto不再有操作符重载不再有操作符重载(Operatior Overloading)取消自动类型转换取消自动类型转换,要求强制转换要求强制转换191.3 Java的开发环境的开发环境Java开发环境开发环境 JDKJDK中有中有Java编译器编译器和和bytecode解释器解释
15、器Applwtviewer是小应用程序的是小应用程序的bytecode解释解释器器JDK的安装的安装直接执行直接执行JDK.exe201.3 Java的开发环境的开发环境产生如下目录结构产生如下目录结构javabin的目录下包含义下主要文件的目录下包含义下主要文件:javac: Java编译器编译器, 用来将用来将java程序编译成程序编译成 Bytecodejava: Java编译器编译器,执行已经转换成执行已经转换成Bytecode的的 java应用程序应用程序.jdb: Java调试器调试器, 用来调试用来调试java程序程序javap: 反编译反编译,将类文件还原回方法和变量将类文件还
16、原回方法和变量.javadoc:文档生成器文档生成器,创建创建HTML文件文件appletviwer : Java解释器解释器, 用来解释已经转换用来解释已经转换成成 Bytecode的的java小应用程序小应用程序.211.3 Java的开发环境的开发环境javalib子目录子目录库函数库函数,其中其中classese.zip不要解开不要解开.在在autoexec.bat中加入以下两条命令中加入以下两条命令1. PATH c:javabin2. SET CLASSPATH=. ; c:.libclasses.zip; c:myclasses;221.3 Java的开发环境的开发环境C:jav
17、abinlibclasses.zipjavacjavaappletviewer用户类文件用户类文件所在目录所在目录myclasses当前目录当前目录231.3 Java的开发环境的开发环境vj1.1+的使用的使用1.进入进入vj,创建一个创建一个project2.加入加入java文件文件3. 编辑编辑java文件文件4. 编译编译java文件文件5. Build一个一个project文件文件6. 运行运行java程序程序 -如果是小应用程序如果是小应用程序,则直接在则直接在VJ环境下运环境下运行行 -如果是应用程序如果是应用程序,则在则在dos下运行下运行241.4 你的第一个你的第一个Jav
18、a程序程序编辑存盘:主类名编辑存盘:主类名(含有含有main方法方法)和和 文件文件名要名要一致性一致性 HelloWorldApp.java编译程序编译程序 : javac HelloWorldApp.java运行程序运行程序 : java HelloWorldApp “myjava”运行结果运行结果 : Hi, myjavaclass HelloWorldApp public static void main(String args) System.out.println(“Hi, ”+args0); Java应用和应用和Java小应用程序小应用程序251.4 你的第一个你的第一个Java
19、程序程序1. 声明一个类声明一个类 : public class HelloWorldApp , 类名的第一个字母要大写类名的第一个字母要大写2. 一个类中可有很多方法一个类中可有很多方法, main方法是运行程方法是运行程序的第一个方法,方法名的第一个字母要小序的第一个方法,方法名的第一个字母要小写写.3. System.out.println是向屏幕输出是向屏幕输出,相当于相当于C中中的的printf();public class HelloWorldApp public static void main(String args) System.out.println(“Hi, ”+arg
20、s0); 261.4 你的第一你的第一个个Java程序程序4. 命令行参数的获取命令行参数的获取 c:java HelloWorldApp myjava!6. 字符串的拼接字符串的拼接public class HelloWorldApp public static void main(String args) System.out.println(“Hi, ”+args0); 271.4 你的第一个你的第一个Java程序程序Java小应用程序不能直接执行和使用小应用程序不能直接执行和使用,必须要在必须要在浏览器中执行浏览器中执行import java.applet.Applet;import
21、java.awt.*;public class HelloApplet extends Applet public void paint(Graphics g) g.drawString(“Hello World”,0,50); 编辑存盘:编辑存盘: 主类名主类名(extends Applet)和文件名一致和文件名一致编译代码编译代码 : javac HelloApplet.java编写编写HTML文件文件 : HelloApplet.html281.4 你的第一个你的第一个Java程序程序运行运行applet程序程序: 1. appletviwer HelloApplet.html 2. 在
22、浏览器中运行在浏览器中运行 运行结果运行结果:Hello World!291.4 你的第一个你的第一个Java程序程序理解程序理解程序1. import语句相当于语句相当于C语言中的语言中的include每每 2. 每一个每一个applet都是都是java.applet.Applet的子类的子类 用用extends继承继承3. applet中没有中没有main方法方法import java.applet.Applet; import java.awt.*;public class HelloApplet extends Applet public void paint(Graphics g)
23、g.drawString(“Hello World”,0,50); 301.4 你的第一个你的第一个Java程序程序4. 当当applet被浏览器运行时被浏览器运行时,paint语句自动执行语句自动执行5. 在在applet中与屏幕输出有关的操作通过中与屏幕输出有关的操作通过Graphics对对象来实现象来实现6. 一个一个Java源文件内最多只能有一个源文件内最多只能有一个public 类类,称为称为主类,且必须和文件名同名主类,且必须和文件名同名import java.applet.Applet; import java.awt.*;public class HelloApplet ext
24、ends Applet public void paint(Graphics g) g.drawString(“Hello World”,0,50); 311.5 Java类型系统类型系统Java type systemprimitivereferencenullcharnumericbooleanclassinterface arrayintegralfloating-pointbyteshortintlongfloatdouble321.5 Java类型系统类型系统byte 8 位位 2 的补码的补码 (byte) 0short 16位位 2 的补码的补码 (short) 0int 32
25、位位 2 的补码的补码 0long 64位位 2 的补码的补码 0Lfloat 32位位 IEEE 754浮点数标准浮点数标准 0.0fdouble 64位位 IEEE 754浮点数标准浮点数标准 0.0dchar 16位位 同一码字符集同一码字符集 u0000 (Unicode character) 331.5 Java类型系统类型系统程序程序:保留字保留字,标识符标识符(类名、域名、方法名、类名、域名、方法名、符号常量、局部变量,标号、符号常量、局部变量,标号、),操作符、,操作符、界定符,字面常量。界定符,字面常量。声明一个变量声明一个变量int data=10; Boolean isA
26、lived;Java中的操作符中的操作符:与与C基本一致基本一致Java中不再有指针了中不再有指针了341.5 Java类型系统类型系统在在Java中中”引用引用“是指向一个对象在内存中是指向一个对象在内存中的位置的位置,在本质上是一种带有很强的完整性和在本质上是一种带有很强的完整性和安全性的限制的指针安全性的限制的指针.当你声明某个类当你声明某个类,接口或数组类型的一个变量接口或数组类型的一个变量时时,那个变量的值总是某个对象的引用或者是那个变量的值总是某个对象的引用或者是null引用引用.指针就是简单的地址而已指针就是简单的地址而已,引用除了表示地址引用除了表示地址而外而外,还象被引用的数
27、据对象的缩影还象被引用的数据对象的缩影,还提供还提供其他信息其他信息.指针可以有指针可以有+,-运算运算,引用不可以运算引用不可以运算.351.5 Java类型系统类型系统s1s210001s2=s1;a string10001class Mydate int year; int month; int day; Mydate today=new MyDate()00010008todays1=“a string”; 例例: String s1;String s2;361.5 Java类型系统类型系统能够动态取得的内存有两种能够动态取得的内存有两种,一种是对象实体一种是对象实体,一种数组一种数组
28、.Java用用new申请内存申请内存,不需要自己释放不用的不需要自己释放不用的内存内存.在在Java中,定义数组时不必给出数组的大小,中,定义数组时不必给出数组的大小,因为因为Java的数组是动态分配的。的数组是动态分配的。数组变量实际上是一个引用变量,因此要实数组变量实际上是一个引用变量,因此要实例化才能使用。例化才能使用。例:例:int Array; Array=new int8;371.5 Java类型系统类型系统例:例:String arrayOfString=new String10;每个数组元素包含一个对字符串对象的引用,每个数组元素包含一个对字符串对象的引用,此时值分配了包含字符
29、串引用的空间,并没此时值分配了包含字符串引用的空间,并没有对字符串本身分配内存,此时不能访问。有对字符串本身分配内存,此时不能访问。arrayOfStringfor(int i=0;iarrayString.length;i+) arrayOfStringi=new String(“Hello”+i)arrayOfString0arrayOfString1arrayOfString8arrayOfString9对数组的引用对数组的引用对对字字符符串串的的引引用用381.6 Java中的字符串中的字符串Java中的字符串类中的字符串类String和StringBufferString 类的定义和
30、实例的生成类的定义和实例的生成例: String str; str=“this is a string”或: String str1=new String(“hello”);或: String str2=“aaaa”;String类与其它类型的转换类与其它类型的转换例1:将实型数转换成字符串System.out.println(String.valueOf(Math.PI);.391.6 Java中的字符串中的字符串有两个字符串有两个字符串str1,str2str1=str2; 是指两个引用指向同一个地址是指两个引用指向同一个地址str1.equals(str2)是指两个字符串内容相等是指两个
31、字符串内容相等获取获取String对象的信息对象的信息例如:例如:String s=“this is a string”; int len=s.length(); boolean result=s.equal(“this is a 特特test”); char ch=s.charAt(6);401.6 Java中的字符串中的字符串StringBuffer的字符串的内容是可以改变的的字符串的内容是可以改变的创建创建StringBuffer对象对象StringBuffer str=new Stringbuffer(“hello”);获取获取StringBuffer对象的信息对象的信息int len
32、=str.length();例例:StringBuffer sb=new StringBuffer(“Drink Java!”); sb.insert(6,”Hot ”); System.out.println(sb.toString(); Drink Hot Java!System.out.println接受的是接受的是String类类411.7 Java中的类、方法和变量中的类、方法和变量试用一个简单的类试用一个简单的类class Car int car_number; void set_number(int car_num) car_number=car_num; void show_n
33、umber() System.out.println (“My car No. is :”+car_number); class CarDemo public static void main(String args) Car Democar=new Car(); DemoCar.set_number(3838); DemoCar.show_number(); My car number is 3838421.7 Java中的类、方法和变量中的类、方法和变量类的继承类的继承 关系关系class Car int car_number; void set_number(int car_num) c
34、ar_number=car_num; void show_number() System.out.println (“My car No. is :”+car_number); class TrashCar extends Car int capacity; void set_capacity(int trash_car_capacity) capacity=trash_car_capacity; void show_capacity(); System.out.println(“My capacity is: ”+ capacity);431.7 Java中的类、方法和变量中的类、方法和变量
35、TrashCar中继承了中继承了Car中的两个方法中的两个方法class CarDemo public static void main(String args) TrashCar DemoTrashCar=new TrashCar(); DemoTrashCar.set_number(4949); DemoTrashCar.set_capacity(20); DemoTrashCar.show_number(); DemoTrashCar.show_capacity(); Car是父类是父类, TrashCar是子类是子类441.7 Java中的类、方法和变量中的类、方法和变量何时选择继承性
36、何时选择继承性?一个很好的经验一个很好的经验: “B是一个是一个A吗吗?”如果是则让如果是则让B做做A的子类的子类.常犯的错误常犯的错误A有一个有一个B吗吗? 例如让汽例如让汽车轮子成为汽车的子类是错误的车轮子成为汽车的子类是错误的451.7 Java中的类、方法和变量中的类、方法和变量类的严格定义及修饰字类的严格定义及修饰字类的修饰字类的修饰字 class 类名称类名称 extends 父类名称父类名称 . public, abstract, final或者没有或者没有变量修饰字变量修饰字 变量数据类型变量数据类型 变量名变量名1,变量名变量名2=变量初值变量初值;方法修饰字方法修饰字 方法
37、的返回值类型方法的返回值类型 方法名称方法名称(参数参数1,参数参数2, /方法的内容方法的内容方法和变量的定义及修饰字方法和变量的定义及修饰字public、protected、private461.8 Java名空间及访问规则名空间及访问规则每个类都创造了有自己的名字空间,指方法和每个类都创造了有自己的名字空间,指方法和变量可以知道彼此的存在,可以使用。变量可以知道彼此的存在,可以使用。abstract类不能直接产生属于这个类的对象类不能直接产生属于这个类的对象final类不能被其他任何类所继承类不能被其他任何类所继承(安全的考虑安全的考虑)public类不但可以被同一程序包中的其它类使用类
38、不但可以被同一程序包中的其它类使用,别的程序包中的类也可以使用别的程序包中的类也可以使用.friendly(缺省缺省)类只能被本包中的其它类使用类只能被本包中的其它类使用471.8 Java名空间及访问规则名空间及访问规则变量和方法的修饰字变量和方法的修饰字public、protected、privatepublic: 任何其它类、对象只要可以看到这个任何其它类、对象只要可以看到这个类的话,那么它就可以存取变量的数据,或类的话,那么它就可以存取变量的数据,或使用方法。使用方法。class ABC public int pub_i=5; public void show)() System.ou
39、t.println (“pub_i”+pub_i);481.8 Java名空间及访问规则名空间及访问规则class Demo public static void main(String args) ABC abc=new ABC(); System.out.println(“abc.pub_i”+abc.pub_i); abc.pub_i=10; abc.show(); abc.pub_i=5pub_i=10;491.8 Java名空间及访问规则名空间及访问规则protected变量和方法变量和方法如果一个类中变量或方法有修饰字如果一个类中变量或方法有修饰字protected,同一类,同一同
40、一类,同一包可以使用。不同包的类要使用,必须是该包可以使用。不同包的类要使用,必须是该类的子类可以存取变量或调用类的子类可以存取变量或调用public class ABC protected int pro_i=5; protected void show() System.out.println (“pro_i=” +pro_i;) 501.8 Java名空间及访问规则名空间及访问规则不同中的类不能使用不同中的类不能使用class DEF public static void main(String args) ABC abc=new ABC(); System.out.println (“
41、abc.pro_i=“+abc.pro_i); abc.pub_i=10; abc.show(); 51import mytest.pack.ABC;class DEF extends ABC public static void main(String agrs) DEF def=new DEF(); System.out.println(def.i); def.i=10; def.show(); pro_i=5pro_i=101.8 Java名空间及访问规则名空间及访问规则不同包但是是子类不同包但是是子类521.8 Java名空间及访问规则名空间及访问规则private不允许任何其他类存取
42、和调用不允许任何其他类存取和调用friendly(前边没有修饰字的情况前边没有修饰字的情况)在同一程序包中出现的类才可以直接使用它在同一程序包中出现的类才可以直接使用它的数据和方法的数据和方法.531.8 Java名空间及访问规则名空间及访问规则当子类中的变量名与父类的相同当子类中的变量名与父类的相同,原来的变量原来的变量被遮盖被遮盖.class A int data_a=3;class B extends A int data_a=5;class C extends B void print_out() System.out.println(“data_a= ”+data_a); Syste
43、m.out.println(“A.data_a= ”+A.data_a); System.out.println(“B.data_a= ”+B.data_a); data_a=5A.data_a=3B.data_a=5class demo public static void main(String args) C c=new C(); c.println_out(); 541.8 Java名空间及访问规则名空间及访问规则方法的覆盖方法的覆盖(overriding)和重载和重载(overloading)子孙类中定义的方法和祖先类中某个方法同子孙类中定义的方法和祖先类中某个方法同名名,同参数行同
44、参数行,则祖先类中的该方法被覆盖则祖先类中的该方法被覆盖.方法的重载是指一个对象的多态性方法的重载是指一个对象的多态性,即多个方即多个方法用相同的名称法用相同的名称,但参数行不同但参数行不同.类类void show(int int_num)void show(double double_num)void show(nit nit_ um, float float_um)1231.23123,1.23551.8 Java名空间及访问规则名空间及访问规则到此为止到此为止-finalfinal在方法之前在方法之前,防止该方法被覆盖防止该方法被覆盖.final在类之前在类之前,标是该类不能被继承标是该
45、类不能被继承final在变量之前在变量之前,定义一个常量定义一个常量.属于类的变量和方法属于类的变量和方法-staticstatic 在变量或方法之前在变量或方法之前, 表明它们是属于类的表明它们是属于类的,class ABCD char data; static int_share_data; class Demo ABCD a,b,c,dobject bchar dataobject cchar dataObject bchar datastatic intshare_dataobject bchar data561.8 Java名空间及访问规则名空间及访问规则静态变量在各实例间共享静态变
46、量在各实例间共享如果是如果是public静态变量静态变量,则其它类可以不通过则其它类可以不通过实例化访问它们实例化访问它们静态方法称为类的方法静态方法称为类的方法,因此不用实例化即可因此不用实例化即可调用调用(面向过程面向过程)571.8 Java名空间及访问规则名空间及访问规则例例:不正确的引用不正确的引用class StaticError String mystring=“hello”; public static void main(String args) System.out.println(mystring);错误信息错误信息:cant make a static referenc
47、e to nonstatic variable.为什么不正确为什么不正确? 只有对象的方法可以访问对只有对象的方法可以访问对象的变量象的变量.一个对象的方法可以访问对象的数据成员一个对象的方法可以访问对象的数据成员,尽尽管不属于方法的局部变量管不属于方法的局部变量一个类的方法只能访问自己的局部变量一个类的方法只能访问自己的局部变量581.8 Java名空间及访问规则名空间及访问规则解决的办法解决的办法:1. 将变量改称类变量将变量改称类变量class StaticError static String mystring=“hello”; public static void main(Stri
48、ng args) System.out.println(mystring);591.8 Java名空间及访问规则名空间及访问规则2. 先创建一个类的实例先创建一个类的实例class NoStaticError public static void main(String args) String mystring=“hello”; System.out.println(mystring); 601.9 Java中的抽象类、接口和程序包中的抽象类、接口和程序包抽象类是指不能直接被实例化的类抽象类是指不能直接被实例化的类,因此一般因此一般作为其它类的超类作为其它类的超类,与与final类正好相反类
49、正好相反抽象类中的抽象的方法抽象类中的抽象的方法-在该类中定义但不在在该类中定义但不在该类中提供实现该类中提供实现,由继承类提供细节由继承类提供细节public abstract class SomeAbstractClass void method1() System.out.println(“Hi, Java”); void method2();定义抽象方法的类必须是抽象类定义抽象方法的类必须是抽象类.611.9 Java中的抽象类、接口和程序包中的抽象类、接口和程序包/已有两个类已有两个类CircleCircle和和Rectangle,Rectangle,完成相关参数的计算完成相关参数的
50、计算 class Circle class Circle public int r; public int r; Circle(int r) this.r=r /this Circle(int r) this.r=r /this指指 这个对象的这个对象的 public int area() return 3*r*r; / public int area() return 3*r*r; /取近似取近似 class Rectange class Rectange public int width,height; / public int width,height; /这里不需这里不需thisthi
51、s Rectangle (int w, int h) width=w,height=h; Rectangle (int w, int h) width=w,height=h; public int area() public int area() return width*height; return width*height; 621.9 Java中的抽象类、接口和程序包中的抽象类、接口和程序包假设有若干个假设有若干个Circle,以及若干个以及若干个Rectangle,希望计算希望计算它们的总面积它们的总面积,直截了当的做法是将它们分别放到两直截了当的做法是将它们分别放到两个数组中个数组中
52、,用两个循环用两个循环,加上一个加法加上一个加法,这种做法是不这种做法是不漂亮的漂亮的如果还有其它形状如果还有其它形状,triangle,ellipses等等,上述方法上述方法显得显得“累赘累赘”,我们希望有一种统一的表示我们希望有一种统一的表示,例如用例如用一个数组一个数组shape,接受所有的形状接受所有的形状,然后用然后用631.9 Java中的抽象、接口和程序包中的抽象、接口和程序包abstract class Shape abstract float area();class Circle extends Shape public int r; Circle(int r) this.
53、r=r; public float area() return 3.14*r*r; class Square extends Shapepublic int width,height; Rectangle (int w, int h) width=w,height=h; public float area() return width*height; for (i=0;ishape.length;i+) for (i=0;ishape.length;i+) area_total+=shapei.area(); area_total+=shapei.area();641.9 Java中的抽象类、
54、接口和程序包中的抽象类、接口和程序包利用接口可实现多重利用接口可实现多重 继继承承(可同时实现多个接口)可同时实现多个接口)接口的作用和抽象类接口的作用和抽象类 类似类似,指定原型指定原型,不直不直 接定义方法的内容接定义方法的内容.关键字关键字implement用用 来来实现方法实现方法,即在使用时要即在使用时要用给出方法的实际内容用给出方法的实际内容接口中的方法和变量接口中的方法和变量是是public的的interface Stack void push(object x); object pop();class A extends Applet implements Stack void
55、 push(object x) ;/具体内容具体内容 object pop() ;/具体内容具体内容 651.9 Java中的抽象类、接口和程序包中的抽象类、接口和程序包程序包:程序包:相当于其它语言中的库函数相当于其它语言中的库函数打包打包package Graphics;class Square ;class Circle ;class Triangle ;使用程序包中的类要用使用程序包中的类要用import命令命令.表示路径表示路径,*表示使用包中的所有类表示使用包中的所有类import java.io.FileInputStream;import java.io.*;iojavaFil
56、eInputStream661.10 对象的构造函数对象的构造函数使用使用new来做内存配置来做内存配置class Demo1 /数组的配置数组的配置 public static void main(String args) int array; array=new int55; array14=5; class myClass /对象实体的产生对象实体的产生 int data=5;class Demo2 public static void main(String args) myClass obj;/建立一个引用建立一个引用 obj=new myClass(); System.out.pr
57、intln(obj.data); 671.10 对象的构造函数对象的构造函数Constructor和和finalizerconstructor(构造函数构造函数),在一个类中和类同名在一个类中和类同名的方法叫构造函数的方法叫构造函数.系统在产生对象时会自动系统在产生对象时会自动执行执行.class Point int x,y; Point() x =0;y=0; Point(int new_x,int new_y) x=new_x,y=new_y; class UsePoint Point point_A=new Point(); Point point_B=new Point(5,7);68
58、1.10 对象的构造函数对象的构造函数构造函数应包含哪些内容构造函数应包含哪些内容?构造函数多半定义一些初值或内存配置工作构造函数多半定义一些初值或内存配置工作一个类可以有多个构造函数一个类可以有多个构造函数(重载重载),根据参数根据参数的不同决定执行哪一个的不同决定执行哪一个.如果程序中没有定义构造函数如果程序中没有定义构造函数,则创造实例时则创造实例时使用的是缺省函数使用的是缺省函数,它是一个无内容的空函数它是一个无内容的空函数.691.10 对象的构造函数对象的构造函数thisthis指自己这个对象指自己这个对象this的作用是要将自己这个对象当作参数的作用是要将自己这个对象当作参数,传
59、传送给别的对象中的方法送给别的对象中的方法.class ThisClass public static void main() Bank bank=new Bank(); bank.someMethod(this); class Circle int r; Circle(int r) this.r=r; public area() return r*r*3;70super指这个对象的父类指这个对象的父类super用来引用父类中的方法及变量数据用来引用父类中的方法及变量数据.public class apple extends fruits public apple(int price) sup
60、er(price); 以上句子表示使用超类的构造函数生成实例以上句子表示使用超类的构造函数生成实例super必须是子类构造器的第一条语句必须是子类构造器的第一条语句1.10 对象的构造函数对象的构造函数71小结小结一个一个Java程序程序(包括小应用程序包括小应用程序)由若干个类由若干个类组成组成,它们分布在由它们分布在由CLASSPATH指定的一个指定的一个目录中目录中一个一个Java程序中只能由一个主类程序中只能由一个主类,并且与文件并且与文件同名同名.CLASSPATH指定多个目录指定多个目录,它们和起来被看它们和起来被看成是这个目录的根成是这个目录的根,根中的类构成缺省包根中的类构成缺
61、省包目录树中每个子目录中的类的集合对应目录树中每个子目录中的类的集合对应Java一个包一个包(package),子目录的层次与包的记法子目录的层次与包的记法的层次对应的层次对应72小结小结C:javabinlibclasses.zipjavacjavaappletviewerjavasourcemyclass让让PATH包含包含javabinSET CLASSPATH=.; C:.myclassesimport java.io.*;import java.awt.Graphics;import mycalss.calculate.*;public class test myjava.javac
62、alculateABCpackage myclass.calculateclass A class BclassC73小结小结名空间及访问规则名空间及访问规则-package,class/object,member,局部变量局部变量-public ,private,protected,default成员的可视性描述成员的可视性描述public protected 缺省缺省 privateyesyesyesyesyesyesyesyesnoyes*nonoyesnonono同一类中同一类中同一包中同一包中不同包的不同包的子类中子类中非子类非子类也不同包也不同包74小结小结对象模型对象模型-Jav
63、a的类和对象的类和对象(一般一般,抽象抽象,接口接口)-继承机制继承机制(单继承单继承,多实现多实现)static, import, final的含义和作用的含义和作用 75小结小结避免在类中使用太多的基本类型避免在类中使用太多的基本类型private String senderName;private String senderStreet;private String senderCity;private String senderState;private String senderZip;private String receiverName;private String receiverStreet;private String receiverCity;private String receiverState;private String receiverZip;address senderaddress receiver76