目录
1.面向对象概述
1.对象
在java语言中,经常被提到的两个词是类与对象。实际上,可以将类看作是对象的载体,它定义了对象所具有的功能。在现实世界中,随处可见的一种事物就是对象,对象是事物存在的实体,如人类、书桌、计算机、高楼大厦等。人类解决问题的方式总是将复杂的事物简单化,于是就会思考这些对象都是由哪些部分组成的。通常都会将对象划分为两个部分,即静态部分与动态部分。静态部分,顾名思义,就是不能动的部分,这个部分被称为“属性”,任何对象都具备其自身属性,如一个人,其属性包括高矮、胖瘦、性别、年龄等。然而具有这些属性的人会执行哪些动作也是一个值得探讨的部分,这个人可以哭泣、微笑、说话、行走,这些是这个人具备的行为(动态部分),人类通过探讨对象的属性和观察对象的行为了解对象。
在计算机的世界中,面向对象程序设计的思想要以对象来思考问题,首先要将现实世界的实体抽象为对象,然后考虑这个对象具备的属性和行为
2.类
不能将所谓的一个事物描述成一类事物, 如一只鸟不能称为鸟类。如果需要对同一类事物统称,就不得不说明类这个概念。
类就是同一类事物的统称,如果将现实世界中的一个事物抽象成对象,类就是这类对象的统称,如鸟类、家禽类、人类等。类是构造对象时所依赖的规范,如一只鸟具有一-对翅膀,它可以用这对翅膀飞行,而基本上所有的鸟都具有翅膀这个特性和飞行的技能,这样具有相同特性和行为的- -类事物就称为类,类的思想就是这样产生的。
类是封装对象属性和行为的载体。反过来说,具有相同属性和行为的一类实体被称为类。
3.面向对象程序设计的特点
封装性
继承性
多态性
1,封装性
封装是面向对象编程的核心思想。将对象的属性和行为封装起来,其载体就是类,类通常对客户隐藏其实现细节,这就是封装的思想。
2,继承性
类与类之间同样具有关系,如一个百货公司类与销售员类相联系,类之间的这种关系被称为关联。关联主要描述两个类之间的一般二元关系, 例如,一个百货公司类与销售员类就是一个关联,学生类与教师类也是一个关联,两个类之间的关系有很多种,继承是关联中的一种。
3,多态性
上面介绍了继承,了解了父类和子类,其实将父类对象应用于子类的特征就是多态,多态的实现并不依赖具体类,而是依赖于抽象类和接口。下 面以图形类来说明多态。
图形类作为所有图形的父类,具有绘制图形的能力,这个方法可称为“绘制图形”,但如果要执行这个“绘制图形”的命令,没有人知道应该画什么样的图形,并且如果要在图形类中抽象出一个图形对象,没有人能说清这个图形究竟是什么图形,所以使用“抽象”这个词来描述图形类比较恰当。在Java语言中称这样的类为抽象类,抽象类不能实例化对象。在多态的机制中,父类通常会被定义为抽象类,在抽象类中给出一个方法的标准,而不给出实现的具体流程。
2.类
1.成员变量
在java中,对象的属性也称为成员变量,成员变量可以是任意类型,整个类中均是成员变量作用范围。
代码
无结果
在Java中对象的属性也称为成员变量,成员变量的定义与普通变量的定义一样,语法如下:
数据类型 变量名称 [ =值] ;
2.成员方法
在java语言中,成员方法对应于类对象的行为,它主要用来定义类可执行的操作,它是包含系列语句的代码块,
1.成员方法的定义
[权限修饰符] [返回值类型]方法名( [参数类型参数名] ) [throws 异常类型] {..//方法体
return 返回值;
其中,“权限修饰符”可以是private、public、 protected 中的任一一个, 也可以不写,主要用来控制方法的访问权限,关于权限修饰符将在下章中详细讲解;“返回值类型”指定方法返回数据 的类型,可以是任何类型,如果方法不需要返回值,则使用void 关键字;一个成 员方法既可以有参数,也可以没有参数,参数可以是对象也可以是基本数据类型的变量。
如果定义的方法有返回值,则必须使用returm关键字返回一个指定类型的数据,并且返回值类型要与方法返回的值类型一致, 例如,定义一个返回值类型为 int的方法, 就必须使用retum返回一个int类型的值。
2.成员方法的参数
调用方法时可以给该方法传递一个或多 个值,传给方法的值叫做实参,在方法内部,接收实参的变量叫做形参,形参的声明语法与变量的声明语法样。 形参只在方法内部有效。Java 中方法的参数主要有3种,分别为值参数、引用参数和不定长参数。
(1)值参数
值参数表明实参与形参之间按值传递,当使用值参数的方法被调用时,编译器为形参分配存储单元,然后将对应的实参的值复制到形参中,由于是值类型的传递方式,所以,在方法中对值类型的形参的修改并不会影响实参。
注意:定义成员方法的语法格式如下:
[权限修饰符][返回值类型]方法名([参数类型 参数名])[throws 异常类型]{
…//方法体
return 返回值;
3.权限修饰符
Java中的权限修饰符主要包括private、public和protected,这些修饰符控制着对类和类的成员变量以及成员方法的访问。
4.局部变量
如果在成员方法内定义一个变量,那么这个变量被称为局部变量。
局部变量在方法被执行时创建,在方法执行结束时被销毁。局部变量在使用时必须进行赋值操作或被初始化,否则会出现编译错误。
代码
结果
5.局部变量的有效范围
可以将局部变量的有效范围称为变量的作用域局部变量的有效范围从该变量的声明开始到该变量的结束为止
6.this关键字
this关键字用于表示本类当前的对象,当前对象不是某个new出来的实体对象,而是当前正在编辑的类。this关键字只能在本类中使用。
public void setName(String name){ //定义一个setName()方法
this.name=name; //将参数值赋予类中的成员变量
}
在上述代码中可以看到,成员变量与在showName()方法中的形式参数的名称相同,都为name,那么该如何在类中区分使用的是哪一个变量呢?在Java语言中规定使用this关键字来代表本类对象的引用,this 关键字被隐式地用于引用对象的成员变量和方法。
在这里读者明白了this 可以调用成员变量和成员方法,但Java语言中最常规的调用方式是使用“对象.成员变量”或“对象.成员方法”进行调用(关于使用对象调用成员变量和方法的问题,将在后续章节中进行讲述)。
既然this关键字和对象都可以调用成员变量和成员方法,那么this 关键字与对象之间具有怎样的关系呢?
事实上,this 引用的就是本类的一个对象,在局部变量或方法参数覆盖了成员变量时,如上面代码的情况,就要添加this关键字明确引用的是类成员还是局部变量或方法参数。
如果省略this关键字直接写成name = name,那只是把参数name赋值给参数变量本身而已,成员变量name的值没有改变,因为参数name在方法的作用城中覆盖了成员变量name.
其实,this 除了可以调用成员变量或成员方法之外,还可以作为方法的返回值。
在getBook()方法中,方法的返回值为Book类,所以方法体中使用return this这种形式将Book类的对象进行返回。
介绍过this关键字,了解了this可以调用类的成员变量和成员方法,事实上this还可以调用类中的构造方法。
3.类的构造方法
在类中除了成员方法之外,还存在一-种特殊类型的方法,那就是构造方法。构造方法是一个与类同名的方法,对象的创建就是通过构造方法完成的。每当类实例化-一个对象时,类都会自动调用构造方法。
(1)构造方法没有返回类型,也不能定义为void.
(2)构造方法的名称要与本类的名称相同。
(3)构造方法的主要作用是完成对象的初始化工作,它能把定义对象的参数传给对象成员。
public Book( ){ //构造方法
....
}
在构造方法中可以为成员变量赋值,这样当实例化一一个本类的对象时,相应的成员变量也将被初始化。如果类中没有明确定义构造方法,则编译器会自动创建一个不带参数的默认构造方法除此之外,在类中定义构造方法时,还可以为其添加一个或者多个参数,即有参数构造方法。
代码
结果
4.静态变量和静态方法
由static修饰的变量、常量和方法被称作静态变量、静态常量和静态方法,也被称为类的静态成员。静态成员是属于类所有的,区别于个别对象
很多时候,不同的类之间需要对同一个变量进行操作,比如一个水池,同时打开入水口和出水,进水和出水这两个动作会同时影响到池中的水量,此时池中的水量就可以认为是一个共享的变量。在Java 程序中,把共享的变量用 static 修饰,该变量就是静态变量。
代码
结果
如果想要使用类中的成员方法,需要先将这个类进行实例化,但有些时候不想或者无法创建类的对象时,还要调用类中的方法才能够完成业务逻辑,此时就可以使用静态方法。调用类的静态方法,无需创建类的对象。
代码
结果
5.类的主方法
主方法是类的入口点,它定义了程序 从何处开始;主方法提供对流程流向的控制,Java编译器通过主方法来执行程序。
代码
结果
在Eclipse中设置程序参数的步骤如下:
(1) 在Eipsce,在包资源管理器的项目名称节点上单击鼠标右键,在弹出的快捷菜单中选择"Run As" "Run Configurations" 命令,弹出Run Configurations对话框。
(2)在Run Configurations对话框中选择Arguments选择卡,在Program arguments 文本框中输入相应的参数,每个参数间按<Enter>键隔开
6.对象
Java是一门面向对象的程序设计语言,对象是由类实例化而来的,所有问题都通过对象来处理。对象可以通过操作类的属性和方法来解决相应的问题,所以了解对象的产生,操作和消亡是十分必要的。
代码
结果
1.对象的创建
对象可以认为是在一类事物中抽象出某一个特例, 可以通过这个特例来处理这类事物出现的问题。在Java语言中通过new操作符来创建对象。前文在讲解构造方法时介绍过,每实例化一个对象就会自动调用一次构造方法, 实质上这个过程就是创建对象的过程。准确地说,可以在Java语言中使用new操作符调用构造方法创建对象。
Test test=new Test( );
Test test=new Test("a")
test对象被创建出来时,就是一个对象的引用,这个引用在内存中为对象分配了存储空间,6.23节中介绍过,可以在构造方法中初始化成员变量,当创建对象时,自动调用构造方法,也就是说在Java语言中初始化与创建是被捆绑在一起的。
每个对象都是相互独立的,在内存中占据独立的内存地址,并且每个对象都具有自己的生命周期,当一个对象的生命周期结束时,对象就变成垃圾,由Java虚拟机自带的垃圾回收机制处理,不能再被使用。
2.访问对象的属性和行为
用户使用 new 操作符创建一个对象后,可以使用“对象.类成员”来获取对象的属性和行为。前文已经提到过,对象的属性和行为在类中是通过类成员变量和成员方法的形式来表示的,所以当对象获取类成员时,也相应地获取了对象的属性和行为。
3.对象的引用
在Java语言中,尽管一切都可以看作对象,但真正的操作标识符实质上是一个引用
4.对象的销毁
每个对象都有生命周期,当对象的生命周期结束时,分配给该对象的内存地址会被回收。在其日一扫他语言中需要手动回收废弃的对象,但是Java拥有-套完整的垃圾回收机制,用户不必担心废弃的对象占用内存,垃圾回收器将回收无用的但占用内存的资源。
虽然垃圾回收机制已经很完善,但垃圾回收器只能回收那些由new操作符创建的对象,如果某些对象不是通过new操作符在内存中获取一块内存区 域,这种对象可能不能被垃圾回收机制所识别,所以在Java中提供了一个fnalize0方法。这个方法是Objet类的方法,它被声明为protected,用户可以在自己的类中定义这个方法。如果用户在类中定义了finalize(方法,在垃圾回收时会首先调用该方法,在下一次垃圾回收动作发生时,才能真正回收被对象占用的内存。
由于垃圾回收不受人为控制,具体执行时间也不确定,所以finalize0方法 也就无法执行,为此,Java提供了System.gc0方法强制启动垃圾回收器,这与给120打电话通知医院来救护病人的道理一样,告知垃圾回收器进行清理。
在谈到垃圾回收机制之前,首先需要了解何种对象会被 Java 虚拟机视为垃圾。主要包括以下两种情况:
(1)对象引用超过其作用范围,这个对象将被视为垃圾。
(2)将对象赋值为null。