类和对象
在Java语言中,经常被提到的两个词是类与对象。实际上,可以将类看作是对象的载体,它定义了对象具有的功能。
面向对象编程主要体现下列三个特征:封装性,继承,多态。
2. 类是java的基本元素,一个java应用程序就是由若干个类所构成。
类是java语言中最重要的“数据类型”,类声明的变量被称作对象变量,简称对象。类是对象的模板,没有类就没有对象。
3. 类的定义包括两部分:类声明和类体。基本格式为:class 类名{类体的内容}
4. 如果类名使用拉丁字母,那么名字的首字母使用大写字母;类名最好容易识别。
5. 类的目的是抽象出一类事物共有的属性和行为,并用一定的语法格式来描述所抽象出的属性和行为。类是一种用于创建具体实例(对象)的数据类型。
6. 类体的内容由两部分构成:变量的声明(所声明的变量被称为成员变量或域变量)和方法的定义。
7. 成员变量的类型可以是java的任何一种数据类型,基本类型:整型,浮点型,字符型,逻辑类型;引用类型:数组,对象和接口。成员变量在整个类内都有效,其有效性与它在类体中书写的先后位置无关。
6.1面向对象概述
面向对象思想是人类最自然的一种思考方式,它将所有预处理的问题抽象为对象,通过了解这些对象具有哪些相应的属性这些对象以及展示这些对象的行为,以解决这些对象面临的一些实际问题。
面向对象是程序开发人员认识、理解世界的世界观、方法论;面向对象的基本哲学是,世界是由各种各样具有自己的内部状态(属性)和运动规律(行为)的对象所组成的;不同对象之间的相互作用和通讯构成了完整的现实世界;从方法论的角度认为,在描述世界的过程中,使用的模型或系统的结构应该直接与现实世界的结构相对应,应该围绕现实世界中的对象来构造模型或系统,通过对象的相互作用来反映世界的运行过程。这样建立起来的系统才是符合现实世界的本来面目的。面向对象的思想已经涉及到软件开发的各个方面,如:面向对象分析(OOA: Object Oriented Analysis),面向对象设计(OOD: Object Oriented Desigen)以及面向对象编程(OOP:Object Oriented Programming)
6.1.1对象
类就是对象的设计图!现实世界中,随处可见的一种事物就是对象。对象是事物存在的实体,如人,书桌,计算机,高楼大厦等。通常都会解决问题的方式总是将复杂的事物简单化,于是就会思考这些对象都是由哪些部分组成的。通常都会将对象划分两个部分,即静态部分和动态部分。顾名思义,静态部分就是不能动的部分,这个部分被称为“属性”,任何对象都会具备其自身属性,如一个人,其属性包括高矮,胖瘦,性别,年龄等。动态部分即对象可执行的动作,这部分被称为“行为”,也是一个人值得探讨的部分,同样对于一个人,其可以哭泣,微笑,说话,行走,这些都是个人具备行为。
6.1.2类
不能将一个事物描述成一类事物,如一只鸟不能称为鸟类。但如果要给某一事物一个统称,就需要用到类这个概念。
.类
类是封装对象的属性和行为的载体,反过来说具有相同属性和行为的一类实体被称为类,例如鸟类封装了所有鸟类的共同属性和应具有的行为:
简单来说把静态属性和动态属性封装到一个盒子(类)里的那个动作.
类是封装对象的属性和行为的载体,反过来说,具有相同属性和行为的一类实体被称为类。
6.1.3封装
面向对象程序设计具有以下特点:封装性,继承性和多态性。
封装是面向对象编程的核心思想,将对象的属性和行为封装起来,其载体就是类,类通常对客户隐藏其实现细节,这就是封装思想。
采用封装思想保证了类内部数据结构的完整性,使用类的用户不能轻易地直接操作类的数据结构,只能执行类允许公开的数据,这样子就避免了外部操作对内部数据的影响,提高了程序可维护性,使用类实现封装特性如图:
提高代码的复用性封装的好处。
6.1.4 继承
父类继承子类(类与类的 继承)
继承就是子类继承父类的特征(属性)和行为,使得子类对象具有父类的属性和方法,或子类从父类继承方法,使得子类具有父类相同的行为,继承可以使得子类具有父类别的各种属性和方法,而不需要再次重复编写代码,从而简单快速化,在子类继承父类的同时,,可以重新定义一些属性,并重新写方法,即覆盖父类原有的属性和方法,使父类别不同的功能。
类继承父类可以获得父类的功能,提高代码的复用性
子类可以重写(覆盖)某些父类的功能
子类除了可以继承父类的功能之外,还可以额外添加子类独有的功能,一般来说,子类要比父类强大(你的是我的,我的还是我的);
6.1.5多态:
展现不同多种的形态出现(将父类对象应用与子类的特征就是多态)
多态也是面向对象中一项主要的特征,多态性体现了程序的可扩展性,代码的复用性。使用图形类来说明多态,每个图形都有拥有绘制自已的能力,这个能力可以看作该类具有的行为,将子类的对象统一看作父类的实例对象,这样子当绘制图形时,简单地调用父类也就是图形类绘制图形方法即可绘制任何图形,这就是多态的最基本思想
提到多态,就不得不提到抽象类和接口,因为多态的实现并不依赖具体类,而是依赖抽象类和接口。在多态的机制中,比抽象类更方便的是将抽象类定义为接口,由抽象方法组成的集合就是接口。
Java语言中修饰符权限\n
多态的条件:继承或实现
方法的重写
父类引用指向子类对象
将父类对象应用于子类的特征就是多态。
多态性允许以统一的风格编写程序,以处理种类繁多的已存在的类型及相关已存在的类相关类。该统一风格可以由父类来实现,根据父类统一风格的处理,可以实例化子类的对象。由于整个事件的处理都只依赖于父类的方法,所以日后只要维护的难度,节省了时间。
提到多态,就不得不提抽象类和接口,因为多态的实现并不依赖于具体的类,而是依赖具体类,而是依赖于抽象和接口。
再回到"绘制图形",但是如果要执行这个"绘制图形"的命令,没有人知道应该画什么样的图形,并且如果要在图形类中抽象出一个图形对象,没有人能说清楚这个图究竟是什么图形,所以使用"抽象"这个词来描述图形类比较恰当。
在Java语言中,称这样的类为抽象类,抽象类不能实例化对象。在多态的机制中,父类通常会被定义为抽象类,在抽象类中给出一个方法的标准,而不给出实现的具体流程。
在多态的机制中,比抽象类更方便的方式是将抽象类定义为接口。由抽象方法组成的集合就是接口。接口的概念在现实中也极为常见,如不同的五金商店买螺丝帽和螺丝钉,螺丝帽很轻松的就能拧在螺丝钉上,可能螺丝帽和螺丝钉的厂家不同,但这两个物品可以轻易的组合在一起,这就是为生产螺丝帽和螺丝钉的厂家都遵循统一的标准,这个统一的标准在Java中就是接口。
二.成员变量
它包含getName和setName()
以下快速生成getName和setName()的方法
勾选需要生产成getName和setName的变量然后按下‘Generate’
成员变量
(1)一个成员方法可以有参数,这个参数可以为对象,也可以是基本数据类型的变量,同时成员方法返回值和不返回值的选择,如果方法需要返回值,可以在方法中使用return关键字,使用关键字后,方法的执行将被终止
例题【6.1】
在上面这个实例中可以看到,在Java语言中需要使用class关键字来定义类,Book是类的名称。同时在Book类中定义一个成员变量,成员变量的类型为String类型。其实成员变量就是普通的变量,可以为它设置初始值,也可以不设置初始值。如果不设置初始值,则会有默认值。读者应该注意到成员变量name前面有一个private关键字,它用来定义一个私有成员。
2.成员方法
在Java语言中,使用成员方法对应于类对象的行为。以Book类为例,它包含getName()和setName()两个方法,这两个成员方法分别为获取图书名称和设置图书名称的方法。
定义成员方法的语法格式如下:
权限修饰符 返回值类型 方法名(参数类型 参数名){
... //方法体
return 返回值;
}
一个成员方法可以有参数,这个参数可以是对象,也可以是基本数据类型的变量,同时成员方法有返回值和不返回任何值的选择,如果方法需要返回值,可以在方法体中使用return关键字,使用这个关键字后,方法的执行被终止。
(2)权限修饰符
java中的权限修饰符主要包括private,public和protected,这些修饰符控制着类和类的成员变量,以及成员变量的访问,表中表述了private,protected,public以及默认的default修饰符的修饰权限。
修饰符图
this关键字
this关键字用于表示本类的当前对象,当前对象不是某个new出来的实体对象,而是当前正在编辑的类,this关键字只能在本类的使用
this.是这个类的意思
类的构造方法
在类中,除成员方法外,还存在一种特殊类型的方法,那就是构造方法,构造方法是一个与类同名的方法,对象的创建就是通过构造方法完成的,当类实例化一个对象时,类都会自动调用构造方法。构造方法的特点如下:构造方法没有返回值
构造方法的名称要与本类的名称相同
6.1.6局部变量
如果成员方法内定义一个变量,那么这个变量为局部变量,实际上,方法中的形参也可以作为一个局部变量。局部变量是在方法被执行时创建,在方法执行结束时被销毁。局部变量在使用必须进行赋值操作或被初始化,否则会出现编译错误。
交换两个整数的值
在ChangDemo类中创建静态的exchange()方法,该方法【6.2】
运行结果:
6.2.5局部变量的有效范围
可以将局部变量的有效范围被称为变量的作用域,局部变量的有效范围从该变量的声明变量开始到该变量的结束为止。
但是在相互嵌套的区域中不可以作业声明,如果将局部变量id在方法体的for循环中再次编译器将会报错。
类的构造方法
在类中,除成员方法外,还存在一种特殊类型的方法,那就是构造方法,构造方法是一个与类同名的方法,对象的创建就是通过构造方法完成的,当类实例化一个对象时,类都会自动调用构造方法。构造方法的特点如下:构造方法没有返回值
构造方法的名称要与本类的名称相同
构造方法的定义语法格式如下:
public Book(){
.... //构造方法体
}
publi:构造方法修饰符。
Book:构造方法的名称。
在构造方法中可以成员变量赋值,这样当实例化一个本类对象时,相应的成员变量也将被初始化。如果类中没有明确没有定义构造方法,编译器会自动创建一个不带参数的默认构造方法
Java中的类和对象
Java是一种纯面向对象语言,每个程序至少包含一个类,所有数据(属性)和操作(行为)都封装到类中。
1、声明类
Java中使用class来声明类,具体语法格式如下:
说明:
< . 类声明在Java源文件中(扩展名为.java的文本文件),一个源文件中只能声明一个公开的类(用public关键词修饰的类),源文件名必须与该类名相同。同时,一个源文件中也可以声明多个非公开类。
< . 类的声明包括类首和类主体两部分:类首确定类名,其中class是声明类的关键字,类名需符合标识符的命名规范,并约定所有单词首字母大写,一般为一个名词或名词性短语;类主体声明类有哪些属性及声明类有哪些行为,属性用成员变量来体现;行为用成员方法来体现。
< . 声明成员变量的语法就是申明变量的语法,只不过成员变量声明在类主体内,不在方法中。方法中申明的变量称之为局部变量。声明成员方法时,成员方法名需符合标识符的命名规范,并约定首字母小写,其余单词首字母大写,一般为一个动词或动宾短语。
< . 声明类,也就是创建了一种新的引用数据类型。
仔细观察下面的示例题
2.创建对象
被声明过的类可以用来创建对象,所谓的创建对象就是声明变量并初始化的过程;
观察一个实例题3:
说明:
< .使用new运算符创建对象,实质就是为对象在内存中分配内存空间;
< .new Student() 会创建一个Student类的对象,这个过程也叫做实例化一个Student类的对象;
< .一个类可以实例化多个对象,不同对象在内存中是独立存在的。
对象
(1)对象的创建
在前面中讲解过对象,对象可以认为是在一类事物中抽象某一个特例,可以通过这个特例来处理这类事物出现的问题,在java语言中,通过new操作符来创建对象,在讲解构造方法时介绍过,每实例化一个对象就会自动调用一次构造方法,实质上这个过程就是创建对象的过程。准确的说,可以在java语言中使用new操作符调用构造方法创建对象
test构造方法的参数test对象被创建出来时,就是一个对象的引用,这个引用在内存中为对象分配了存储空间,可以在构造方法中初始化成员变量,当创建对象时,自动调用构造方法。也就是说,在 Java语言中,初始化与创建是被捆绑在一起的。每个对象都是相互独立的,在内存中占据独立的内存地址,并且每个对象都具有自己的生命周期,当一个对象的生命周期结束时,对象就变成垃圾,由 Java 虚拟机自带的垃圾回收机制处理,不能再被使用(对于垃圾回收机制的知识)。
例题4代码如下:
运行结果如下:
访问对象的属性和行为
用户使用new操作符创建一个对象之后,可以使用“对象.类成员”来获取对象的属性和行为,前面已提到过,对象的属性和行为在类中是通过类的成员变量和成员方法的形式来表示的,所以当对象获取类成员时,也相应地获取了对象的属性和行为。
对象的引用
在java中,尽管一切都可以看作对象,但真正的操作标识符实质上是一个引用,那么引用在java中是如何体现的呢
实际上真正的对象是“new people()”这段代码,为了方便开发者保存,,调用对象,于是创建了一个people类型,名叫tom的引用变量。既然tom是new people的“代理人”,那么“new people()”对象能做的事情,tom也能做
对象的销毁
每个对象都有生命周期,当对象的生命周期结束时,分配给该对象的内存地址需要被回收。在其他语言中,需要用户手动回收废弃的对象。Java 拥有一套完整的垃圾回收机制,用户不必担心废弃的对象占用内存,垃圾回收器会自动回收无用却占用内存的资源。在学习垃圾回收机制之前,读者首先需要了解何种对象会被 Java 虚拟机视为“垃圾”。主要包括以下两种情况:
1.对象引用超过其作用范围,这个对象将被视为垃圾
2.将对象赋值为null,但垃圾系统只能回收new操作符创建的对象,某些对象不是通过new操作符在内存中获取存储空间的,这种对象无法被垃圾回收机制识别,在java中,提供了finalize()方法,这个方法是object类的方法,它被声明为protected,用户可以在自已的类中定义这个方法,如果用户在类中定义了finalize()方法,在垃圾回收会首先调用该方法,在下一次垃圾回收动作发生时,才真正回收被对象占用的内存
运行结果如下:
静态变量和静态方法
在介绍静态变量和静态方法前,首先需要介绍static关键字,因为由static修饰的变量和方法称为静态变量和静态方法。被声明为static的变量和方法被称为静态成员,静态成员属于类所有,区别于个别对象,可以在本类或其他类使用类名和“.”运算符调用静态成员静态成员与静态方法的作用通常为了提供共享数据或方法,尽管使用这种方式调用静态成员比较方便,但静态成员同样遵循public,private和protected修饰符的约束\n\n如果在执行类中,希望先执行类的初始化操作,可以使用static定义一个静态区域,这块区域也称为静态代码块,当类文件被执行时,会首先执行static块中的程序,并且只会执行一次
被声明为static的变量和方法被称为静态成员,静态成员属于类所有,区别于个别对象,可以在本类或其他类使用类名和“.”运算符调用静态成员,语法如下:
【6.4】
运行如下
静态变量于静态方法的作用通常是为了提供共享数据或者方法,如数学计算机公式等。尽管使用这种方式调用静态成员比较方便,但静态成员同样遵循着public,private和protecteal修饰符的约束。
【6.5】例题统计顾客总人数
运行结果:
从这个结果可以看出,因为count是用于static修饰的,对于所有顾客来说这是一个共享的属性创建一个顾客,count这个属性都会加1,所以最后count统计出来的就是顾客的总人数。
如果在执行类时,当希望先执行类的初始化动作,可以使用static定义一个静态区域,这块区域被称为静态代码块。当类文件被执行时,会首先执行static块中的程序,并且只会执行一次。静态代码块的语法:
public class example {
static {
.... //可以在这里写初始化的代码
}
}
最后总结以下使用static关键字要注意几点;
1.在静态方法中不可以使用this关键字。
2.在静态方法不可以直接调用非静态方法。
3.局部变量不可以使用static关键字声明。
4.主方法必须用static声明。
5.只有内部类可以使用static关键字声明。
类的主方法
主方法是类的入口点,它定义了程序从何处开始,主方法提供对程序流向的控制,java编译器通过主方法来执行程
主方法具有以下特性:
主方法是静态的,所以如果要直接在主方法中调用其他方法,则该方法必须也是静态的
主方法没有返回值
主方法的形参为数组,其中,args[0]~args[n]分别代表程序的第一个参数到第n个参数,可以使用args.length获取参数的个数
1,在eclipse中的MianDemo.java文件上单击鼠标右键,在弹出的快捷菜单中选择泽“运行方式”/“运行配置”(英文版为Run As/Run Configrations),弹出“运行配置”(Run Configrations)对话框
2,在“运行配置”对话框中选择“自变量”(Arguments)选项卡,在“项目”(Progran argumrnts)文本框输入相对应的参数,每个参数间按enter键隔开
3,单击“运行”按钮,查看控制台运行结果,结果如上:如果不按以上操作,直接运行源码,则不会输出如何结果。
例题6.6代码如下
运行结果如下:
例题6.7”构造鸡蛋灌饼“
代码如下:
运行结果如下:
创建鸡蛋灌饼类,使用关键字this,在无参加构造方法中调用有参构造方法实现上述。
6.5类的主类方法
主方法是类的入口点,它定义了程序从何处开始,主方法提供对程序流向的控制,Java编译器通过主方法来主方法。
public static void main(String[]args){
//方法体
}
在主方法的定义中可以看到其具有以下特性:
< .主方法是静态的,所以如要直接在主方法中调用其他方法,则该方法必须也是静态的。
<.主方法没有返回值。
<.主方法的形参为数组。其中,args[0]~args[n]分别代表程序的第一个参数到第n个参数,可以使用args.length获取参数的个数。
例题6.8代码如下
运行结果如下:
例题6.9代码如下:
运行结果如下:
对象的销毁
每个对象都有生命周期,当对象的生命周期结束时,分配给该对象的内存地址需要被回收。在其他语言中,需要用户手动回收废弃的对象。
Java拥有一套完整的垃圾回收机制,用户不必担心废弃的对象占用内存,垃圾回收器会自动回收无用却占用内存的资源。在学习立即回收机制之前,读者首先需要了解何种对象会被Java虚拟机视为”垃圾“。主要包括以下两个情况:
1.对象引用超过其作用范围,这个对象将被视为垃圾,比如Example e =new Example();这里的对象e超过其作用范围,将消亡
2.将对象赋值为null,如Example e=new Example();e =null;当对象被赋值null值时,将消亡虽然Java的垃圾回收机制已经很完善,但垃圾回收器只能回收那些由new操作符创建的对象。某些对象不是通过new操作符在内存中获取空间的,这种对象无法被垃圾回收机制所识别。在Java中,提供了一个finalize()的方法,这个方法时object类的方法,它被声明为protected,用户可以在自己的类中定义这个方法。如果用户在类中定义了finalize()方法,在立即回收时会首先调用该方法,在下一次垃圾回收动作发生时,才真正回收被对象占用的内存。需要明确的时,垃圾回收或finalize()方法并不保证一定会发生。如果Java虚拟机内存消耗殆尽,它将不会执行垃圾回收处理。由于垃圾回收不受人为控制,具体执行时间也不确定,所以finalize()方法也就无法执行。为此,Java提供了System.gc()方法来强制启动垃圾回收器,这与给120打电话通知医院来救护病人的道理一样,主动告知垃圾回收器来进行清理。以上就是我的第六章总结。