第五章类、接口、包 ■关于对象与类,类变量、类方法、实例 变量、实例方法,我们已在第4章中作了 概念性的介绍。现在我们要用程序实例 进一步探讨对象向导程序设计的精神, 并介绍其他重要概念。 ■我们要先从Java的基本组件—类开始, 较深入地剖析它的构成,然后详细讲解 接口与包
第五章 类、接口、包 ◼ 关于对象与类,类变量、类方法、实例 变量、实例方法,我们已在第4章中作了 概念性的介绍。现在我们要用程序实例 进一步探讨对象向导程序设计的精神, 并介绍其他重要概念。 ◼ 我们要先从Java的基本组件——类开始, 较深入地剖析它的构成,然后详细讲解 接口与包
类组成组件 类是Java程序最小的基本单位。Java编译器无法处理比类更小的 程序代码。当我们说要着手开始写Java程序,也就是要开始建立 个类( class)。这些类有可能是顶层的抽象( abstract)类,也 有可能是直接继承某一个类的类。若是要写一个较大型的方案 ( project)时,便需要先规划好类上下层级关系,以及各类的存 取控制特性。 所以,我们在这里要来看一个类的组成及其运作规则。组成 个类的组件如下 import包 类修饰符] class xxxclass extends超类]〔 implements接口〕 类字段或称类变量 ∥例字段或称实例变量 /静态初始者 /类方法 ∥实例方法
类组成组件 类是Java程序最小的基本单位。Java编译器无法处理比类更小的 程序代码。当我们说要着手开始写Java程序,也就是要开始建立 一个类(class)。这些类有可能是顶层的抽象(abstract)类,也 有可能是直接继承某一个类的类。若是要写一个较大型的方案 (project)时,便需要先规划好类上下层级关系,以及各类的存 取控制特性。 所以,我们在这里要来看一个类的组成及其运作规则。组成一 个类的组件如下: [import包 ] [类修饰符] class xxxclass [extends超类]〔implements 接口〕 { //类字段或称 类变量 //实例字段或称 实例变量 //静态初始者 //类方法 //实例方法 }
创建类的实例对象new new操作符返回一个引用,而不是指针,这意味着可以把结 果赋给一个对象变量,而不是一个地址表达式。 Myclass obj=new Myclasso 在jaa中,经常需要使用new操作符来为对象分配实际内存空间,当定义 个对象变量时,仅仅是引用了一个对象,该变量在能够被使用前必须 与内存中的一个实际对象(利用new操作符分配的)相关联。 与C艹不同,java没有与new操作符匹配的 Delete操作符,也不必在源代 码中显示地释放内存空间,java解释器利用垃圾收集进程来处理对象的 撤消和内存管理。 new操作符可以用于创建一个或多个对象 Myclass obj[l-=new Myclass [10] 注意:当定义基本数据类型变量( (int, short, long, float, double, boolean/ FHchar) 或者字符串变量时,不必用new操作符,基本数据类型数据在数据存储 区中分配了真实的内存空间, String类型的对象可以用加引号字符串初 始化inta.b,c=200 String name="I love china
创建类的实例对象——new new操作符返回一个引用,而不是指针,这意味着可以把结 果赋给一个对象变量,而不是一个地址表达式。 Myclass obj=new Myclass(); 在java中,经常需要使用new操作符来为对象分配实际内存空间,当定义 一个对象变量时,仅仅是引用了一个对象,该变量在能够被使用前必须 与内存中的一个实际对象(利用new操作符分配的)相关联。 与C++不同,java没有与new操作符匹配的delete操作符,也不必在源代 码中显示地释放内存空间,java解释器利用垃圾收集进程来处理对象的 撤消和内存管理。 new操作符可以用于创建一个或多个对象 Myclass obj[]=new Myclass [10]; 注意:当定义基本数据类型变量(int,short,long,float,double,boolean和char) 或者字符串变量时,不必用new操作符,基本数据类型数据在数据存储 区中分配了真实的内存空间,String类型的对象可以用加引号字符串初 始化 int a,b,c=200; String name=“I love china”;
构造函数 构造函数是一种特殊的方法。用于对象由类产生时,对对象内容做一些初值设置(初 始化)。当new个类要产生实例时,便会自动调用该类的构造函数。 构造函数的声明格式 类名()( throws〕 以前面的轿车类为例: public class Sedan extends Car{/构造函数 public Sedan( i tintype=" Bridge Stone185T";∥轮胎型号 engine=15985f/排气量 public static void main( String argsi Sedan sedan=new Sedano
构造函数 构造函数是一种特殊的方法。用于对象由类产生时,对对象内容做一些初值设置(初 始化)。当new一个类要产生实例时,便会自动调用该类的构造函数。 构造函数的声明格式: <修饰符>类名(<参数行>)〔throws<异常种类>〕 { <构造函数主体> } 以前面的轿车类为例: public class Sedan extends Car{//构造函数 … public Sedan() { tiretype="BridgeStone185ST"; //轮胎型号 engine=1598.5f;//排气量 … } public static void main(String args[]){ Sedan sedan=new Sedan(); … } … }
构造函数的调用是在用new运算符创建类对象时由系统自 动完成的,构造函数的参数传递和形实结合过程也是由系 统调用的同时完成的 作用: 1、构造函数保证每一个新建对象都处于正常合理的状态 2、使得初始化工作不仅仅包括成员变量的赋值,还可以 有更复杂 Department(int dno, String dname, int total) if(dno<=0) System. exit(O) Deptno=dno m DeptName=new String(dname ); m Dept Totalemp=total
构造函数的调用是在用new运算符创建类对象时由系统自 动完成的,构造函数的参数传递和形实结合过程也是由系 统调用的同时完成的 作用: 1、构造函数保证每一个新建对象都处于正常合理的状态 2、使得初始化工作不仅仅包括成员变量的赋值,还可以 有更复杂 Department(int dno,String dname,int total) { if(dno<=0) System.exit(0); m_DeptNo=dno; m_DeptName=new String(dname); m_DeptTotalEmp=total; }
类修饰符 类修饰符除了( package)以外有3个: Public-提供给其他类完全的存取权限。也就是说在同一包中的 类可自由取用此类,而别的包中的类可通过 Import关键词来引 入此类所属的包加以运用。 而用此修饰符的类有几个特性 1.一个程序里只能有一个类被修饰为 public,否则编译会错 Public xxx class(t class aaaClassoi class bbbclass(t 2.源文件存储文件名,必须是用 public修饰的类名( xXX Class) 3.若程序中没有任何 public类,则文件名可任取。而如果文件名是 程序中的一个类名,则该类被视作 public,可供别的类存取
类修饰符 类修饰符除了(package)以外有3个: Public——提供给其他类完全的存取权限。也就是说在同一包中的 类可自由取用此类,而别的包中的类可通过import关键词来引 入此类所属的包加以运用。 而用此修饰符的类有几个特性: 1. 一个程序里只能有一个类被修饰为public,否则编译会错。 Public xxxClass(){ } class aaaClass(){ } class bbbClass(){ } 2. 源文件存储文件名,必须是用public修饰的类名(xxxClass) 3. 若程序中没有任何public类,则文件名可任取。而如果文件名是 程序中的一个类名,则该类被视作public,可供别的类存取
类修饰符 Abstract此字的英文意思是”抽象的”,”非实际的”。此修饰 符可修饰类及方法。字段倒没有用到这个修饰符。用此修饰类是 表示此类的功用不完全在于提供实际的程序代码,而只是先定义 些方法规格。然后让继承此类的次类来覆盖此规格的内容 abstract类与方法有下列特性: 1.一个抽象类里可以没有定义抽象方法。但只要类中有一个方法是 被声明为 abstract,则该类必须为 abstract 2.抽象类不能被实例化即不能被new生成一个实例对象 3.若一个子类继承一个抽象类,则子类需用覆盖的方式来实化该抽 象超类中的抽象方法。若没有完全实例化所有的抽象方法,则子 类仍是抽象的 抽象方法可再与 public、 protected复合使用,但不能与 final、 private和 static复合使用
类修饰符 Abstract——此字的英文意思是”抽象的”,”非实际的”。此修饰 符可修饰类及方法。字段倒没有用到这个修饰符。用此修饰类是 表示此类的功用不完全在于提供实际的程序代码,而只是先定义 一些方法规格。然后让继承此类的次类来覆盖此规格的内容。 abstract类与方法有下列特性: 1. 一个抽象类里可以没有定义抽象方法。但只要类中有一个方法是 被声明为abstract,则该类必须为abstract。 2. 抽象类不能被实例化,即不能被new生成一个实例对象。 3. 若一个子类继承一个抽象类,则子类需用覆盖的方式来实化该抽 象超类中的抽象方法。若没有完全实例化所有的抽象方法,则子 类仍是抽象的。 抽象方法可再与public、protected复合使用,但不能与final、private和 static复合使用
定义一个汽车抽象类 范例91:汽车抽象类 import java. awt. Color public abstract class Car ∥公用数据字段声明区 blic color colo ∥辆颜色 public int gearNum;,∥排档数 public String tiretype;∥轮胎型号 public float engine;∥}引擎排气量 ∥公用抽象方法声明区 public abstract void shaftgear( (O),∥换档 public abstract void brake(;∥煞车 lblic abstract void aircon();∥开冷气 public abstract void headlight(;∥开大灯
定义一个汽车抽象类 范例9_1:汽车抽象类 import java.awt.Color; public abstract class Car { //公用数据字段声明区 public Color color; //车辆颜色 public int gearNum; //排档数 public String tiretype; //轮胎型号 public float engine; //引擎排气量 //公用抽象方法声明区 public abstract void shiftgear(); //换档 public abstract void brake(); //煞车 public abstract void aircon(); //开冷气 public abstract void headlight(); //开大灯 }
范例92:轿车类 import java. awt. Color public class Sedan extends Cari 执行结果: static int gearNum=5,声明 gearNum为类栏 轿车颜色:nul 轿车排文件数:5 truetype=" Bridges tone85ST",/输胎型号 轿车轮胎型号 engine=15985f/排气量 BridgeStone 185ST 轿车排气量:15985 public static void main String args)i 轿车换文件方式:自排5文件 Sedan sedanFnew Sedano;∥产生实例 水压式煞车系统 sedanequipmentO sedan shaftgear O public void equipmento轿车的配备 System. out. printIn("轿车颜色:"+ color); System. out printIn("轿车排档数:"+ granUm) System out printIn("轿车轮胎型号:"+ tintype); System out printIn(轿车排气量:"+ engine), public void shifgearO(Systemout printIn(断轿车换档方式:自排叶 gearNu文件"}换档 public void brake({ System. out. print("水压式煞车系统"),}∥煞车 public void aircon{};∥开冷气 public void headlight Of}/开大灯
范例9_2:轿车类 import java.awt.Color; public class Sedan extends Car{ static int gearNum=5;//声明gearNum为类栏 public Sedan() {// tiretype="BridgeStone185ST"; //输胎型号 engine=1598.5f;//排气量 } public static void main(String args[]){ Sedan sedan=new Sedan(); //产生实例 sedan.equipment(); sedan.shiftgear (); sedan.brake(); } public void equipment(){//轿车的配备 System.out.println("轿车颜色:"+color); System.out.println("轿车排档数:"+gearNum); System.out.println("轿车轮胎型号:"+tiretype); System.out.println("轿车排气量:"+engine); } public void shiftgear(){System.out.println("轿车换档方式:自排"+ gearNum+"文件");}//换档 public void brake(){System.out.println("水压式煞车系统");} //煞车 public void aircon(){}; //开冷气 public void headlight(){};//开大灯 } 执行结果: 轿车颜色:null 轿车排文件数:5 轿车轮胎型号: BridgeStone185ST 轿车排气量:1598.5 轿车换文件方式:自排5文件 水压式煞车系统
范例93:我的车类 import java. awt. Color; 执行结果 public class MyCar extends Sedan 我的爱车排文件数:5 我的爱车颜色 private Color color java. awt. Color[r=0, g=0, b=255 public MyCarO( 我的爱车轮胎型号: Bridge stone l85sT color= Color blue;∥设置车辆颜色 我的爱车引擎排气量:15985 轿车换文件方式:自排5文件 我的爱车换文件方式:自排5文件 public static void main( String args i 水压式煞车系统 MyCar mycar-new MyCarO mycarequipment(; mycar shaftgear O hycar brake public void equipment System. out printl(我的爱车排档数:" this. gearNum System. out printl("我的爱车颜色:" this color System out printIn("我的爱车轮胎型号:" this. tiretype); System out printIng("我的爱车引擎排气量:"+ this engine); public void shaftgear{换档-覆盖的新方法 super shaftgear System out print"我的爱车换档方式:自排" this. gearNum档")
范例9_3:我的车类 import java.awt.Color; public class MyCar extends Sedan{ private Color color; public MyCar() { color=Color.blue; //设置车辆颜色 } public static void main(String args[]) { MyCar mycar=new MyCar(); mycar.equipment(); mycar.shiftgear (); mycar.brake(); } public void equipment(){ System.out.println("我的爱车排档数:"+this.gearNum); System.out.println("我的爱车颜色:"+this.color); System.out.println("我的爱车轮胎型号:"+this.tiretype); System.out.println("我的爱车引擎排气量:"+this.engine); } public void shiftgear(){//换档-覆盖的新方法 super.shiftgear(); System.out.println("我的爱车换档方式:自排"+this.gearNum+"档" );} } 执行结果: 我的爱车排文件数:5 我的爱车颜色: java.awt.Color[r=0,g=0,b=255] 我的爱车轮胎型号:BridgeStone185ST 我的爱车引擎排气量:1598.5 轿车换文件方式:自排5文件 我的爱车换文件方式:自排5文件 水压式煞车系统