基于对象的编程更加符合人的思维模式,使得编程人员更容易编写出易维护、易扩展和易复用的程序代码,更重要的是,面向对象编程鼓励创造性的程序设计。
面向对象编程主要体yi现下列三个特性:封装性 ;继承;多态
- 对象:对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。
- 类:类是一个模板,它描述一类对象的行为和状态。
- 方法:方法就是行为,一个类可以有很多方法。逻辑运算、数据修改以及所有动作都是在方法中完成的。
- 实例变量:每个对象都有独特的实例变量,对象的状态由这些实例变量的值决定。
一、类
① Java语言是面向对象语言,它的源程序是由若干个类组成,源文件是扩展名为.java的文本文件。
类是Java语言中最重要的“数据类型”,类声明的变量被称作对象,即类是用来创建对象的模板。
类的实现包括两部分:类声明和类体。
基本格式为:
class 类名 {
类体的内容
}
class是关键字,用来定义类。“class 类名”是类的声明部分,类名必须是合法的Java标识符。两个大括号以及之间的内容是类体。
②类的声明
写类的目的是为了描述一类事物共有的属性和功能。
类声明 :class 类名
class People {
…
}
class 植物 {
…
}
//如:class People”和“class 植物”称作类声明;
//“People”和“动物”分别是类名。
给类命名时,遵守下列编程风格(这不是语法要求,但应当遵守):
1.如果类名使用拉丁字母,那么名字的首字母使用大写字母。
2.类名最好容易识别、见名知意。当类名由几个“单词”复合而成时,每个单词的首字母使用大写。
③类体
类声明之后的一对大括号“{”,“}”以及它们之间的内容称作类体,大括号之间的内容称作类体的内容。
类体的内容由两部分构:一部分是变量的声明,用来刻画属性;另一部分是方法的定义,用来刻画行为功能。
class Ladder {
float above; //梯形的上底(变量声明)
float bottom; //梯形的下底(变量声明)
float height; //梯形的高(变量声明)
float area; //梯形的面积(变量声明)
float computerArea() { //计算面积(方法)
area = (above+bottom)*height/2.0f;
return area;
}
void setHeight(float h) { //修改高(方法)
height = h;
}
}
④成员变量
类体中的内容可分为两部分:一部分是变量的声明;另一部分是方法的定义
声明变量部分所声明的变量被称为成员变量或域变量。
注意:
⑤方法
方法的定义包括两部分:方法声明和方法体. 一般格式为:
方法声明部分 {
方法体的内容
}
1、方法头
方法头由方法的类型、名称和名称之后的一对小括号以及其中的参数列表所构成。
int speak(){ //无参数的方法头
return 23;
}
int add(int x,int y,int z) //有参数的方法头
{ return x+y+z;
}
注意:方法返回的数据类型可以是Java中的任何数据类型之一,当一个方法不需要返回数据时,返回类型必须是void。
2、方法体
方法声明之后的一对大括号“{” ,“}”以及之间的内容称为方法的方法体. 方法体的内容包括局部变量的声明和Java语句。如:
int getSum(int n) { //参数变量n是局部变量
int sum=0; // 声明局部变量sum
for(int i=1;i<=n;i++) { // for循环语句
sum=sum+i;
}
return sum; // return 语句
}
和类的成员变量不同的是,局部变量只在方法内有效,而且与其声明的位置有关。
方法的参数在整个方法内有效,方法内的局部变量从声明它的位置之后开始有效。
如果局部变量的声明是在一个复合语句中,那么该局部变量的有效范围是该复合语句。
如果局部变量的声明是在一个循环语句中,那么该局部变量的有效范围是该循环语句。
3.区分成员变量和局部变量
如果局部变量的名字与成员变量的名字相同,则成员变量被隐藏,即该成员变量在这个方法内暂时失效
class Tom {
int x = 10,y;
void f() {
int x = 5;
y = x+x;
//y得到的值是10,不是20。
//如果方法f 中没有“int x=5;”,y的值将是20
}
}
如果想在该方法中使用被隐藏的成员变量,必须使用关键字this
class Tom {
int x = 10,y;
void f() {
int x = 5;
y = x+this.x; //y得到的值是15
}}
4.局部变量没有默认值
成员变量有默认值,但局部变量没有默认值,因此在使用局部变量之前,必须保证局部变量有具体的值 。例如:下列InitError类无法通过编译。例如:
class InitError {
int x = 10,y; //y的默认值是0
void f() {
int m; //m没有默认值,但编译无错误
x = y+m; //无法通过编译,因为在使用m之前未指定m的值
}
}
5、构造方法与对象的创建
类是面向对象语言中最重要的一种数据类型,那么就可以用它来声明变量。
在面向对象语言中,用类声明的变量被称作对象。
和基本数据类型不同,在用类声明对象后,还必须要创建对象,即为声明的对象分配变量(确定对象所具有的属性),当使用一个类创建一个对象时,也称给出了这个类的一个实例。通俗的讲,类是创建对象的“模板”,没有类就没有对象。构造方法和对象的创建密切相关 。
⑥构造方法
构造方法是一种特殊方法,它的名字必须与它所在的类的名字完全相同,而且没有类型。
允许一个类中编写若干个构造方法,但必须保证他们的参数不同,即参数的个数不同,或者是参数的类型不同。
构造方法的作用是在创建对象时使用,主要是用来初始化各个成员变量,以便给类所创建的对象一个合理的初始状态。
需要注意的是如果类中没有编写构造方法,系统会默认该类只有一个构造方法,该默认的构造方法是无参数的,且方法体中没有语句。
class 梯形
{ float 上底,下底,高;
梯形()
{ 上底=60;
下底=100;
高=20;
}
梯形(float x,int y,float h)
{ 上底=x;
下底=y;
高=h;
}
}
⑦创建对象
创建一个对象包括对象的声明和为对象分配变量两个步骤。
1、对象声明
一般格式为: 类的名字 对象名字;
例如: 西游记 猪八戒;
2、为声明的对象分配变量
使用new运算符和类的构造方法为声明的对象分配变量,并返回一个引用值给对象名称。即创建对象。如果类中没有构造方法,系统会调用默认的构造方法,默认的构造方法是无参数的,且方法体中没有语句。 例如: 猪八戒 = new 西游记();
当用类创建一个对象时,类中的成员变量被分配内存空间,这些内存空间称作该对象的实体或对象的变量,而对象中存放着引用值。
结论:每个对象都有属于自己的空间;即都有属于自己的变量,也叫实体;但有时也有大家共有的变量
⑧使用对象
1.对象操作自己的变量(体现对象的属性)
通过使用运算符“.” 对象操作自己的变量(对象的属性)。
2.对象调用类中的方法(体现对象的行为)
对象创建之后,可以使用点运算符“.”调用创建它的类中的方法,从而产生一定的行为(功能)。
当对象调用变量时,是指调用分配给该对象自己的变量。在讲述类的时候讲过:类中的方法可以操作成员变量;当对象调用方法时,方法中出现的成员变量就是指分配给该对象的那个变量
3. 对象的引用和实体
一个类创建的两个对象,如果具有相同的引用,那么就具有完全相同的实体
class Point
{ double x,y;
Point(double x,double y)
{ this.x=x;
this.y=y;
}
}
使用Point类创建了两个对象p1,p2:
Point p1 = new Point (5,15);
Point p2 = new Point(8,18);
假如在程序中使用了如下的赋值语句:
p1 = p2;
即把p2中的引用赋给了p1,因此p1和p2本质上是一样的. 一个类创建的两个对象,如果具有相同的引用,那么就具有完全相同的实体(变量)。
程序的基本结构⑨参数传值
class Circle
{ double rad;
void changeRad(double newRad)
{ rad=newRad;
}
}
class Test
{ public static void main(String args[])
{ Circle cir=new Circle(10);
cir.changeRad(100);
}
}
⑩可变参数
可变参数(The variable arguments)数是指在声明方法时不给出参数列表中从某项开始直至最后一项参数的名字和个数,但这些参数的类型必须相同。可变参数使用“…”表示若干个参数,这些参数的类型必须相同. “参数代表”必须是参数列表中的最后一个
例如: public void f(double item, int … x) public void g(int … x)
public int getSum(int... x) {//x可变参数的参数代表
int sum=0;
for(int i=0;i<x.length;i++) {
sum=sum+x[i];
}
return sum;
}
getSum (203,178,56,2098)返回203,178,56,2098的求和结果, getSum (1,2,3)返回1,2,3的求和结果。