面向对象编程
面向对象编程的三个特性
- 封装:将数据和对数据的操作封装在一起
- 继承:子类可以继承父类的属性和功能,即继承了父类所具有的数据和数据上的操作,同时又可以增添子类独有的数据和数据上的操作。
- 多态:有两种意义的多态,一种是操作名称的多态,即有多个操作具有相同的名字,但这些操作所接收的消息类型必须不同。另一种多态是和继承有关的多态,是指同一个操作被不同类型对象调用时可能产生不同的行为。
Java应用程序的基本结构
- 一个Java应用程序是由若干个类所构成,但必须有一个主类,即含有main方法的类,Java应用程序总是从主类的main方法开始执行。
- Java程序以类为“基本单位”,即一个Java程序就是由若干个类所构成。
类声明和类体
class 类名 {类体的内容……}
- class是关键字,用来定义类。
- “class 类名”是类的声明部分,类名必须是合法的Java标识符。
- 两个大括号“{”、“}”以及之间的内容称作类体。
类体的构成
- 成员变量:通过变量声明定义的变量,称作成员变量或域,用来刻画类创建的对象的属性。
- 方法:方法是类体的重要成员之一。其中的构造方法是具有特殊地位的方法,供类创建对象时使用,用来给出类所创建的对象的初始状态;另一类方法,可以由类所创建的对象调用,对象调用这些方法操作成员变量形成一定的算法,体现对象具有某种功能。
成员变量在整个类内都有效,与它在类体中书写的先后位置无关;对成员变量的操作只能放在方法中,方法可以对成员变量进行操作形成算法。
构造方法和对象的创建
构造方法
- 构造方法是一种特殊方法,它的名字必须与它所在的类的名字完全相同,并且不返回任何数据类型,即它是void型,但void必须省略不写。
- Java允许一个类中有若干个构造方法,但这些构造方法的参数必须不同,即或者是参数的个数不同,或者是参数的类型不同。
对象的声明
- 类的名字 对象名字; Rect rectangleOne;
- 声明对象变量rectangleOne后,rectangleOne的内存中还没有存放数据,也就是说该对象还没有“引用”任何实体。
为声明的对象分配成员变量
使用new运算符和类的构造方法为声明的对象分配成员变量,如果类中没有构造方法,系统会调用默认的构造方法(默认的构造方法是无参数的)
上述的Rect类提供了两个构造方法,下面都是合法的创建对象的语句:rectangleOne =new Rect();//rectangleOne =new Rect(10,20);
- 为成员变量分配内存空间,然后执行构造方法中的语句。
- 给出一个信息,已确保这些成员变量是属于对象rectangleOne的
成员变量
类变量和实例变量
用关键字static修饰的成员变量称作静态变量或类变量, 而没有使用static修饰的成员变量称作实例变量。
- class A {
- float x;
- static int y;}x是实例变量,而y是类变量。
- 类变量是和该类所创建的所有对象相关联的变量,改变其中一个对象的这个类变量就同时改变了其它对象的这个类变量。因此,类变量不仅可以通过某个对象访问也可以直接通过类名访问。
- 实例变量仅仅是与相应的对象关联的变量。实例变量只能通过具体对象访问。
常量
- 如果一个成员变量修饰为final,就是常量,常量的名字习惯用大写字母,例如:final int MAX;
- final修饰的成员变量不占用内存,这意味着在声明final成员变量时,必须要初始化。
- 对于final修饰的成员变量,对象可以操作使用,但不能做更改操作。
方法
- 其中一部分方法称作构造方法,供类创建对象时使用,用来给出类所创建的对象的初始状态。
- 另一部分方法可分为实例方法和类方法,类所创建的对象可以调用这些方法形成一定的算法,体现对象具有某种功能。
- 当对象调用方法时,方法中出现的成员变量就是指分配给该对象的成员变量。对象不可以调用构造方法,构造方法是专门用来创建对象的。
方法声明和方法体
- 方法的定义包括两部分:方法声明和方法体。方法声明部分{方法体的内容}
- 方法的名字必须符合标识符规定。在给方法起名字时应遵守以下习惯:名字如果使用拉丁字母,首写字母使用小写。如果由多个单词组成,从第2个单词开始的其它单词的首写字母使用大写
实例方法与类方法
方法声明中用关键字static修饰的称作类方法或静态方法,不用static修饰的称作实例方法。
一个类中的方法可以互相调用:实例方法可以调用该类中实例方法或类方法;类方法只能调用该类的类方法,不能调用实例方法。
- 实例方法必须通过对象来调用
- 类方法可以通过类名调用
参数传值
1.基本数据类型参数的传值(值传递)
对于基本数据类型的参数,向该参数传递的值的级别不可以高于该参数的级别。此时实参传递值给形参,主方法内实参不改变。
2.引用类型参数的传值(地址传递)
- 当参数是引用类型(非基本数据类型:对象、数组和接口)时,“传值”传递的是变量的引用而不是变量所引用的实体。
- 如果改变参数变量所引用的实体,就会导致原变量的实体发生同样的变化,因为,两个引用型变量如果具有同样的引用,就会用同样的实体。但是,改变参数的引用不会影响向其传值的变量的引用。
方法重载
- 指一个类中可以有多个方法具有相同的名字,但这些方法的参数必须不同,即或者是参数的个数不同,或者是参数的类型不同。
- 方法的返回类型和参数的名字不参与比较,也就是说,如果两个方法的名字相同,即使类型不同,也必须保证参数不同。
- 方法重载是多态性的一种。所谓功能多态性,是指可以向功能传递不同的消息,以便让对象根据相应的消息来产生一定的行为。对象的功能通过类中的方法来体现,那么功能的多态性就是方法的重载。
关键字this
1.在构造方法中使用this
this关键字出现在类的构造方法中,代表使用该构造方法所创建的对象
2.在实例方法中使用this
this关键字可以出现在类的实例方法中,代表使用该方法的当前对象。
实例方法可以操作成员变量。默认的格式是:this.成员变量;
3.类方法中不可以使用this
this不能出现在类方法中,这是因为,类方法可以通过类名直接调用。
4.使用this区分成员变量和局部变量
- 成员变量在整个类内有效,局部变量仅在方法内有效。
- 如果局部变量的名字与成员变量的名字x、y相同,则在方法中直接使用x、y表示的是局部变量,成员变量被隐藏。
- 如果想在该方法内使用成员变量,成员变量表示为“this.x、this.y”。
包
- 通过关键字package声明包语句。package语句作为Java源文件的第一条语句,指明该源文件定义的类所在的包。
- package语句的一般格式为:package 包名;package sunrise;
- 如果源程序中省略了package语句,源文件中所定义命名的类被隐含地认为是无名包的一部分,即源文件中定义命名的类在同一个包中,但该包没有名字。
- 包名可以是一个合法的标识符,也可以是若干个标识符加“.”分割而成,如:package sun.com.cn;
import语句
- 使用import语句引入包中的类
- 在一个Java源程序中可以有多个import语句,它们必须写在package语句(假如有package语句的话)和源文件中类的定义之间
访问权限
- 类在定义声明成员变量和方法时,可以用关键字private、protected和public来说明成员变量和方法的访问权限。
- 需要注意的是,访问权限是指类创建的对象是否可以通过“.”运算符访问分配给自己的变量、是否可以通过“.”运算符调用类中的实例方法和类方法。
- 而类中的实例方法总是可以操作该类中的实例变量和类变量;类方法总是可以操作该类中的类变量,与访问限制符没有关系。
1.私有变量和私有方法
- 用关键字private修饰的成员变量和方法被称为私有变量和私有方法。
- 对于私有成员变量或方法,只有在本类中(在声明私有变量/方法的类中)创建该类的对象时,这个对象才能访问自己的私有成员变量和类中的私有方法。
- 用某个类在另外一个类中创建对象后,如果不希望该对象直接访问自己的变量,就应当将该成员变量访问权限设置为private。
2.共有变量和共有方法
- 用public修饰的成员变量和方法被称为共有变量和共有方法。
- 当在任何一个类中用类A创建了一个对象后,该对象能访问自己的public变量和类中的public方法。
3.友好变量和友好方法
- 不用private、public 、protected修饰符的成员变量和方法被称为友好变量和友好方法
- 在源文件中编写命名的类总是在同一包中的。如果源文件使用import语句引入了另外一个包中的类,并用该类创建了一个对象,那么该类的这个对象将不能访问自己的友好变量和友好方法。
4.受保护的成员变量和方法
- 用protected修饰的成员变量和方法被称为受保护的成员变量和受保护的方法。
- 当在另外一个类中用类A创建了一个对象后,如果这个类与类A在同一个包中,那么该对象能访问自己的protected变量和protected方法。
- 在任何一个与A同一包中的类中,也可以通过类A的类名访问类A的protected类变量和protected类方法。
5.public类与友好类
- 类声明时,如果关键字class前面加上public关键字,就称这样的类是一个public类,不能用protected和private修饰类。
- 可以在任何另外一个类中,使用public类创建对象。
- 这样的类被称为友好类,那么另外一个类中使用友好类创建对象时,要保证它们是在同一包中。
基本数据类型的类包装
- Double类和Float类:调用doubleValue()、floatValue()方法可以返回该对象含有的double/float型数据。
- Byte、Integer、Short、Long类:分别调用byteValue()、intValue()、shortValue()和longValue()方法可以返回该对象含有的基本类型数据。
- Character类:Character对象调charValue()方法可以返回该对象含有的char型数据。
对象数组
- 如果程序需要某个类的若干个对象,正确的做法是使用对象数组,即数组的元素是对象,例如:Integer []m = new Integer [10];
- 需要注意的是,上述代码仅仅定义了数组m有10个元素,并且每个元素都是一个Integer类型的对象,但这些对象目前都是空对象,因此在使用数组m中的对象之前,应当创建数组所包含的对象,例如:m[0] = new Integer (120);