一,面向对象概述
面向对象思想是人类最自然的一种思考方式,它将所有预处理的问题抽象为对象,通过了解这些对象具有哪些相应的属性以及展示这些对象的行为,以解决这些对象面临的一些实际问题。在从程序开发中引入面向对象设计的概念,其实质就是现实世界中的对象进行建模操作。
1.对象
(1)现实世界中,随处可见的一种事务就是对象。对象是事物存在的实体,如人,书桌,计算机,高楼大厦等。
(2)对象通常划分成两个部分,即动态部分和静态部分,顾名思义,静态部分就是不能动的部分,这个部分被称为“属性”,任何对象都有自己的属性,如一个人的高矮,胖瘦,年龄,性别等。动态属性就是对象可执行的动作,这部分称为“行为”,如一个人的哭泣,说话,行走,微笑等。
(3)流程图区别动态属性和静态属性,如下图:
静态属性:
动态属性:
2.类
(1)类就是同一类事物的统称,如果将现实世界中的一个事物抽象成对象,类就是这类对象的统称,如鸟类、家畜类,哺乳类等。类是构造对象时所依赖的规范,如一只鸟有一对翅膀,它可以用这对翅膀飞翔,而基本上所有的鸟类都有翅膀这个特性和飞行的技能,这样具有相同特性和行为的一类事物就称为类。
(2)类是封装对象的属性和行为的载体,具有相同属性和行为的一类实体被称为类。例如,鸟类封装了所有鸟的共同属性和应具有的行为。其结构如下图:
3.封装
(1)面向对象程序设计具有以下特点:封装性、继承性和多态型。
(2)封装是面向对象编程的核心思想。将对象的属性和行为封装起来,其载体就是类,类通常对客户隐藏其细节,这就是封装思想。
(3)采用封装的思想保证了类内部数据结构的完整性,使用类的用户不能轻易地直接操作类的数据结构,只能执行类允许公开的数据。这样就避免了外部操作对内部数据的影响。提高了程序的可维护性。
4.继承
(1)继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。
(2)继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。例如:
5.多态
(1)多态是同一个行为具有多个不同表现形式或形态的能力。
(2)多态就是同一个接口,使用不同的实例而执行不同操作,如图所示:
二,类
类就是封装对象的属性和行为的载体。
1.成员变量
(1)在Java中,对象的属性也称为成员变量,成员变量可以是任意类型,整个类中均是成员变量作用范围,静态属性就是成员变量,下面为示范例题:
(2)在上面这个实例中可以看到,在Java语言中需要使用class关键字来定义,Book是类的名称。
同时car类中定义了一个成员变量,成员变量的类型为String类型。其实成员变量就是普通的变量,可以为它设置初始值,也可以不设置初始值,则会有默认值。
(3)在string前面的就是private关键字它是用来定义一个私有成员。
2.成员方法
(1)在Java语言中,使用成员方法对应于类对象的行为。以car类为例,它包括getName()和setName()两个方法,这个两个成员方法分别为获取图书名称的方法。
定义成员方法的语法格式如下:
权限修饰符 返回值类型 方法名(参数类型 参数名){
... //方法体
return 返回值;
}
注意:要使Java代码中的成员方法无返回值,可以使用void关键字表示。
(2)一个成员方法可以有参数,这个参数可以是对象,也可以是基本数据类型的变量,同时成员方法有返回值和任何值的选择,如果方法需要返回值,可以在方法体中使用return关键字,使用这个关键字后,方法的执行将被终止。
(3)成员方法的返回值可以是计算结果,也可以是其他想要的数值和对象,返回值类型要与方法返回的值类型一致。
(4)成员方法也叫动态属性,如下图:
3.权限修饰符
(1)在Java中的权限修饰符主要包括private、public和protected,这些修饰符控制着对类和类的成员变量以及成员方法的访问,如果一个类的成员变量或成员方法被修饰为private,则该成员变量只能在本类中使用,在子类中是不可见的,并且对其他包的类也是不可见的。
(2)如果将类的成员变量和成员方法的访问权限设置为public,那么除了可以在本类使用这些数据,以免用户直接访问它。如果需要使类中的数据被子类或其他包中的类使用,可以将这个类设置为public访问权限。
(3)如果一个类使用protected修饰符,那么只有本包内的该类的子类或其他可以访问此类中的成员变量和成员方法。
(4)public和protected修饰符的类可以由子类访问,如果子类和父类不在同一个包中,那么只有修饰符为public的类可以被子类进行访问。如果父类不允许通过继承产生的子类访问它的成员变量,那么必须使用private声明父类的这个成员变量。如下表描述了private,protected,public,default修饰符的修饰权限。
注意:当声明类时不使用public,protected和private修饰符设置类的权限,则这个类预设为包存取范围,即只有一个包中的类可以访问这个类的成员变量或成员方法。
例如,在项目中的com.mr包下创建AnyClass类,该类使用默认的访问权限。
package com.mr;
class AryClass{
public void doString(){
...//方法体
}
}
在上述代码中,由于类的修饰符为默认修饰符,即只有一个包类内的其他类和子类可以对该类进行访问,而AnyClass类中的doString()方法却又被设置为public访问权限,即使这样,doString()方法的访问权限依然与AnyClass类的访问权限相同。
4.局部变量
(1)局部变量是在方法被执行时创建,在方法执行结束时被销毁。局部变量在使用时必须进行赋值操作或被初始化,否则会出现编译错误。
(2)如果在成员方法内定义一个变量,那么这个变量就被称为局部变量
(3)方法中的形参,例如上述成员变量中的book类中定义setName(String name)方法,String name这个形参就被看作是局部变量。
(4)例题:交换两个整数的值(如下图)
在ChangeDemo类中创建静态的exchange()方法,该方法可以将数组参数arr的前两个元素值互换,通过在方法中定义一个保存临时数据的局部变量tmp,利用tmp交换tmp交换两个元素的值。
5.局部变量的有效范围
(1)可以将局部变量的有效范围称为变量的作用域,局部变量的有效范围从该变量的声明开始到该变量的结束为止。
(2)局部变量,也称内部变量,是指在一个函数内部或复合语句内部定义的变量。
(3)局部变量的作用域是定义该变量的函数或定义该变量的复合语句。也就是说,局部变量只在定义它的函数或复合语句范围内有效,只能在定义它的函数或复合语句内才能使用它们。
注意:在作用范围外使用局部变量是一个常见的错误,因为在作用范围外没有声明局部变量的代码。
6.this关键字
(1)this关键字用于表示当前对象不是某个new出来的实体对象,而是当前正在编译的类,this关键字只能在本类中使用。
(2)用法:
三,类的构造方法
(1)在类中,除了成员方法外,还存在一种特殊类型的方法,那就是构造方法。构造方法是一个与类同名的方法,对象的创建就是构造方法完成的。每当类实例化一个对象时,类都会自动调用构造方法。
(2)构造方法有两个特点1.没有返回值 2.构造方法的名称要与本类的名称相同。
(3)构造方法的定义语法格式如下:
public Book(){
... //构造方法体
}
public:构造方法修饰符。
Book:构造方法的名称。
在构造方法中可以为成员变量赋值,这样当实例化一个本类对象时,相应的成员变量也将被初始化。如果类中没有明确定义构造方法,编译器将会自动生成一个不带参数的默认构造方法。
例题:
四,静态变量和静态方法
(1)在介绍静态变量和静态方法之前,首先需要介绍static关键字,因为由static修饰的变量和方法被称为静态变量和静态方法。
(2)被声明为static的变量和方法被称为静态成员。静态成员属于类所有,区别于个别对象,可以在本类或其他类使用类名和“,”运算符调用静态成员。语法如下:
类名.静态类成员
(3)例题,创建并调用静态属性和静态变量
创建StaticDemo类,在类中使用static关键字定义一个属性和一个方法,并在主方法中调用。
注意:虽然静态成员也可以使用“对象.静态成员”的形式进行调用,但通常不建议用这样的形式,因为这样容易混淆静态成员和非静态成员。
(4)静态变量与静态方法的作用通常是为了提供共享数据或方法,如数学计算公式等,尽管使用这种方式调用静态成员比较方便,但静态成员同样遵循着public、private和protected修饰符的约束。
(5)例题,统计顾客总人数
在cust类中创建一个静态整数类型属性count,在构造方法中让count自增。
从这个结果可以看出,因为count是用static修饰的,对于所有顾客来说这是一个共享的属性,每创建一个顾客,count这个属性都会加1,所以最后count统计出来的就是顾客的总人数。
(6)如果在执行类时,希望先执行类的初始化动作,可以使用static定义一个静态区域,这块区域被称为静态代码块,当类文件被执行时,会首先执行static块中的程序,并且只会执行一次。静态代码块如下:
public class example{
static{
...//可以在这里写初始化的代码
}
}
(7)最后总结以下使用static关键字要注意的几点:
1.在静态方法中不可以使用this关键字。
2.在静态方法中不可以直接调用非静态方法。
3.局部变量不可以直接调用非静态方法。
4.主方法必须用static声明。
5.只有内部类可以使用static关键字声明。
五,类的主方法
1.主方法是类的入口点,它定义了程序从何处开始。主方法提供对程序流向的控制,Java编译器通过主方法来执行程序。主方法的语法如下:
public static void main(String[]args){
... //方法体
}
2.在主方法的定义中可以看到其具有以下特性:
(1)主方法是静态的,所以如果要直接在主方法中调用其他方法,则该方法必须也是静态的
(2)主方法没有返回值
(3)主方法的形参为数组,其中,args[0]~args[n]分别代表程序的第一个参数到第n个参数,可以使用args.length获取参数的个数。
3.例题,读取主方法的参数值
运行步骤如下图:
六,对象
1.对象的创建
(1)在前面中讲解过对象,对象可以认为是在一类事物中抽象某一个特例,可以通过这个特例来处理这类事物出现的问题,在java语言中,通过new操作符来创建对象,在讲解构造方法时介绍过,每实例化一个对象就会自动调用一次构造方法,实质上这个过程就是创建对象的过程。准确的说,可以在java语言中使用new操作符调用构造方法创建对象,语法如下:
Tset tset=new Tset();
Tset tese=new Tset("a");
其参数说明如下表:
设置值 | 描述 | 设置值 | 描述 |
Test | 类名 | new | 创建对象操作符 |
test | 创建Test类对象 | "a" | 构造方法的参数 |
(2)test构造方法的参数test对象被创建出来时,就是一个对象的引用,这个引用在内存中为对象分配了存储空间,可以在构造方法中初始化成员变量,当创建对象时,自动调用构造方法。也就是说,在 Java语言中,初始化与创建是被捆绑在一起的。
(3)每个对象都是相互独立的,在内存中占据独立的内存地址,并且每个对象都具有自己的生命周期,当一个对象的生命周期结束时,对象就变成垃圾,由 Java 虚拟机自带的垃圾回收机制处理,不能再被使用(对于垃圾回收机制的知识)。
(4)注意:在Java语言中,对象和实例事实上可以使用。
(5)例题,创建人类并创建其对像
2.访问对象的属性和行为
(1)用户使用new操作符创建一个对象之后,可以使用“对象.类成员”来获取对象的属性和行为,前面已提到过,对象的属性和行为在类中是通过类的成员变量和成员方法的形式来表示的,所以当对象获取类成员时,也相应地获取了对象的属性和行为。
(2)例题,描述狗的特征
3.对象的引用
(1)在java中,尽管一切都可以看作对象,但真正的操作标识符实质上是一个引用,那么引用在java中是如何体现的呢,语法如下:
类名 对象的引用变量
例如,一个people类的引用可以使用以下代码:
people tom;
通常一个引用不一定需要有一个对象关联,引用与对象相关联的语法如下:
people tom=new people();
(2)实际上真正的对象是“new people()”这段代码,为了方便开发者保存,,调用对象,于是创建了一个people类型,名叫tom的引用变量。既然tom是new people的“代理人”,那么“new people()”对象能做的事情,tom也能做,如下面代码:
new people().getClass();
等价于
people tom=new people();
tom.getclass();
4.对象的摧毁
(1)每个对象都有生命周期,当对象的生命周期结束时,分配给该对象的内存地址需要被回收。在其他语言中,需要用户手动回收废弃的对象。Java 拥有一套完整的垃圾回收机制,用户不必担心废弃的对象占用内存,垃圾回收器会自动回收无用却占用内存的资源。
在学习垃圾回收机制之前,读者首先需要了解何种对象会被 Java 虚拟机视为“垃圾”。主要包括以下两种情况:
1.对象引用超过其作用范围,这个对象将被视为垃圾。如下图所示:
2.将对象赋值为null,如下图所示:
(2)垃圾系统只能回收new操作符创建的对象,某些对象不是通过new操作符在内存中获取存储空间的,这种对象无法被垃圾回收机制识别,在java中,提供了finalize()方法,这个方法是object类的方法,它被声明为protected,用户可以在自已的类中定义这个方法,如果用户在类中定义了finalize()方法,在垃圾回收会首先调用该方法,在下一次垃圾回收动作发生时,才真正回收被对象占用的内存。
课后例题:
答: