java中的类与对象
来源:互联网 发布:淘宝联盟能分享到qq群 编辑:程序博客网 时间:2024/06/05 06:51
面向对象编程主要有三个特征:封装、继承和多态。
封装
一个简单的问题
一个能输出圆的面积的Java应用程序。
public class ComputerCircleArea {
public static void main(String args[]) {
double radius; //半径
double area; //面积
radius=163.16;
area=3.14*radius *radius; //计算面积
System.out.printf("半径是%5.3f的园的面积:\n%5.3f\n",radius,area);
}
}
事实上, 如果其他Java应用程序也想计算圆的面积,同样需要知道计算圆面积的算法,即也需要编写和这里同样多的代码。
现在提出如下问题:
能否将和圆有关的数据以及计算圆面积的代码进行封装,使得需要计算圆面积的Java应用程序的主类无需编写计算面积的代码就可以计算出圆的面积呢?
面向对象的一个重要思想就是通过抽象得到类,即将某些数据以及针对这些数据上的操作封装在一个类中,也就是说,抽象的关键点有两点一是数据,二是数据上的操作。
我们对所观察的圆做如下抽象:
☃圆具有半径之属性。
☃可以使用半径计算出圆的面积。
现在根据如上的抽象,编写出如下的Circle类。
class Circle {
double radius; //圆的半径
double getArea() { //计算面积的方法
double area=3.14*radius*radius;
return area;
}
}
(1)类声明:上述代码第一行中的class Circle称作类声明,Circle是类名。
(2)类体:类声明之后的一对大括号"{","}"以及它们之间的内容称作类体,大括号之间的内容称作类体的内容。
以下将在一个Java应用程序的主类中使用Circle类创建对象,该对象可以完成计算圆面积的任务,而使用该对象的Java应用程序的主类,无需知道计算圆面积的算法就可以计算出圆的面积。
由于类也是一种数据类型,因此可以使用类来声明一个变量,那么,在Java语言中,用类声明的变量就称之为一个对象。
◆用Circle声明一个名字为circle的对象的代码如下:
Circle circle;
◆为Circle类声明的circle对象分配变量的代码如下:
circle = new Circle();
◆对象通过使用“.”运算符操作自己的变量和调用方法。对象操作自己的变量的的格式为:对象.变量;
例如,circle.radius=100;
◆调用方法的格式为: 对象.方法;
例如,circle.getArea();
类
类是组成Java程序的基本要素。类封装了一类对象的状态和方法。类是用来定义对象的模板。
类的实现包括两部分:类声明和类体。
基本格式为:
class 类名 {
类体的内容
}
class是关键字,用来定义类。
"class 类名" 是类的声明部分,类名必须是合法的Java标识符。
两个大括号以及之间的内容是类体。
类声明
◆类声明 : class 类名
例如:
class Retangle {
… …
}
其中的“class Retangle”称作类声明;“Retangle”是类名。
◆ 给类命名时,遵守下列编程风格(这不是语法要求的,但应当遵守):
(1) 如果类名使用拉丁字母,那么名字的首字母使用大写字母,如。
(2) 类名最好容易识别、见名知意。当类名由几个“单词”复合而成时,每个单词的首字母使用大写。
类体
◆ 类声明之后的一对大括号“{”,“}”以及它们之间的内容称作类体,大括号之间的内容称作类体的内容。
◆类体的内容由两部分构:
一部分是变量的声明,用来刻画属性;
另一部分是方法的定义,用来刻画功能。
下面是一个类名为Retangle的类,
类体内容的变量声明部分给出了两个double类型的变量width和heightr;
方法定义部分定义了getArea()方法。
class Rectangle {
double width; //变量声明部分,矩形的宽
double height; //变量声明部分,矩形的高
double getArea() { //定义计算面积的方法
return width*height;
}
}
成员变量和局部变量
类体分为两部分:一部分是变量的声明,另一部分是方法的定义。
类体中变量声明部分所声明的变量被称作类的成员变量。在方法体中声明的变量和方法的参数被称作局部变量。
1.成员变量的类型:成员变量的类型可以是Java中的任何一种数据类型,包括基本类型整型、浮点型、字符型;引用类型:数组、对象和接口(对象和接口见后续内容)。
2.成员变量的有效范围:成员变量在整个类内都有效,其有效性与它在类体中书写的先后位置无关。
3.编程风格
(1)一行只声明一个变量。
(2)变量的名字符合标识符规定。
(3)变量名字见名知意,避免容易混淆的变量名字。
方法
类体分为两部分:一部分是变量的声明,另一部分是方法的定义。
方法的定义包括两部分:方法声明和方法体。一般格式为:
方法声明部分 {
方法体的内容
}
1.方法声明 方法声明包括方法名和方法的返回类型,如:
double getArea() {
return width*height;
}
关注方法的返回类型、方法的参数、方法的名字
2.方法体
方法声明之后的一对大括号"{" ,"}"以及之间的内容称作方法的方法体。方法体的内容包括局部变量的声明和Java语句。
在方法体中声明的变量和方法的参数被称作局部变量。
3.区分成员变量和局部变量
如果局部变量的名字与成员变量的名字相同,则成员变量被隐藏,即这个成员变量在这个方法内暂时失效。
需要注意的问题
类体的内容由两部分构成:一部分是变量的声明,另一部分是方法的定义。
对成员变量的操作只能放在方法中,方法可以对成员变量和该方法体中声明的局部变量进行操作。
在声明成员变量时可以同时赋予初值,但是不可以在类体中有单独的赋值语句(类体中不可以有变量的声明和方法的定义以外的其它语句)。
class A {
int a=12;
float b=12.56f;
}
但是不可以这样做:
class A {
int a;
float b;
a=12; //非法,这是赋值语句(语句不是变量的声明,只能出现在方法体中)
b=12.56f; //非法
}
类的UML图
UML(Unified Modeling Language Diagram)图属于结构图,常被用于描述一个系统的静态结构。一个UML中通常包含有类(Class)的UML图,接口(Interface)的UML图以及泛化关系(Generalization)的UML图、关联关系(Association)的UML图、依赖关系(Dependency)的UML图和实现关系(Realization)的UML图。
在类的UML图中,使用一个长方形描述一个类的主要构成,将长方形垂直地分为三层。
第1层是名字层;
第2层是变量层,也称属性层;
第3层是方法层,也称操作层。
类与Java应用程序的基本结构
一个Java应用程序(也称为一个工程)是由若干个类所构成,这些类可以在一个源文件中,也可以分布在若干个源文件中。
Java允许在一个Java源文件中编写多个类,但其中的多个类至多只能有一个类使用public修饰。
如果源文件中有多个类,但没有public类,那么源文件的名字只要和某个类的名字相同,并且扩展名是.java就可以了。
如果有一个类是public类,那么源文件的名字必须与这个类的名字完全相同,扩展名是.java。编译源文件将生成多个扩展名为.class的字节码文件,每个字节码文件的名字与源文件中对应的类的名字相同,这些字节码文件被存放在与源文件相同的目录中 。
构造方法与对象的创建
类是面向对象语言中最重用的一种数据类型,可以用它来声明变量。
在面向对象语言中,用类声明的变量被称作对象。
和基本数据类型不同,在用类声明对象后,还必须要创建对象,即为声明的对象分配变量(确定对象所具有的属性),当使用一个类创建一个对象时,也称给出了这个类的一个实例。通俗的讲,类是创建对象的“模板”,没有类就没有对象。
构造方法和对象的创建密切相关 。
构造方法
构造方法是一种特殊方法,它的名字必须与它所在的类的名字完全相同,而且没有类型。
允许一个类中编写若干个构造方法,但必须保证他们的参数不同,即参数的个数不同,或者是参数的类型不同。
需要注意的是
(1) 如果类中没有编写构造方法,系统会默认该类只有一个构造方法,该默认的构造方法是无参数的,且方法体中没有语句。
(2)如果类里定义了一个或多个构造方法,那么Java不提供默认的构造方法 。
创建对象
1.对象的声明 一般格式为:
类的名字 对象名字;
如:Rectangle rectOne;
这里Rectangle是一个类的名字,rectOne是声明的对象的名字。
2.为声明的对象分配内存
使用new运算符和类的构造方法为声明的对象分配变量,即创建对象。如果类中没有构造方法,系统会调用默认的构造方法。如: rectOne = new Rectangle();
3.对象的内存模型
(1)声明对象时的内存模型
(2)对象分配内存后的内存模型
4.创建多个不同的对象
使用对象
对象不仅可以操作自己的变量改变状态,而且能调用类中的方法产生一定的行为。
通过使用运算符“.”,对象可以实现对自己的变量访问和方法的调用。
1.对象操作自己的变量(对象的属性)
对象创建之后,就有了自己的变量,即对象的实体。通过使用运算符“.”,对象可以实现对自己的变量的访问,访问格式为:对象.变量;
2.对象调用类中的方法(对象的功能)
对象创建之后,可以使用运算符“.”调用创建它的类中的方法,从而产生一定的行为功能,调用格式为: 对象.方法;
3.体现封装
当对象调用方法时,方法中出现的成员变量就是指分配给该对象的变量。
例子3
rectOne.getArea();
rectTwo.getArea();
注:当对象调用方法时,方法中的局部变量被分配内存空间。方法执行完毕,局部变量即刻释放内存。需要注意的是,局部变量声明时如果没有初始化,就没有默认值,因此在使用局部变量之前,要事先为其赋值。
对象的引用和实体
1.避免使用空对象: 没有实体的对象称作空对象,空对象不能使用,即不能让一个空对象去调用方法产生行为。
2.垃圾收集: 一个类声明的两个对象如果具有相同的引用,那么二者就具有完全相同的实体。
class Point {
int x,y;
void setXY(int m,int n) {
x = m;
y = n;
}
}
public class E {
public static void main(String args[]) {
Point p1,p2;
p1 = new Point();
p2 = new Point();
System.out.println("p1的引用:"+p1);
System.out.println("p2的引用:"+p2);
p1.setXY(1111,2222);
p2.setXY(-100,-200);
System.out.println("p1的x,y坐标:"+p1.x+","+p1.y);
System.out.println("p2的x,y坐标:"+p2.x+","+p2.y);
p1 = p2;
System.out.println("将p2的引用赋给p1后:");
System.out.println("p1的引用:"+p1);
System.out.println("p2的引用:"+p2);
System.out.println("p1的x,y坐标:"+p1.x+","+p1.y);
System.out.println("p2的x,y坐标:"+p2.x+","+p2.y);
}
}
参数传值
方法中最重要的部分之一就是方法的参数,参数属于局部变量,当对象调用方法时,参数被分配内存空间,并要求调用者向参数专递值,即方法被调用时,参数变量必须有具体的值。
传值机制
在Java中,方法的所有参数都是“传值”的,也就是说,方法中参数变量的值是调用者指定的值的拷贝。
例如,如果向方法的int型参数x传递一个int值,那么参数x得到的值是传递的值的拷贝。
基本数据类型参数的传值
对于基本数据类型的参数,向该参数传递的值的级别不可以高于该参数的级别 。
比如,不可以向int型参数传递一个float值,但可以向double型参数传递一个float值。
在前面的例子4中有,对象调用setXY(int m,int n)设置自己的x,y坐标值,因此,对象在调用setXY(int m,int n)方法时,必须向方法的参数m和n传递值。
引用类型参数的传值
当参数是引用类型时,“传值”传递的是变量中存放的“引用”,而不是变量所引用的实体。
对象的组合
类的成员变量可以是Java允许的任何数据类型,因此,一个类可以把对象作为自己的成员变量,如果用这样的类创建对象,那么该对象中就会有其它对象,也就是说该对象将其他对象作为自己的组成部分(这就是人们常说的Has-A)。
圆锥体
对圆锥体作一个抽象。属性:底圆,高
功能:计算体积
圆锥体的底圆应当是一个对象,比如Circle类声明的对象,圆锥体的高可以是double型的变量,即圆锥体将Circle类的对象作为自己的成员。
关联关系和依赖关系的UML图
1.关联关系: 如果A类中成员变量是用B类声明的对象,那么A和B的关系是关联关系,称A关联于B或A组合了B。
如果A关联于B,那么UML通过使用一个实线连A和B的UML图,实线的起始端是A的UML图,终点端是B的UML图,但终点端使用一个指向B的UML图的方向箭头表示实线的结束。
2.依赖关系: 如果A类中某个方法的参数是用B类声明的对象或某个方法返回的数据类型是B类对象,那么A和B的关系是依赖关系,称A依赖于B。
如果A依赖于B,那么UML通过使用一个虚线连A和B的UML图,虚线的起始端是A的UML图,终点端是B的UML图,但终点端使用一个指向B的UML图的方向箭头表示虚线的结束。
实例成员与类成员
实例变量和类变量的声明
类的成员变量可细分为实例变量和类变量。
在声明成员变量时,用关键字static给予修饰的称作类变量,否则称作实例变量(类变量也称为static变量,静态变量).
例如:
class Dog {
float x; //实例变量
static int y; //类变量
}
Dog类中,x是实例变量,而y是类变量。
需要注意的是static需放在变量的类型的前面。
实例变量和类变量的区别
1.不同对象的实例变量互不相同
2.所有对象共享类变量
3.通过类名直接访问类变量
实例方法和类方法的定义
类中的方法也可分为实例方法和类方法。方法
声明时,方法
类型前面不加关键字static修饰的是实例方法、加
static关键字修饰的是类方法(静态方法)。
- java中的类与对象
- Java中的类与对象
- java中的类与对象
- Java中的类与对象
- java中的类与对象
- Java中的类与对象
- Java中的类锁与对象锁
- java中的Class类与Class对象
- 面向对象中的对象、类与Java中对象与类的差别
- Java基础之Java中的类与对象
- java中的对象引用与c++中的对象赋值
- 初识——java中的类与对象
- java中的对象,类。与 方法的重载。
- Java中的类方法与实例方法(对象方法)
- Java对象与类中的一个小练习
- java中的参数传递与对象Clone
- java中的继承与对象的访问
- Java中的垃圾回收与对象生命周期
- 统计文件中每个单词的出现次数
- SPARK_RDD_API
- html5中使用canvas画时钟
- java实现以类为对象把各属性值放入map
- iOS-使用NSURLConnection进行Http Get和Post请求网络数据
- java中的类与对象
- 例题:百练2815 城堡问题
- hdu1159 Common Subsequence(最长公共子序列)
- Activity重建时保持Fragment状态的方法
- 美版S4 (SCH-R970) 刷机完全教程(非常详细)
- Java中通过TCP协议发送和接收数据-Socket编程
- C++ 将浮点数的前四位存为string
- js获取当前日期的前7天
- iOS字符串 去掉字符串中的空格 回车