nullnull JavaEE基础教程 第4章类与对象的基本概念 4.1类与对象的概念 4.2 类的访问权限与包的概念 null类是实现Java面向对象程序设计的基础,是对基本数据类型的扩充。类封装了对象的行为和属性,它是具有相同特征的同类对象的抽象模型(temp1ate),利用这个抽象模型可以构造具体的实例对象(instance)。 4.1类与对象的概念返回null对象是Java程序中最核心、最基础的部分。对象在现实生活中是很普通的概念。所有的物体都可以被视为对象,大到宇宙,小到原子,都可以将其看作是对象。我们时常与对象在打交道,我们用的钢笔、骑的自行车、乘的公交车等。而我们经常见到的卡车、公交车、小轿车等都会涉及以下几个重要的物理量:可乘载的人数、运行速度、发动机的排量、耗油量、自重、轮子数目等。另外,还有加速、减速、刹车、转弯、播放音乐等几个重要的功能,这些功能称作是他们具有的方法。一个对象具有本身的属性即特征,这些特征决定对象的状态,对象还可通过自己的行为,不断改变自己的状态。null类与对象的关系犹如图纸与零件关系,先有图纸后有零件,图纸描述了零件的共同特征,零件是按图纸制造出来的。在程序中只能有类的一个定义,但该类可以有多个实例对象。在Java编程语言中使用new运算符实例化对象。
要学习 Java 编程就必须首先学会怎样去写类,即怎样用 Java 的语法去描述对象共有的属性和功能。属性通过变量来刻画,功能通过方法来体现。类把属性和对属性的操作封装成一个整体。Java程序设计就是从类的设计开始的。
基于对象的编程更加符合人的思维模式,编写的程序更加健壮和强大。更重要的是,面向对象编程鼓励创造性的程序设计。null4.1.1类的声明
类由关键词calss来定义。一个类的定义包括两个部分:类声明和类体。类体的内容由两部分构成,一部分是变量的定义,用来刻画属性;另一部分是方法的定义,用来描述功能。 null类的定义的基本格式为:
[public][abstract|final] class className [extends superclassName] [implements interfaceNameList]
{
[public | protected | private ] [static] [final] [transient] [volatile] type variableName; //成员变量
[public | protected | private ] [static] [final | abstract] [native] [synchronized]
returnType methodName([paramList]) [throws exceptionList] { statements } //成员方法
}
其中,修饰符public、abstract、final
说明
关于失联党员情况说明岗位说明总经理岗位说明书会计岗位说明书行政主管岗位说明书
了类的属性,className为类名,superclassName为类的父类的名字,interfaceNameList为类所实现的接口列表。null1.类的成员变量
在类中声明的变量就是成员变量,作用域是整个类。类的成员变量分为类成员变量和实例成员变量。类的成员变量的声明方式如下:
[public | protected | private ] [static] [final] [transient] [volatile] type variableName;
其中:public:公有变量。
protected:保护变量。
private:私有变量。
static: 静态变量(类成员变量),相对于实例成员变量。
final: 常量。
transient: 暂时性变量,用于对象存档。
volatile: 贡献变量,用于并发线程的共享。 null2.类的成员方法
成员方法描述对象所具有的功能或操作,反映对象的行为,是具有某种相对独立功能的程序模块。一个类或对象可以有多个成员方法,对象通过执行它的成员方法对传来的消息作出响应,完成特定的功能。
成员方法一旦定义,便可在不同的场合中多次调用,故可增强程序结构的清晰度,提高编程效率。
成员方法的结构包括两部分内容:方法声明和方法体。方法声明包括方法名、返回类型和外部参数。其中参数的类型可以是简单数据类型,也可以是引用数据类型。null成员方法的定义方式如下:
[public | protected | private ] [static][final|abstract] [native] [synchronized]
returnType methodName ([paramList]) [throws exceptionList]
{
statements
} null方法声明中的限定词的含义:
public:公共访问控制符。
private:私有访问控制符。
protected:保护访问控制符。
static: 类方法,可通过类名直接调用。
abstract: 抽象成员方法,没有方法体。
final: 方法不能被重写。
native: 本地成员方法修饰符,集成其它语言的代码。
synchronized: 控制多个并发线程的访问。 null下面是一个类名为“梯形”的类,类体内容的变量定义部分定义了 4 个 float 类型的变量“上底”,“下底”,“高”和“laderArea”。方法定义部分定义了两个方法“计算面积()”和“修改高()”。
class 梯形{
float 上底,下底,高,laderArea;
float 计算面积( ) {
laderArea=(上底+下底)*高/2.0f;
return laderArea;
}
void 修改高(float h) {
高=h;
}
}
类体变量定义部分所定义的变量被称为类的成员变量。在方法体中定义的变量和方法的参数被称为局部变量。
成员变量和局部变量的类型可以是Java中的任何一种数据类型,包括基本类型整型、浮点型、字符型、引用类型。null成员变量在整个类内都有效,局部变量只在定义它的方法内有效。例如:
class LocalVariable {
int distance;
int find( ) {
int a=12;
distance=a; //合法,distance在整个类内有效。
return distance;
}
void gety( ) {
int y;
y=a; //非法,a是局部变量,这里无法访问
}
} null例4-1 创建一个类,该类含有类的成员变量和成员方法,并对所创建的类进行测试。
程序清单:ch04\Text1.java
class Text1 {
static int a; //当被定义为static类型时,为类变量,可被对象或类调用
int b; //实例对象变量,只能被对象调用
public void display(int a,int b) { //成员方法
System.out.println("static int a="+a);
System.out.println(" int b="+b);
}
public static void display(int b) { //类方法,可通过类名直接调用
System.out.println("static display: int b="+b);
} nullpublic static void main(String[] args) {
Text1 tt=new Text1(); //创建实例对象tt
t t.display(5,6); //不可以Text1.display(5,6);因为对象变量或对象方法只能被对象tt调用
Text1.display(0); //当被定义为static类型时,为类方法,可被对象或类调用
tt.display(23);
tt.a=9;
Text1.a=24;
tt.b=3;
tt.display(a,15);
}
} null例4-2 创建一个类,该类含有判断质数的成员方法,测试时从键盘输入一个数,判断是否为质数。读键盘采用Scanner类的nextInt()方法。
程序清单:ch04\PrimeNumber.java
import java.util.Scanner;
public class PrimeNumber {
/*用(int) Math.sqrt(n)求出循环上限,isPrime()方法用来检测当前数是否为质数*/
public static boolean isPrime(int num) {
boolean prime = true;
int limit = (int) Math.sqrt(num);
for (int i = 2; i <= limit; i++) {
if (num % i == 0) {
prime = false;
break;
}
}
return prime;
} nullpublic static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("请输入您要判断的数:");
int n = input.nextInt();
if (isPrime(n)) {
System.out.println(n + "是质数!");
} else {
System.out.println(n+ "不是质数!");
}
}
}
null4.1.2方法重载
方法重载指一个类中有多个方法享有相同的名字,但是这些方法的参数必须不同,或者是参数的个数不同,或者是参数类型不同。返回类型不能用来区分重载的方法。其实方法重载的最主要的作用就是实现同名的构造方法可以接受不同的参数。
参数类型的区分度一定要足够,例如不能是同一简单类型的参数,如int与long。null例4-3 创建一个类,该类包含两个重载的方法,对该类进行测试。
程序清单:ch04\MethodOverloadingTest.java
import java.io.*;
class MethodOverloading{
void receive(int i) {
System.out.println("Receive one int data");
System.out.println("i="+i);
}nullvoid receive(int x, int y) {
System.out.println("Receive two int datas");
System.out.println("x="+x+" y="+y);
}
}
public class MethodOverloadingTest{
public static void main(String[] args) {
MethodOverloading mo=new MethodOverloading();
mo.receive(1);
mo.receive(2,3);
}
}
null例4-4 编译并运行下面的程序,分析运行结果,体会其中方法重载的用法,进一步理解方法重载的概念。
程序清单:ch04\OverLoadingDemo.java
class Father{
void speak( ){ //无参数的speak()方法
System.out.println("I am Father! ");
}
void speak(String s){ //有参数的speak(String s)方法
System.out.println("I like"+" "+s+". ");
}
}nullpublic class OverLoadingDemo{
public static void main (String[] args){
Father x=new Father();
x.speak(); //调用无参的speak()方法
x.speak("music"); //调用有参的speak("music")方法
}
}
null4.1.3构造方法
Java中有一种特殊的方法叫构造方法(Constructor),它是产生对象时需要调用的方法。Java 中的每个类都有构造方法,用来初始化该类的一个对象。构造方法具有和类名相同的名称,而且不返回任何数据类型。重载经常用于构造方法。构造方法只能由new运算符调用。null构造方法的形式如下:
public 类名(参数列表) {
语句体
}
说明:
构造方法名必须为该类名;
可以通过参数表和方法体来给生成的对象的成员变量赋初值;
构造方法没有任何返回值。
每个类至少有一个构造函数。类被定义时如果没有显式地定义一个构造方法,那么编译器会自动创建一个默认构造方法,缺省构造函数没有参数,而且函数体为空。缺省构造方法的形式如下:
public类名( ){
}
这使得能够通过使用“new类名();”语句产生类的对象。 null一旦在类中自定义了构造方法,编译器就不会提供默认的构造方法了。此时,语句“new 类名();”将会引起编译错误。
可以通过为几个构造函数提供不同的参数表的办法来重载构造函数。
如果有一个类带有几个构造函数,那么也许会想复制其中一个构造函数的某方面效果到另一个构造函数中。可以通过使用关键字this作为一个方法调用来达到这个目的。 null例如:
public class Employee {
private String name;
private int salary;
public Employee(String n, int s) {
name = n;
salary = s;
}
public Employee(String n) {
this(n, 0);
}
public Employee() {
this( " Unknown " );
}
} 在第二个构造函数中,有一个字符串参数,调用this(n,0)将控制权传递到构造函数的第一个版本,即采用了一个String参数和一个int参数的构造函数中。
在第三个构造函数中,它没有参数,调用this(“Unknownn”)将控制权传递到构造函数的第二个版本,即采用了一个String参数的构造函数中,再由第二个版本传递带第一个版本中。 null在任何构造函数中如果出现对于this的调用,则必须是第一个语句。
例4-5 设计一个矩形类Rectangle,该类重载了多个构造方法。
程序清单:ch04\Crctngle.java
import java.io.*;
class Rectangle { //矩形类
private int width; //矩形的宽度
private int length; //矩形的长度
Rectangle(){ //不带参数的构造函数,缺省的给出长(30)和宽(20)
length=30;width=20;
}
Rectangle(int l,int w) { //带参数的构造函数
length=l;width=w;
}
nullRectangle(Rectangle r){ //此构造方法以另一个Rectangle对象作为参数
width=r.width(); //通过对象调用函数并附值给相应变量
length=r.length();
}
int width(){ //返回宽度
return width;
}
int length(){ //返回长度
return length;
}
} nullpublic class CRctngle{
public static void main (String[] args) {
Rectangle x1=new Rectangle(); //声明类的对象并实例化
Rectangle x2=new Rectangle(50,40); //声明类的对象并初始化
Rectangle x3=new Rectangle(x1);
System.out.println("x1.length()="+x1.length());
System.out.println("x1.width()="+x1.width());
System.out.println("x2.length()="+x2.length());
System.out.println("x2.width()="+x2.width());
System.out.println("x3.length()="+x3.length());
System.out.println("x3.width()="+x3.width());
}
}null4.1.4对象
有了类,就可以创建类的对象。对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。一个对象由一组属性和对这组属性进行操作的一组服务组成。一个对象的生命周期包括三个阶段:生成、使用和消除。 null1.对象的生成
对象的生成包括声明、实例化。
格式为:
className objectName=new className([paramlist]);
声明:className objectName
声明并不为对象实体分配内存空间,而只是分配一个引用空间;对象的引用类似于指针,是32位的地址空间,它的值指向一个堆内存的数据空间,它存储着有关数据类型的信息以及堆内存中当前对象实体的地址,而对于对象实体所在堆中的实际的内存地址是不可操作的,这就保证了对象实体的安全性。null实例化:运算符new为对象分配内存空间,它调用对象的构造方法,返回对象的引用;一个类的不同对象分别占据不同的内存空间。如果类中没有显示给出构造方法,系统会调用默认的构造方法。null2.对象的使用
通过运算符“.”可以实现对对象属性的访问和方法的调用。属性和方法可以通过设定访问权限来限制其它对象对它的访问。
访问对象属性的格式:
objectName.variable;
objectName是一个已生成的对象。
例:person.name=“Jack”;
调用对象的方法的格式:
objectName.methodName([paramlist]);
例如:x.speak(“music”);
new Father( ).speak();null3.对象的清除
Java 有所谓“垃圾收集”机制,这种机制周期地自动扫描对象的动态内存区,检测某个实体是否已不再被任何对象所引用,如果发现这样的实体,就释放实体占有的内存。因此,Java 编程人员不必象C++程序员那样,要时刻自己检查哪些对象应该释放内存。系统垃圾回收方法为:System.gc()。当系统内存用尽或调用System.gc( )要求垃圾回收时,垃圾回收线程与系统同步运行。null下面进一步分析对象的内存模型,加深对对象在内存在存在形式的了解。程序如下:
class Monkey {
float hight,weight;
String head, ear,hand,foot, mouth;
void speak(String s) {
System.out.println(s);
}
}
class LittleMonkey{
public static void main(String[] args) {
Monkey littlemonkey; //声明对象。
littlemonkey =new Monkey(); //使用 new和默认构造方法为对象分配内存。
……
}
}nullnull当用类创建一个对象时,类中的成员变量被分配内存空间,这些内存空间称做该对象的实体,而对象变量中存放着引用,以确保实体由该对象变量操作使用。
声明对象变量littlemonkey后,littlemonkey的内存中还没有任何数据,这时的littlemonkey是一个空对象,空对象不能使用,因为它还没有得到任何“实体”。必须再进行为对象实体分配内存的步骤,即创建对象实体。null当系统见到littlemonkey=new Monkey();时,就会做两件事:
首先,为 height、weight、head、ear、mouth、hand、foot 各 个 变 量 分配 内 存。即Monkey类的成员变量被分配内存空间。如果成员变量在声明时没有指定初值,那么,对于整型变量默认初值是 0,对于浮点型,默认初值是0.0,对于 booean 型默认初值是false,对于引用型默认初值是null。
其次,new运算符在为变量height、weight、head、ear、mouth、hand、foot 分配内存后,返回一个代表这实例对象的内存位置的首地址号码给littlemonkey,可认为这个引用就是littlemonkey在内存里的名字,而且这个名字引用是Java系统确保分配给height、weight、head、ear、mouth、hand、foot 的内存单元将由littlemonkey 操作管理。称 height、weight、head、ear、mouth、hand、foot分配的内存单元是属于对象littlemonkey的。所谓为对象分配内存就是指为它分配变量,并获得一个引用,以确保这些变量由它来“操作管理”。null例4-6 以Point 类为例说明对象与实体的关系。
程序清单:ch04\TestPoint.java
class Point{
int x,y;
Point(){
x=0; y=0;
}
Point(int x, int y){
this.x=x;
this.y=y;
}
}
class TestPoint{
public static void main(String[] args){
Point p1=new Point(34,56);
Point p2=new Point(21,67)
p1=p2;
}
} null程序中使用了赋值语句“p1=p2;”把引用变量p2在内存中的名字赋给了p1,因此p1和p2本质上是一样的了,即p1、p2 有相同的实体。虽然在程序中p1,p2 是两个名字,但在系统看来他们引用同一个对象,他们对应的是同一个地址。此时p1、p2如同一个人有两个名字一样。系统将取消原来分配给p1的内存。这时如果输出 p1.x的结果将是21,而不是34。null一个类创建的两个对象,如果具有相同的引用,那么就具有完全相同的实体。
对象不仅可以操作自己的变量改变状态,而且还拥有了调用创建它的那个类中的方法的能力,对象通过使用这些方法可以产生一定的行为。
对象创建之后,就有了自己的变量,即对象的实体。通过使用运算符“.”,对象可以实现对自己的变量和方法的访问。
类中的方法可以操作成员变量。当对象调用方法时,方法中出现的成员变量就是指该对象的成员变量。 null例4-7创建华氏-摄氏温度转换类(TempConverter),对华氏-摄氏温度进行转换并输出转换结果。
程序清单:ch04\TempConverter.java
public class TempConverter {
public static void main(String[] args) {
TempConverter t = new TempConverter();
t.data();
}
protected void data() {
for (int i=-40; i<=50; i+=10) {
float c = (i-32)*(5f/9);
print(i, c);
}
}
protected void print(float f, float c) {
System.out.println("华氏温度"+f + "=摄氏温度" + c);
}
} null例4-8 创建一个“园”类,再创建一个“圆锥”类,
将一个圆的对象的引用传递给圆锥对象的底圆。
程序清单:ch04\Taper.java
class 圆
{ double 半径;
圆(double r)
{ 半径=r;
}
double 计算面积()
{ return 3.14*半径*半径;
}
void 修改半径(double 新半径)
{半径=新半径;
}
double 获取半径()
{ return 半径;
}
}class 圆锥
{ 圆 底圆;
double 高;
圆锥(圆 circle,double h)
{ this.底圆=circle;
this.高=h;
}
double 计算体积()
{ double volume;
volume=底圆.计算面积()*高/3.0;
return volume;
}
void 修改底圆半径(double r)
{ 底圆.修改半径(r);
}nulldouble 获取底圆半径()
{ return 底圆.获取半径();
}
}
public class Taper{
public static void main(String[] args)
{ 圆 circle=new 圆(10);
圆锥 circular=new 圆锥(circle,20);
System.out.println("圆锥底圆半径:"+circular.获取底圆半径());
System.out.println("圆锥的体积:"+circular.计算体积());
circular.修改底圆半径(100);
System.out.println("圆锥底圆半径:"+circular.获取底圆半径());
System.out.println("圆锥的体积:"+circular.计算体积());
}
}
null例4-9 设计一个计算阶乘的类Fact,对该类进行测试。
程序清单:ch04\CheckFact.java
class Fact{
float fact (int n){ //定义计算n!的方法
int i;
float x =1;
for(i=1;i
本文档为【第4章 类与对象的基本概念】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。