1.1 有关面向对象的概念 变量:即指对象的所知道的状态 方法:指对象的功能单元。 什么是消息? 软件对象通过相互间传递消息来相互作用和通信 一个消息由三部分组成: 1. 接受消息的对象 2. 要完成方法的名字 3. 方法需要的参数 对象B 对象 A message
1.1 有关面向对象的概念 什么是封装? 封装把对象的所有组成部分组合在一起,封装定义程序如何引用对象的数据,封装实际 上使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度。 公有数据 数据 私有数据 方法 方法 对象A 对象B
1.1 有关面向对象的概念 什么是子类? 子类是作为另一个类的扩充或修正所定义的一个类. bicycle (super class) sub class Mountain bikes Tandem bikes Racing bikes
1.1 有关面向对象的概念 什么是继承? 继承是子类利用父类中定义的方法和变量就像它们属于子类本身一样. class Car { int color_number; int door_number; int speed; push_break() { … } add_oil() { … } } class Trash_Car extends Car { double amount; fill_trash() { … } }
1.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_trash() { … } push_break() { speed=speed-10; } }
1.1 有关面向对象的概念 什么是方法的重载(多态性)? 在同一个类中至少有两个方法用同一个名字,但有不同的参数。 void show(int int_num) 123 1.23 void show(double double_num) 类 123,1.23 void show(nit nit_ um, float float_um)
1.2 Java语言的特点 Java是什么? Java由那些特性? (1) 面向对象 封装性、多态性、继承性、动态链接 “C++”--“复杂性和奇异性”+“安全性和可移植性” Java由那些特性? (1) 面向对象 封装性、多态性、继承性、动态链接 (2) 操作平台无关性 严格的语言定义:“没有依据机器的不同而不同” 或“由编译器决定”等字眼,最后的目标码都是一致的,初值都是确定的
1.2 Java语言的特点 (4) 多线程 Java提供现成的类Thread,只要继承这个类就可以编写多线程的程序。 (5) Java与C及C++的区别 不再有#include 和#define 等于处理功能 不再有structure,union及typedef 不再有函数、不再有指针、不再有多重继承 不再有goto 不再有操作符重载(Operatior Overloading) 取消自动类型转换,要求强制转换
1.3 Java的开发环境 java\bin的目录下包含义下主要文件: javac: Java编译器, 用来将java程序编译成 产生如下目录结构 java\bin的目录下包含义下主要文件: javac: Java编译器, 用来将java程序编译成 Bytecode java: Java编译器,执行已经转换成Bytecode的 java应用程序. jdb: Java调试器, 用来调试java程序 javap: 反编译,将类文件还原回方法和变量. javadoc:文档生成器,创建HTML文件 appletviwer : Java解释器, 用来解释已经转换成 Bytecode的java小应用程序.
1.5 Java类型系统 Java type system primitive reference null char numeric boolean class interface array integral floating-point byte short int long float double
1.5 Java类型系统 byte 8 位 2 的补码 (byte) 0 short 16位 2 的补码 (short) 0 int 32 位 2 的补码 0 long 64位 2 的补码 0L float 32位 IEEE 754浮点数标准 0.0f double 64位 IEEE 754浮点数标准 0.0d char 16位 同一码字符集 ‘\u0000’ (Unicode character)
1.5 Java类型系统 程序:保留字,标识符(类名、域名、方法名、符号常量、局部变量,标号、…),操作符、界定符,字面常量。 声明一个变量 int data=10; Boolean isAlived; Java中的操作符:与C基本一致 Java中不再有指针了
1.5 Java类型系统 在Java中”引用“是指向一个对象在内存中的位置,在本质上是一种带有很强的完整性和安全性的限制的指针. 当你声明某个类,接口或数组类型的一个变量时,那个变量的值总是某个对象的引用或者是null引用. 指针就是简单的地址而已,引用除了表示地址而外,还象被引用的数据对象的缩影,还提供其他信息. 指针可以有++,--运算,引用不可以运算.
1.5 Java类型系统 例: String s1;String s2; s1 s1=“a string”; s2 s2=s1; 10001 a string s1=“a string”; s2 10001 s2=s1; class Mydate { int year; int month; int day; } today 10008 Mydate today=new MyDate()
1.5 Java类型系统 能够动态取得的内存有两种,一种是对象实体,一种数组. Java用new申请内存,不需要自己释放不用的内存. 数组变量实际上是一个引用变量,因此要实例化才能使用。 例:int Array[]; Array=new int[8];
1.5 Java类型系统 例:String arrayOfString[]=new String[10];每个数组元素包含一个对字符串对象的引用,此时值分配了包含字符串引用的空间,并没有对字符串本身分配内存,此时不能访问。 arrayOfString[0] arrayOfString[1] arrayOfString[8] arrayOfString[9] 对 字 符 串 的 引 用 arrayOfString 对数组的引用 for(int i=0;i<arrayString.length;i++) arrayOfString[i]=new String(“Hello”+i)
1.6 Java中的字符串 有两个字符串str1,str2 str1=str2; 是指两个引用指向同一个地址 str1.equals(str2) 是指两个字符串内容相等 获取String对象的信息 例如:String s=“this is a string”; int len=s.length(); boolean result=s.equal(“this is a 特test”); char ch=s.charAt(6);
1.8 Java名空间及访问规则 每个类都创造了有自己的名字空间,指方法和变量可以知道彼此的存在,可以使用。 abstract类不能直接产生属于这个类的对象 final类不能被其他任何类所继承(安全的考虑) public类不但可以被同一程序包中的其它类使用,别的程序包中的类也可以使用. friendly(缺省)类只能被本包中的其它类使用
public, abstract, final或者没有 public、protected、private 1.7 Java中的类、方法和变量 public, abstract, final或者没有 类的严格定义及修饰字 [类的修饰字] class 类名称 [extends 父类名称] { …. } 方法和变量的定义及修饰字 public、protected、private [变量修饰字] 变量数据类型 变量名1,变量名2[=变量初值]…; [方法修饰字] 方法的返回值类型 方法名称(参数1,参数2,… { …//方法的内容 }
1.8 Java名空间及访问规则 变量和方法的修饰字public、protected、private class ABC { public int pub_i=5; public void show)() { System.out.println (“pub_i”+pub_i); }
1.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=5 pub_i=10;
1.8 Java名空间及访问规则 protected变量和方法 public class ABC { protected int pro_i=5; protected void show() { System.out.println (“pro_i=” +pro_i;) }
1.8 Java名空间及访问规则 不同中的类不能使用 class DEF { public static void main(String args[]) { ABC abc=new ABC(); System.out.println (“abc.pro_i=“+abc.pro_i); abc.pub_i=10; abc.show(); }
1.8 Java名空间及访问规则 不同包但是是子类 import 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=5 pro_i=10
1.8 Java名空间及访问规则 private 不允许任何其他类存取和调用 friendly(前边没有修饰字的情况) 在同一程序包中出现的类才可以直接使用它的数据和方法.
1.8 Java名空间及访问规则 当子类中的变量名与父类的相同,原来的变量被遮盖. class demo { public static void main(String args[]) { C c=new C(); c.println_out(); }} 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); System.out.println(“A.data_a= ”+A.data_a); System.out.println(“B.data_a= ”+B.data_a); }} data_a=5 A.data_a=3 B.data_a=5
1.8 Java名空间及访问规则 方法的覆盖(overriding)和重载(overloading) 子孙类中定义的方法和祖先类中某个方法同名,同参数行,则祖先类中的该方法被覆盖. 方法的重载是指一个对象的多态性,即多个方法用相同的名称,但参数行不同. void show(int int_num) 123 1.23 void show(double double_num) 类 123,1.23 void show(nit nit_ um, float float_um)
1.8 Java名空间及访问规则 到此为止-----final final在方法之前,防止该方法被覆盖. 属于类的变量和方法----static static 在变量或方法之前, 表明它们是属于类的, object b char data object c Object b static int share_data object b class ABCD { char data; static int_share_data; } class Demo { ABCD a,b,c,d}
1.8 Java名空间及访问规则 静态变量在各实例间共享 如果是public静态变量,则其它类可以不通过实例化访问它们 静态方法称为类的方法,因此不用实例化即可调用(面向过程) 一个对象的方法可以访问对象的数据成员,尽管不属于方法的局部变量 一个类的方法只能访问自己的局部变量
1.8 Java名空间及访问规则 例:不正确的引用 class StaticError { String mystring=“hello”; public static void main(String args[]) { System.out.println(mystring);} } 错误信息:can’t make a static reference to nonstatic variable. 为什么不正确? 只有对象的方法可以访问对象的变量.
1.8 Java名空间及访问规则 解决的办法: 1. 将变量改称类变量 class StaticError { static String mystring=“hello”; public static void main(String args[]) { System.out.println(mystring);} }
1.8 Java名空间及访问规则 2. 先创建一个类的实例 class NoStaticError { public static void main(String args[]) { String mystring=“hello”; System.out.println(mystring);} }
1.9 Java中的抽象类、接口和程序包 抽象类是指不能直接被实例化的类,因此一般作为其它类的超类,与final类正好相反 抽象类中的抽象的方法-在该类中定义但不在该类中提供实现,由继承类提供细节 public abstract class SomeAbstractClass { void method1() { System.out.println(“Hi, Java”);} void method2(); } 定义抽象方法的类必须是抽象类.
1.9 Java中的抽象类、接口和程序包 interface Stack 利用接口可实现多重 继承(可同时实现多个接口) { void push(object x); object pop();} 利用接口可实现多重 继承(可同时实现多个接口) 接口的作用和抽象类 类似,指定原型,不直 接定义方法的内容. 关键字implement用 来实现方法,即在使用时要用给出方法的实际内容 接口中的方法和变量 是public的 class A extends Applet implements Stack { void push(object x) { …;//具体内容 } object pop() …;//具体内容}
1.10 对象的构造函数 构造函数应包含哪些内容? 构造函数多半定义一些初值或内存配置工作 1.10 对象的构造函数 构造函数应包含哪些内容? 构造函数多半定义一些初值或内存配置工作 一个类可以有多个构造函数(重载),根据参数的不同决定执行哪一个. 如果程序中没有定义构造函数,则创造实例时使用的是缺省函数,它是一个无内容的空函数.
1.10 对象的构造函数 this this指自己这个对象 this的作用是要将自己这个对象当作参数,传送给别的对象中的方法. class Circle { int r; Circle(int r) {this.r=r;} public area() { return r*r*3;} } class ThisClass { public static void main() { Bank bank=new Bank(); bank.someMethod(this); }
1.10 对象的构造函数 super指这个对象的父类 super用来引用父类中的方法及变量数据. public class apple extends fruits { public apple(int price) { super(price); } } 以上句子表示使用超类的构造函数生成实例 super必须是子类构造器的第一条语句
小结 名空间及访问规则 --package,class/object,member,局部变量 --public ,private,protected,default 成员的可视性描述 public protected 缺省 private yes no yes* 同一类中 同一包中 不同包的 子类中 非子类 也不同包