3.1 面向对象基本概念
面向对象是一种程序设计方法,或者说它是一种程序设计规范,其基本思想是使用对象、类、继承、封装、消息等基本概念来进行程序设计。Java是一种存粹的面向对象的程序设计语言。
3.1.1.对象的基本概念
对象是系统中用来描述客观事物的一个实体,是构成系统的一个基本单位。一个对象由一组属性和对这组属性进行操作的一组服务组成。
现实世界中的对象有两个共同特征:形态和行为。
举例:(张三拜访李四)
//张三拜访李四
面向对象:
1.找出事件当中的参与者,并抽象为某种类别:主人 客人
2.找出参与者各自在事件中的动作:
主人:ask() openDoor()
客人:knock() reply() sitdown()
3.编程时,定义2个类:Master() Guest(),分别把各自的动作(方法),定义到各自的类里面
4.定义第三个类Tester,在main()中通过调用2个对象的方法来描述拜访过程。
3.1.2. 类的基本概念
对象是指具体的事物,而类是指一类事物。
由类来确定具体对象的过程称为实例化,即类的实例化结果就是对象,而对一类对象的抽象就是类。
类用class作为它的关键词。
//当我们需要通过汽车类来创建一个轿车对象,并使用它的刹车行为方法时,则要用下米娜的格式进行实例化
汽车 轿车 = new 汽车();
轿车.刹车();
3.2 类
类和对象是Java的核心和本质。定义类和建立对象是Java编写的主要任务。
3.2.1 类的定义
1.类的一般形式
类由类声明和类体组成,而类体又由成员变量和成员方法组成。
public class 类名 //类声明
{
成员变量;
成员方法; //类体
}
//举例
public class Hello //类声明
{
static String str; //成员变量
public static void main(String[] args)
{
st = "hello world";
System.out.println(str); //成员方法
}
}
2.类声明
类声明由四部分组成:类修饰符、类关键字class、声明父类、实现接口。
一般形式为:
[public][abstract][final] class 类名 [extends 父类名] [implements 接口列表]
{
.
.
.
}
1.类修饰符
类修饰符含义如下:
public:声明了类可以在其他类中使用。
abstract:声明了这个类为抽象类,即这个类不能被实例化。
final:声明该类不能被继承,不能有子类。
2.类的关键词
声明类的关键字。通常情况下,类名要用大写字母开头,并且类名不能用阿拉伯数字开头。
3.声明父类
extends为声明该类的父类,表明该类是其父类的子类。一个子类可以从它的父类继承变量和方法。(单继承)
class SubClass extends 父类名
{
.
.
}
4.实现接口
接口是一个特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。
implements 接口1,接口2,....
1
3.2.2 成员变量和局部变量
成员变量和局部变量主要是根据在程序中所处的位置决定的。
成员变量 在类体定义
局部变量 在方法中定义
class Data
{
int x,y; //x、y为成员变量
public void sum()
{
int s; //s为局部变量
s = x + y;
}
}
如果局部变量与成员变量相同,则成员变量被屏蔽。
class Data
{
int x = 12,y = 5; //此时成员变量x=12将被屏蔽
public void sum()
{
int x =3;
int s;
s = x + y;
}
}
如果我们在sum内部确实需要需要是用成员变量,可以使用关键词this来引用当前对象,它的值是调用该方法的对象。
class Data
{
int x = 12,y = 5; //此时成员变量x=12将被屏蔽
public void sum()
{
int x =3;
int s;
s = this.x + y; //这里将使用成员对象X
}
}
3.3 成员方法
在java中,必须通过方法才能完成对类的属性操作。成员方法只能在类的内部声明加以实现。一般在类体中声明成员变量之后再声明方法。
3.3.1 方法的定义
方法的定义类似于类的定义,由方法声明和方法体两部分组成。
返回类型 方法名(数据类型1 参数1 ,数据类型2 参数2,。。。) //方法声明
{
.....(局部变量定义);
.....(方法功能实现); //方法体
return(返回值);
}
例:
public static void main(String[] srgs)
{
String str = "hello world !";
System.out.println(str);
}
方法不允许嵌套定义,即不允许一个方法的定义放在另一个方法的定义中。
在方法的定义中,方法的类型是该方法返回值的数据类型。
3.3.2 方法的调用
我们把调用其他方法的方法称为主调方法,被其他方法调用的方法称为被调方法。
方法的调用格式:
函数名(实际参数1,实际参数2,。。。。);
单个参数的调用:
import javax.swing.*;
public class Exanmple
{
public static void main(String[] args)
{
int sum = mysum(100); //调用mysum方法
JOptionPane.showMessageDialog(null,"1+2+3+4+...+100 = "+ sum);
System.exit(0);
}
static int mysum(int n)
{
int i,s = 0;
for(i = 1;i<=n;i++) //形参n以100进行计算
s = a + i;
return s; //计算结果返回给被调函数
}
}
多个参数的调用同理!!!!
3.3.3 方法重载
方法重载是指多个方法享有相同的名字,但这些方法的参数必须不同,或者是参数的个数不同,或者是参数的类型不同,返回类型不能用来区分重载的方法。
举例:(两个数求和)
public class Tester {
public static void main(String[] args) {
Tools t = new Tools();
int x0 = t.add(3,5);
System.out.println("参数个数为2时,和为" + x0);
int x1 = t.add(3,5,6);
System.out.println("参数个数为3时,和为" + x1);
}
}
public class Tools {
int add(int a , int b) //参数个数为2
{
return a + b;
}
int add(int a,int b,int c) //参数个数为3
{
return a + b + c;
}
}
3.3.4 构造方法
构造方法是一个特殊的方法,主要用于初始化新创建的对象。构造方法的方法名要与类名相同,且无返回值。
注意:这里说的构造方法无返回值,并不是要在构造方法名前加上void ,构造方法名是不能有void的,如果在构造方法名前加了void,系统就不会自动调用该方法了。
一个类可以创建多个构造方法,当类中包含多个构造方法时,将根据参数的不同来决定要用哪个构造方法来初始化新创建对象的状态,达到方法重载的目的。
举例:(求长方形的面积)
public class Rectangle {
int width,length;
Rectangle(){ //构造方法,没有参数,方法名与类名相同
length = 2;
width = 2;
}
Rectangle(int len,int wid){ //构造方法,带有参数
length = len;
width = wid;
}
int getArea()
{
return length*width;
}
}
public class Tester {
public static void main(String[] args) {
Rectangle rect_1 = new Rectangle();
Rectangle rect_2 = new Rectangle(6,4); //应用构造方法创建实例对象
int area_1 = rect_1.getArea();
int area_2 = rect_2.getArea();
System.out.println("长方形的面积为:" + area_1);
System.out.println("长方形的面积为:" + area_2);
}
}
运行结果:
长方形的面积为4
长方形的面积为24
&&:在一个类的程序中,也可以没有定义构造方法,则Java系统会认为是定义了一个缺省构造方法,缺省构造方法是无任何内容的空方法。当编写类时,只有在需要进行一些特别初始化的场合,才需要定义构造方法。
3.4 对象
通过前面我们知道类是一个抽象的概念,而对象是类的具体化。
一个对象的生命周期包括三个阶段:创建、使用和释放。
需要注意的是:对象是引用类型,因此,对象名这个变量,其值是一个长整型(代表了另外一个内存单元的首地址)。对象实体对应的内存在首地址指向的另一地方。
1.对象的创建
类名 对象名 = new 类名([参数列表])
这一表达式隐含三部分:对象声明 实例化 初始化
/*对象声明*/
类名 对象名;
/*实例化*/
对象名 = new 构造方法();
2.对象的使用
访问对象成员变量的格式:
对象.成员变量;
调用对象成员方法的格式:
对象名.方法名([参数列表]);