3.1 面向对象程序设计概述
3.1.1 面向对象的基本思想
面向对象(Object Oriented,OO)的基本思想是按照人类习惯,把实体抽象成对象,每个对象封装了数据及对数据的操作。
3.1.2 类和对象
举例:类:汽车(这个概念) ;
对象:一辆真实具体的汽车。
类可以看成是对象的抽象,描述具有一组具有相同特征的对象。
对象中的两个东西:数据 和 操作 在Java中通过 成员变量 和 成员方法 来表示 数据 和 操作
3.1.3 Java的面向对象技术
Java是一种完全面向对象的程序设计语言。
3.2 类的创建
3.2.1 类的定义
类的定义包含两部分:成员变量和成员方法。 Java中类定义的格式为:
类的修饰符 class 类名 [extendx 父类名] { //类头
成员变量的定义; //类体
成员方法的定义;
}
类修饰符用于说明类的访问性(如public)和其他性质(如final,abstract等)
一个Java源文件最多能有一个public类,且源文件名必须和public类名相同。
extends 表示该类是从父类派生出来的。
3.2.2 成员变量
也称数据成员,用于描述类的属性,定义格式如下:
成员变量修饰符 数据类型 成员变量名;
(修饰符表示可访问性和性质)
3.2.3 成员方法
方法的作用:1.对成员变量进行各种操作;2.与其他类对象进行交流时,作为类和外部交互的接口,所以成员方法大多是公有的。定义格式:
成员方法修饰符 返回值类型 方法名(参数表) {
};
类定义示例:
一个圆,本身没有什么特别的,可以用来熟悉一下类的写法。
public class Circle { private double x; private double y; private double radius; public double getX() { return x; } public void setX(double x1) { x = x1; } public double getY() { return y; } public void setY(double y1) { y = y1; } public double getRadius() { return radius; } public void setRadius(double r) { if(r>=0) radius = r; else radius = 0; } public double getPerimeter() { return 2*3.14*radius; } public double getArea() { return 3.14*radius*radius; } public String toString() { return "Circle:Center=["+getX()+","+getY()+"];Raduys=" +getRadius(); } }
3.3 对象的创建和使用
3.3.1 创建对象
类是一种数据类型,是对事物的抽象。 在程序中不能直接使用类,(就像你不能开一辆概念上的车子)
必须通过创建类的实例(即对象)来使用它。
创建对象的形式:
形式1:先声明对象的引用
类目 引用变量名;
如:Circle circle1;
然后实例化:
引用变量名 = new 类名();
如:circle1 = new Circle();
形式2.:将1的声明和实例化合在一起:Circle circle1 = new Circle();
3.3.2 构造方法与对象初始化
在Java中,使用构造方法(constructor)是生成实例对象的唯一方法。
构造方法时一种特殊的方法,通过new运算符调用,用来创建对象。
1.构造方法的创建
和创建其他成员方法相同,只是方法名和类名相同,且没有返回值(不要填void,返回值类型直接省略)
构造方法可以重载。
构造方法示例:
public class Xyz{ private int x; public Xyz(){ x = 0; } public Xyz(int i){ x = i; } }
2. 构造方法的调用
上面已经说过,用new调用,用于生成对象。
3.默认的构造方法
如果没有定义构造方法,系统会自动生成一个默认构造方法。
如果定义了构造方法,则不会自动生成默认构造方法。
一般情况下,我们都是自己定义构造方法的。
4.构造方法的重载(this)
有些构造方法可能会调用另一个构造方法,可以通过this来调用那个方法。
例如:
public Circle(double x1,double y1,double r1) { x = x1; y = y1; radius = r1; } public Circle() { this(0,0,0); //使用this,调用另一个构造函数 }
3.3.3 对象的使用
使用对象的数据和方法:
对象引用.数据;
对象引用.方法(参数表);
public class CircleTest{ public static void main(String[] args) { Circle c1 = new Circle(); Circle c2 = new Circle(1.1,1.1,2); Circle c3 = new Circle(c2); System.out.println(c1.toString()+";周长="+c1.getPerimeter() +"面积="+c1.getArea() ); System.out.println(c2.toString()+";周长="+c2.getPerimeter() +"面积="+c2.getArea() ); System.out.println(c3.toString()+";周长="+c3.getPerimeter() +"面积="+c3.getArea() ); } }
3.3.4 this关键字 指向自身的指针
3.3.5 finalize方法与对象的销毁
Java提供自动内存管理,自动释放不需要再使用的对象。
Java Object类 提供了protected void finalize()方法,这个方法释放对象所占内存。
3.4 类的封装
3.4.1 封装的目的(易用、安全)
类把数据和方法封装起来,使外界使用类时不需要考虑类中的具体细节。
数据成员变量一般用private限制,让数据只能在类的内部访问,外部不可访问。保证数据的安全性。
3.4.2 类的访问控制
在Java中,根据类的作用和相关性,对类进行分组,称为包。
同一个包里的类是可以相互访问的,不同包内的类能否相互访问由类的控制符决定。
类的控制符和可见性:
public 无修饰符(默认)
同一包: 可见 可见
不同包: 可见 不可见
可以看出,public的类在不同包 也 可见。
3.4.3 成员的控制访问
public | protected | 默认 | private | ||
同一包 | 同一个类 | 可见 | 可见 | 可见 | 可见 |
同一个包的子类 |
可见 | 可见 | 可见 | 不可见 | |
同一个包的非子类 | 可见 | 可见 | 可见 | 不可见 |
不同包 | 不同包的子类 | 可见 | 可见 | 不可见 | 不可见 |
不同包的非子类 | 可见 | 不可见 | 不可见 | 不可见 |
竖着看,public修饰的成员 是公有的,任何对象都能访问。
protected修饰的成员是被保护的,只有同一包或者子类可见。
默认的是包作用域,同一个包可见。
private 是私有的,只有自己可见。
3.4.4 类成员(静态static成员)
类中的特殊成员,不依赖特定的对象
1.类变量
类变量的作用:能被该类的所有实例共享,实现实例对象之间数据共享和通信。
如果所有实例对象都有一个常量属性,可以把其定义为类变量,节省内存。
定义类变量声明:加变量前加static
如: private static int count = 0;
类变量的访问:
可以通过类名或对象访问:
类名.类变量
对象.类变量
2.类方法
与类变量类似,类方法时static修饰的成员方法。 访问方式也和类变量类似。
类方法需要注意:
1.因为类方法不依赖对象,所以不存在this
2.类方法中出现的成员变量只能是静态的。
3.静态方法不能被子类重写。
3.5 类的导入与包
包(package)是类和接口的集合。
包具有以下几个方面的作用:
(1)划分类名空间 避免名称冲突
(2)控制类之间的访问
(3)帮助划分类
3.5.2 package语句
建立一个包时要使用package语句,格式为:
package pkg1[.pkg2[.pkg3...]];
功能是创建一个具有指导名字的包,该Java文件中的类和接口都放在这个包中。
例如:
package dbconnect;
package cn.edu.njupt.ch03
包的命名使用小写字母,采用点分方法 . 表示目录的层级。 cn.edu.njupt.ch03 与 cn\edu\njupt\ch03对应
注意:
如果用package语句,package语句必须放在文件的第一条可执行语句。
一个文件最多有一个package语句
如果一个源文件没有package语句时,系统会创建一个无名包(缺省包)。
3.5.3 import(导入)语句
使用import语句,导入其他包提供的类,简化书写。
例如有一个包 cn.edu.njupt.ch03,里面有一个类MyClass
package cn.edu.njupt.ch03;
public class MyClass{
...
}
在没有import的时候,如果在其他包中的类要使用MyClass,可以 使用
cn.edu.njupt.ch03,MyClass my = new cn.edu.njupt.ch03.MyClass();
使用import,可以简化书写:
import cn.edu.njupt.ch03.MyClass;
MyClass my = new MyClass();
也可以使用*(替换具体的类MyClass)来包含包内的所有类
import cn.edu.njupt.ch03.*;