




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第 3 章 类和对象雷擎qleii对外经济贸易大学信息学院content3.1 面向对象程序设计的概念3.2 类和对象3.3 内部类3.4 对象的初始化和清除3.5 包 实验:类的定义和使用3.1 面向对象程序设计的概念面向对象的程序设计与结构化程序设计方法相比,更符合人类认识现实世界的思维方式 已成为程序设计的主流方向涉及的主要概念抽象封装继承多态 1.抽象忽略问题中与当前目标无关的方面,以便更充分地注意与当前目标有关的方面计算机软件开发中所使用的抽象有数据抽象(数据和操作结合在一起)过程抽象(功能划分,隐藏具体实现细节)抽象例子1: 学生选课class Student int stid;S
2、tring stname;class Courseint coid;String coname;int total;int rest;Studentstudents;抽象例子1: 学生选课学生数据(属性)int stid;String stname;方法(行为)void registerCourse(); void unRegCourse();抽象例子2:钟表数据(属性)int hour; int minute; int second;方法(行为)void setTime(); void showTime();抽象例子3:灯数据(属性)boolean status;方法(行为)void on(
3、); void off();2. 封装是一种信息隐蔽技术利用抽象数据类型将数据和基于数据的操作封装在一起用户只能看到对象的封装界面信息,对象的内部细节对用户是隐蔽的封装的目的在于将对象的使用者和设计者分开,使用者不必知道行为实现的细节,只需使用设计者提供的消息来访问对象封装的定义清楚的边界所有对象的内部信息被限定在这个边界内接口对象向外界提供的方法,外界可以通过这些方法与对象进行交互受保护的内部实现功能的实现细节,不能从类外访问。封装例子:钟表private int hour; private minute; private second;public void setTime(); publ
4、ic showTime();封装的意义在面向对象的程序设计中,类封装了数据及对数据的操作,是程序中的最小模块禁止了外界直接操作类中的数据,模块与模块之间只能通过严格控制的接口进行交互,这使得模块之间的偶合度大大降低保证了模块具有较好的独立性,程序维护和修改较为容易3. 继承是指新的类可以获得已有类(称为超类、基类或父类)的属性和行为,称新类为已有类的派生类(也称为子类)在继承过程中派生类继承了基类的特性,包括方法和实例变量派生类也可修改继承的方法或增加新的方法,使之更适合特殊的需要有助于解决软件的可重用性问题,使程序结构清晰,降低了编码和维护的工作量4. 多态一个程序中同名的不同方法共存主要通
5、过子类对父类方法的覆盖来实现不同类的对象可以响应同名的消息(方法) ,具体的实现方法却不同使语言具有灵活、抽象、行为共享、代码共享的优势,很好地解决了应用程序方法同名问题2.1 面向对象的程序设计方法概述面向对象程序设计基本组成单位是类程序在运行时由类生成对象,对象是面向对象程序的核心对象之间通过发送消息进行通信,互相协作完成相应功能对象现实世界中万物皆对象都具有各自的属性,对外界都呈现各自的行为 程序中一切都是对象都具有标识 (identity), 属性和行为(方法)通过一个或多个变量来保存其状态通过方法(method) 实现他的行为类将属性及行为相同或相似的对象归为一类类可以看成是对象的抽
6、象,代表了此类对象所具有的共有属性和行为在面向对象的程序设计中,每一个对象都属于某个特定的类Java中类与对象的关系类是一种复合数据类型,是Java程序的基本组成要素,描述了一类对象的状态和行为,其基本成分包括:成员变量成员方法类相当于程序中数据类型,对象是一个具体的变量。BACK3.2 类和对象3.2.1 类的定义3.2.2 对象的创建与使用3.2.3 类成员变量3.2.4 类成员方法3.2.5 静态代码块3.2.6 访问控制BACK3.2.1 类的定义定义形式public abstract | final class 类名称 extends 父类名称 implements 接口名称列表 变
7、量成员声明及初始化; 方法声明及方法体;最简单的类class Lightclass CircleBACK3.2.2 对象的创建与使用变量和对象变量除了存储基本数据类型的数据,还能存储对象的引用,用来存储对象引用的变量称为引用变量类的对象也称为类的实例创建对象创建对象的两个步骤声明对象名分配内存空间对象的声明格式类名称 变量名称 例如Circle是已经声明的类名,则下面语句声明的变量acircle将用于存储该类对象的引用: Circle aCircle; 声明一个引用变量时并没有对象生成分配内存空间生成实例的格式:new () 例如: aCircle=new Circle()其作用是:在内存中为
8、此对象分配内存空间返回对象的引用(reference ,相当于对象的存储地址)变量可以被赋以空值例如:aCircle=null;类的使用格式:对象名.成员成员包括成员方法和成员变量例:int x = Integer.MAX;System.out.println(String s);BACK3.2.3 类成员变量声明格式public | protected | private staticfinaltransient volatile变量数据类型变量名1=变量初值, 变量名2=变量初值, ;类成员变量的分类类成员变量分为两类:实例变量声明时没有static修饰类变量(静态变量)声明时用stati
9、c修饰实例变量变量声明中没有static修饰。变量所指向的对象必须有创建的步骤,如果所属的对象没有被创建,对象就不存在。所有对象都是实例成员变量。引用格式:对象名.实例变量类的实例变量成员的定义class Lightboolean status=false;/数据类型 变量名初始化值class Circle int radius = 0;类变量(静态变量)声明时需加static修饰符不管类的对象有多少,类变量只存在一份,在整个类中只有一个值类初始化的同时就被赋值适用情况类中所有对象都相同的属性经常需要共享的数据系统中用到的一些常量值引用格式.类变量(静态变量)例子class Circle st
10、atic double PI = 3.1415926535 int radius = 0;Java的类成员变量定义练习1用一个类来描述三维空间中的球类名:Ball成员变量:球心坐标 x球心坐标 y球心坐标 z半径 radius颜色color定义一个测试类BallTester,说明两个Ball类型的变量b1、b2,分别给他们的成员变量赋值,并打印出他们的半径。Java的类成员变量定义练习2用一个类来定义银行帐号类名:BankAccount成员变量姓名 (ownerName)帐号 (accountNumber)余额 (balance)利率(rate)/静态变量定义一个测试类BankAccountT
11、ester,说明两个BankAccount类的变量b1、b2,分别给他们的成员变量赋值,分别打印出两个变量的各成员变量比较实例变量和静态变量的访问在例1和例2的测试类中:分别在创建对象之前,使用类名来访问实例变量和静态变量,如BallTester.color等分别在创建对象之后,使用类名来访问实例变量和静态变量,如BallTester.color等比较结果,观察现象BACK3.2.4 类成员方法成员方法定义类的行为一个对象能够做的事情我们能够从一个对象取得的信息类里可以不定义成员方法,也可以定义多个;一旦在类中声明了方法,它就成为了类声明的一部分成员方法分为实例方法和类方法方法成员声明声明格式
12、public | protected | private static final abstract nativesynchronized返回类型 方法名(参数列表) throws exceptionList方法体类成员方法的分类类成员方法分为两类:实例方法声明时没有static修饰类方法(静态方法)声明时用static修饰实例方法方法声明中没有static修饰。实例方法表示特定对象的行为。在使用实例方法之前,必须实例化类,即必须创建引用变量指向的对象,通过对象来引用。如果对象没有被创建,则方法就不能调用。引用格式:对象名.实例方法常用的实例方法set方法和get方法set()是给属性赋值的方
13、法,get()是取得属性值的方法。在java程序中成员属性一般用private限制访问,不允许直接属性直接操作,只能通过set()和get()访问,使得java程序具有很好的封装性和安全性。例:set方法的定义public class Circledouble r = 0; /成员变量String color = “white”; /成员变量public void setR(double num)r = num; /给r赋值为参数num的值public void setColor(String str)color = str; /给color赋值为参数str的值例:set方法的引用public
14、 class CircleTesterpublic static void main(String str)Circle c1,c2;c1 = new Circle();/创建对象c1.setR(3); c1.setColor(“red”);c2 = new Circle();/创建对象c2.setR(5); c1.setColor(“blue”);例:get方法的定义public class Circleprivate double r = 0;/成员变量private String color = “white”; /成员变量public double getR()return r; /返
15、回属性r的值public String getColor()return color; /返回color的值例:get方法的引用public class CircleTesterpublic static void main(String str)Circle c1,c2;c1 = new Circle();/创建对象c1.setR(3); c1.setColor(“red”);Sytem.out.println(c1.getR()+”半径的球颜色是”+c1.getColor(); 常用的实例方法toString方法toString是Object类定义的方法,返回的是“类名hashcode”。
16、可以重新定义,返回自己想要的信息。toString()方法的几点说明必须被声明为public返回类型为String方法的名称必须为toString,且没有参数例:toString方法重定义public class Circlepublic String toString()return “类名:Ball 球的半径:”+r+” 颜色:”+color例:toString方法的引用public class CircleTesterpublic static void main(String str)Circle c1,c2;System.out.println(c1.toString);System
17、.out.println(c2.toString);Java的类成员方法定义练习1类定义:类名:Ball成员变量:球心坐标 x,y,z半径 radius 颜色color成员方法:设置半径、获取半径值设置坐标 x,y,z 获取坐标 x,y,z 计算球体积 V在测试类BallTester中,设置b1的各属性变量,打印出b1的颜色和体积Java的类成员方法定义练习2类定义:类名:BankAccount成员变量:姓名 (ownerName)帐号 (accountNumber)余额 (balance)成员方法:设置、获取帐号 getAccountNumber设置姓名setName 获取姓名getName
18、获取余额getbalance 存款 deposit 取款 withdraw在测试类BankAccountTester中,设置b1的各属性变量,打印出b1的姓名和余额类方法也称为静态方法,表示类中对象的共有行为声明时前面需加static修饰符不能被声明为抽象的类方法可以在不建立对象的情况下用类名直接调用,也可用类实例调用对在成员方法中对类成员的访问static (静态变量/静态方法)class Test public void print(int x) System.out.println(x); public static void main(String args) int x = 3;pr
19、int(x);D:javac Test.javaTest.java:9: non-static method print(int) cannot be referenced from a static context print(x); 1 errorclass 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(i
20、nt x) System.out.println(x); public static void main(String args) int x = 3;print(x);static方法中仅仅可以调用其他static方法例:类方法(静态方法)的定义public class Circlepublic static double PI = 3.14;public static double getArea(double num)return PI*num*num;例:类方法(静态方法)的引用public class CircleTesterpublic static void main(Strin
21、g str)Circle c1,c2;.double x1,x2;x1 = Circle.getArea(1.23);/类引用c1 = new Circle();x2 = c1.getArea(c1.getR(); /实例引用类方法的应用将摄氏温度(centigrade)转换成华氏温度(fahrenheit)转换公式为 fahrenheit = centigrade * 9 / 5 + 32除了摄氏温度值及公式中需要的常量值,此功能不依赖于具体的类实例的属性值,因此可声明为类方法例子:类方法的声明转换方法centigradeToFahrenheit放在类Converter中public cla
22、ss Converter public static int centigradeToFahrenheit(int cent) return (cent * 9 / 5 + 32); Java的类方法练习在Ball类中定义静态常量PI,定义类方法获取PI的值BACK3.2.5 静态代码块在类中,可以将一块代码声明为静态,这样的程序块叫静态初始化段。格式static语句序列静态代码块说明静态代码块只能定义在类里面,它独立于任何方法,不能定义在方法里面。静态代码块里面的变量都是局部变量,只在本块内有效。静态代码块会在类被加载时自动执行,而无论加载者是JVM还是其他的类。一个类中允许定义多个静态代码
23、块,执行的顺序根据定义的顺序进行。静态代码块只能访问类的静态成员,而不允许访问实例成员。例:静态代码块public class StaticBlock / 定义一个普通的main()方法public static void main(String args) System.out.println(This is main method.);/ 定义一个静态代码块static System.out.println(This is static block.);int stVar = 0; / 这是一个局部变量,只在本块内有效代码执行分析输出:This is static blockThis is
24、 main method静态代码块在main()方法之前执行静态代码块在程序启动时主动执行与静态方法的区别静态方法被调用时才执行例:与静态方法的比较public class UseStaticBolck public static void main(String args) new StaticBlock(); / 创建一个staticBlock的对象输出:This is static blockBACK3.2.6 访问控制访问控制符的作用说明被声明的内容(类、属性、方法和构造方法)的访问权限。降低类之间的耦合性隐藏类的保密信息和功能细节提高代码的可维护性访问控制权限的种类public公共的
25、protected受保护的无访问控制符默认private私有的类定义中成员的访问控制权限名称访问权修饰符类本身子类包所有类公共public默认无访问控制保护protected *私有private* 指子类与父类不在同一个包中的情况public (公共变量/公共方法)容许全权访问,无任何限制(先构造对象,再访问)class A public int x;public void print() class B void test() A a = new A();a.x = 100;a.print();protected (保护变量/保护方法)容许类本身、子类(有一定限制)以及同一个包中所有类访问
26、(先构造对象,再访问)class A protected int x;protected void print() class B void test() A a = new A();a.x = 100;a.print();无修饰容许类本身以及同一个包中所有类访问class A int x;void print() class B void test() A a = new A();a.x = 100;a.print();private (私有变量/私有方法)D:javac A.javaA.java:8: x has private access in A a.x = 100; A.java:
27、9: print() has private access in A a.print(); 2 errors仅能在其所定义的类中被访问(先构造对象,再访问)class A private int x;private void print() class B void test() A a = new A();a.x = 100;a.print();BACK3.3 内部类内部类也称为嵌入类(nested class),它是定义在其他类的内部。内部类作为其外部类的一个成员,与其他成员一样,可以直接访问其外部类的数据和方法。内部类作为一个成员,可以被任意修饰符修饰。3.3 内部类3.3.1 内部类的
28、语法规则3.3.2 局部内部类3.3.3 匿名内部类3.3.4 静态内部类3.3.1 内部类的语法规则内部类的语法是比较复杂的,根据不同的内部类,语法规则不同3.3.2 局部内部类局部(有名)内部类声明格式:class Outerclass Inner/内部类属性声明/内部类方法声明/内部类构造方法局部内部类的初始化局部内部类初始化格式:class Outerclass InnerInner getInner()return new Inner();局部内部类的使用局部内部类使用格式:class OuterTesterOuter outer = new Outer();Outer.Inner
29、inner;inner = outer.getInner();inner.方法名;例:局部内部类的使用public class Test3_5 public static void main(String args) Outer outer = new Outer();outer.print();Outer.Inner inner = outer.getInner();inner.print();class Outer private int index = 10;class Inner private int index = 20;void print() int index = 30;Sy
30、stem.out.println(this); / the object created from the InnerSystem.out.println(Outer.this); / the object created from the OuterSystem.out.println(index); / output is 30System.out.println(this.index); / output is 20System.out.println(Outer.this.index); / output is 10void print() Inner inner = new Inne
31、r();/ 得到内部类的引用inner.print();Inner getInner() return new Inner();/在Outer类内部,直接引用Inner内部类,当然也可以通过外部类引用 3.3.3 匿名内部类匿名内部类的特点:必须扩展一个基类或实现一个接口,但不能有显示的extends或implements必须实现父类及接口中的所有抽象方法总是使用父类的无参构造方法来创建实例匿名内部类声明和初始化格式: new interfacename().; 或 new superclassname().; 例:匿名内部类的使用abstract class A abstract publi
32、c void sayHello();class Outer public static void main(String args) new Outer().callInner(new A() public void sayHello() System.out.println(this); / the object created from the anonymous InnerSystem.out.println(Hello!););public void callInner(A a) a.sayHello();3.3.4 静态内部类声明为static,也叫嵌套类与非静态内部类的区别目的是把
33、一个修安排类隐藏在另一个类中没有指向外部类的引用非静态的内部类不能有静态数据、静态方法和静态内部类,而静 态类中可以有所有的内容静态内部类实例化时,可以直接实例化内部类,不需要先实例化外部类;而非静态的内部类必须先实例化其外部类,才能实例化本身。BACK3.4 对象的初始化和清除对象初始化系统在生成对象时,会为对象分配内存空间,并自动调用构造方法对实例变量进行初始化对象回收对象不再使用时,系统会调用垃圾回收程序将其占用的内存回收3.4 对象的初始化和清除3.4.1 构造方法3.4.2 初始化过程3.4.3 对象的清除BACK3.4.1 构造方法构造方法一种和类同名的特殊方法用来初始化对象Jav
34、a中的每个类都有构造方法,用来初始化该类的一个新的对象没有定义构造方法的类,系统自动提供默认的构造方法默认构造方法系统提供的默认构造方法如果在类的声明中没有声明构造方法,则Java编译器会提供一个默认的构造方法默认的构造方法没有参数,其方法体为空使用默认的构造方法初始化对象时,如果在类声明中没有给实例变量赋初值,则对象的属性值为零或空构造方法的特点方法名与类名相同没有返回类型,修饰符void也不能有通常被声明为公有的(public)可以有任意多个参数主要作用是完成对象的初始化工作不能在程序中显式的调用在生成一个对象时,系统会自动调用该类的构造方法为新生成的对象初始化例:无参的构造方法publi
35、c class Circleprivate double r;private String color; .public Circle()r = 1;color = “white”;例:带参数的构造方法public class Circleprivate double r;private String color; .public Circle(double radius)r = radius; color = “white”;public Circle(double radius, String str)r = radius; color = str;Java类的构造方法定义练习1类定义:类
36、名:Ball成员变量:球心坐标 x,y,z半径 radius 颜色color成员方法:构造方法:无参,有参(球心坐标)(半径)在测试类BallTester中,声明Ball类型的变量b3和b4,分别使用两个有参构造方法创建对象,并用toString输出信息Java类的构造方法定义练习2类定义回顾:类名:BankAccount成员变量:姓名 (ownerName)帐号 (accountNumber)余额 (balance)成员方法:构造方法:无参,有参(帐号,姓名,余额)在测试类BankAccountTester中,声明变量b3,使用有参构造方法创建对象,并用toString输出信息this关键字
37、的使用作用隐含参数指向本对象显示调用构造方法注意用this调用构造方法时,只能用在构造方法中用this调用构造方法时,必须是构造方法中的第一条语句this关键字的使用this调用的格式this.属性:调用本对象的属性this.方法:调用本对象的方法this(参数列表):在构造方法中调用其他的构造方法例:this调用成员public class Circledouble r = 0; /成员变量String color = “white”; /成员变量public String getColor()return this.color;public void setColor(String str
38、)this.color = str; 例:this调用构造方法public class Circleprivate double radius;private String color; .public Circle(double radius)this(radius, “white”);public Circle(double radius, String color)this.radius = radius; this.color = color;this使用练习在Ball和BankAccount的成员方法和构造方法中使用this关键字,替换所有可替换的内容BACK3.4.2 初始化过程初
39、始化(initialization)其实包含两部分类的初始化类成员(静态变量)静态初始化块进行初始化调用对象的创建父类的构造函数自身的构造函数例:初始化过程public class test3_8 public static void main(String args) throws ClassNotFoundException System.out.println(-类初始化-);Class.forName(edu.uibe.java.chapter3.Son);System.out.println(n + -对象初始化-);Son son = new Son();class Son ext
40、ends Father Son() System.out.println(3.自身的构造函数);static int staticInt = 5; / 如果放在static后面则编译不通过static System.out.print(1.静态初始化表达式:staticInt= + staticInt + t);System.out.println(静态初始化块);int instanceInt; / 将会被赋默认值0System.out.print(2.初始化表达式:instanceInt= + instanceInt + t);System.out.println(初始化块);class
41、Father Father() System.out.println(1.父类的构造函数);输出结果为:-类初始化-1.静态初始化表达式:staticInt=5静态初始化块-对象初始化-1.父类的构造函数2.初始化表达式:instanceInt=0初始化块3.自身的构造函数BACK3.4.3 对象的清除对象使用完之后需要对其进行清除。对象的清除是指释放对象占用的内存。在创建对象时,用户必须使用new操作符为对象分配内存。不过,在清除对象时,由系统自动进行内存回收,不需要用户额外处理。Java语言的内存自动回收称为垃圾回收(Garbage Collection)机制,简称GC。BACK3.5 包包(package)是Java提供的一种区别类的名字空间的机制,是类的组织方式,是一组相关类和接口的集合,它提供了访问权限和命名的管理机制。使用包的主要原因是确保类名的唯一性。Java中常用的包JDK为我们提供了很多标准的 Java类和接口,常用的包有:java.langjava.iojava.utiljava.appletjava.awt3.5 包3.5.1 包的定义和使用3.5.2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 乡镇法治宣传制度方案(3篇)
- 2025年教师资格考试幼儿园综合素质试卷与参考答案
- 2025年保密教育线上培训考试题库(含答案)
- 吉安后河管理办法
- 名校教育管理办法
- 吴江土方管理办法
- 员工在职管理办法
- 售后旧件管理办法
- 商事登记管理办法
- 商店采购管理办法
- 水浒传每回内容梗概
- (译林版)二年级英语上册期中检测卷-附参考答案
- 工地试验室安全培训内容
- 小儿哮喘病护理
- 了解PLC的PID控制原理
- 辽宁省第二届职业技能大赛(健康照护赛项)理论参考试题及答案
- 中建桥面系及桥梁附属专项施工方案
- 2024年食品安全生产经营大比武理论考试题库-下(多选、判断题)
- 有限空间专项安全检查表
- Unit 1 Making friends(单元测试)-2024-2025学年人教PEP版(2024)英语三年级上册
- 2024光伏电站设备评级标准
评论
0/150
提交评论