1.掌握类的封装特性,构造方法的定义 重载已经this和static关键字的使用
2.熟悉类与对象的创建和使用
3.了解面对对象的三大特征
面向对象是一种符合人类思维习惯的编程思想。现实生活中存在各种形态不同的事物,这些事物之间存在着各种各样的联系。在程序中使用对象来映射现实中的事物,使用对象的关系来描述事物之间的联系,这种思想就是面向对象。当然,一个应用程序会包含多个对象,通过多个对象的相互配合来实现应用程序的功能,这样当应用程序功能发生变动时,只需要修改个别的对象就可以了,从而使代码更容易得到维护。
面向对象的特点主要可以概括为封装性、继承性和多态性
(1)封装性
封装是面向对象编程的核心思想,将对象的属性和行为封装起来,其载体就是类,类通常对客户隐藏其实现细节,这就是封装思想。采用封装思想保证了类的内部数据结构的完整性,使用类的用户不能轻易地操作类的数据结构,只能执行类允许公开的数据,这样子避免了外部操作和内部数据影响,提高了程序的可维护性。
(2)继承性
继承性主要描述的是类与类之间的关系,通过继承,可以在无需重新编写原有类的情况下,对原有类的功能进行扩展。继承不仅增强了代码的复用性、提高开发效率,还为程序的维护补充提供了便利。
3、多态性
多态性指的是在程序中允许出现重名现象,它指在一个类中定义的属性和方法被其它类继承后,它们可以具有不同的数据类型或表现出不同的行为,这使得同一个属性和方法在不同的类中具有不同的语义。例如,当听到“Cut”这个单词时,理发师的行为是剪发,演员的行为表现是停止表演,不同的对象,所表现的行为是不一样的。
面向对象的思想光靠上面的介绍是无法真正理解的,只有通过大量的实践去学
习和理解,才能将面向对象真正领悟。接下来的第三章、第四章将围绕着面向对象的三个特征(封装、继承、多态)来讲解Java这门编程语言。
1.类
面对对象的编程思想,力图让程序中对事物的描述与该事物在视线中形态保持一致
为了做到这点,面向对象的思想中提出了连个概念,即类和对象。其中,类是对某一类事物的抽象描述,而对象用于表示现实中该类事物的个体
类的定义
在面向对象的思想中最核心的就是对象,为了在程序中创建对象,首先需要定义一个类。雷士对象的抽象,它用于描述一组对象的共同特征行为。类中可以定义成员变量和成员方法,其中成员变量用于描述对象的特征,也被称作属性,成员方法用于米哦啊书对象的行为,可简称为方法
在Java中,定义在类中的变量被称为成员变量,定义在方法中的变量被称为局部变量。如果在某一个方法中通过变量名访问到局部变量与成员变量,而并非成员变量 请阅读以下代码
public class expl1 {
// 描述人事物
// 都是人的共性内容
int age = 10;// 定义int类型变量age1定义speak()方法
public void speak () {
int age=60;
System.out.println("大家好,我今年"+ age +"岁");
}
}
上面的代码中Person类的speak()发放中有一条打印语句 访问了变量a此时访问的是局部变量a,也就是说当有另外一个程序来调用speak()方法是 输出的值为60而不是10
应用程序想要完成具体功能 ,仅用类是远远不够的,还需要根据创建实例对象,zaijava程序中可以使用new关键字来创建对象具体格式如下;
类名 对象名称 = new 类名();
例如创建Peraon类的实例对象代码如下
Peraon p =new Peraon();
上面代码中 “new Peraon ()”用于创建Peraon类的一个实例对象,”Peraon“则是声明一个Peraon类型的对象p中间的等号用于将Peraon对象内存中的地址赋值给p 这样变量p边吃有了对象的引用 。在内存中变量p和对象之间的引用关系
创建对象代码
在实例化对象时 java虚拟机会自动为成员变量初始化 ,针对不同类型的成员变量java虚拟机赋值不同值
成员变量类型 初始值
byte 0e
shorte
inte 0p
long 0L
fioat 0.0F
double 0.0D-
char 空字符,u0000
boolean- false
引用数据类型 nulle
当对象被实例化后,在程序中可以通过对象的引用变量来访问该对象的成员。需要注意的是,当没有任何变量引用这个对象时,它将成为垃圾对象。
当对象被实例化后 ,在程序中可以通过对象的引用变量访问对象的成员需要注意的是 ,当没有任何的变量引用这个对象时,他将成为垃圾对象不能被使用
一个Java的原文件内可以有多个class类声明 多个class只能有一个权限public声明被public声明的类一定要跟这个文件名一样
在java中,对象是通过类创建出来的。因此,在程序设计时 ,最重要的就是类的设计。接下来就是通过一个具体案例来学习如何设计一类
假设要在程序中描述一个学校所有学生的信息 ,可以先设计一个学生类(),在这个类中定义了两个属性 name。age 分别问学生的姓名和年龄 定义一个方法introduce()表示学生做自我介绍,根据上面的描述设计出来的Student类如下所示
public class Student
String name;
int age;
public void introduce(){
//方法打印出属性 name和age的值
System.out.println("大家好,我是"+name+,"我今年"+age+"岁")
}
主要内容如下代码所示
在设计一个类时吗,应该对一个成员变量的访问做出一些限定,不允许外界随意访问这就需要实现类的封装。
所谓类的封装是指在定义一个类时,将类中的属性私有化,及使用privte关键字来修饰,私有属性只能在他所在类中被访问,如果外界想要访问私有属性,需要提供一些使用public修饰公有方法,其中包括用于获取属性的getXxx方法和设置属性的setXxx方法。主要内容以下代码所示
使用private一定一个字符串类型 超市名字 再定义一个仓库储存商品
再使用getter和setter方法在使用for循环来遍历仓库中每一个商品 再使用if语句判断
在一个类中定义的方法如果同时满足以下三个条件,该方法称为构造方法具体如下
方法名与类名相同
在方法名的前面没有返回值类型的声明
在方法中不能使用return语句返回一个值,但是可以单独写return语句作为方法的结束
具体如下
下面是有参构造方法 语句类似
结果:
与普通方法一样,构造方法也可以重载,在一个类中可以定义多个构造方法,只要每个构造方法的参数类型或参数个数不同即可。在创建对象时,可以通过调用不同的构造方法来为不同的属性进行赋值。
在java中每个类至少有一个构造方法,如果在一个类中没有定义构造方法,系统会自动为这个类创建一个默认的构造方法,这个默认的构造方法没有参数,在其方法体中没有任何代码,即什么也不做
例如都声明为age。但是这样做又会导致成员变量和局部变量的名称冲突,在方法中将无法访问成员变量age。为了解决这个问题Java中提供了一个关键字 this来指代当前对象,用于在方法中访问对象的其它成员。
在java中,当一个对象成为垃圾后仍会占用内存空间,时间异常,就会导致内存空间不足,针对这种情况,针对这种情况java中引入垃圾回收机制。有了这种机制,程序员不需要过多关心对象回收的问题 java虚拟机会自动回收垃圾对象所占有的被内存空间
一个对象成为垃圾后会被暂时的保留在内存中,当这样的垃圾堆积到一定程度时java虚拟机就会启动垃圾回收器将这些垃圾回收外从内存中释放,从而使程序获得更多的可用内存空间,除了等待java虚拟机进行垃圾回收外 还可以通过调用System.gc()方法来通知java虚拟机立即进行垃圾回收,当一个对象在内存中被释放时 他的finalize()方法被自动调用,因此可以在类中通过定义finalize()方法来观察对象何时被释放
在定义一个类时,只是在描述某类事物的特征和行为,并没有产生具体的数据只有通过new关键字创建该类的实例对象后,系统才会为每个对象分配空间,存储各自的数据。有时候,开发人员会希望某些特定的数据在内存中只有一份而且能够被一个类的所有实例对象所共享。例如某个学校所有学生共享同一个学校名称,此时完全不必在每个学生对象所占用的内存空间中都定义一个变量来表示学校名称,而可以在对象以外的空间定义一个表示学校名称的变量,让所有对象来共享。
在java类中,可以使用static关键字来修饰成员变量,该变量被称为静态变量。静态变量被所有实例共享可以使用类名。变量名的形式访问
在实际开发时,开发人员有时会希望在不创建对象的情况下就可以调用某个方法,换句话说也就是使该方法不必和对象绑在一起。要实现这样的效果,只需要在类中定义的方法前加上static关键字即可,通常称这种方法为静态方法。同静态变量一样,静态方法可以使用“类名方法名”的方式来访问,也可以通过类的实例对象来访问。
注意:在一个静态方法中只能访问用static修饰的成员,原因在于没有被static修饰的成员需要先创建对象才能访问,而静态方法在被调用时可以不创建任何对象。
在java类中,使用一对大括号包围起来的若敢行代码被称为一个代码快,用static关键字修饰的代码块称为静态代码块。当类被加载时,静态代码快会执行由于类只加载依次,因此静态代码块只执行依次,在程序中,通过会使用静态代码块来对类的成员变量进行初始化
在java中,允许在一个类的内部定义类,这样的类称作内部所在的类称作外部类,根据内部类的位置修饰符和定义的方式可分为:成员内部类。静态内部类,方法内部类。本小结将针对成员内部类进行讲解
在一个类中除了可以定义成云变量成员方法,话可以定义类,这样的类被称为成员内部类,在成员内部类中,可以访问外部类的所有成员
如果想通过外部类去访问内部类,则需要通过外部类对象去创建内部类对象,创建内部类对象的具体语法格式如下
外部类,内部类,变量名new 外部类()。new内部类();
1.掌握类的继承,方法重写 super关键字的使用,final关键字。抽象类和接口,多态的使用以及异常的处理
2熟悉面向对象继承和多态的概念
3.了解什么是异常
在现实生活中,继承一般指的是子女继承父辈的财产。在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系,例如猫和狗属于动物,程序中哥白尼可以描述为猫和狗继承自动物,同理波斯猫和巴厘猫继承自猫,而沙皮狗和斑点狗继承狗,这些动物之间会形成一个继承体系
在java中,类的继承是指一个在现有类的基础上构建一个新的类构建出来的新类被称作为子类,现有类被称为父类,子类会自动拥有父类所有可继承的属性和方法。在程序中,如果想声明一个类继承另一个类,需要使用extends关键字
在类的继承中需要注意一些问题 具体如下
1.在java中类只支持单继承,不允许多重继承,也就是说一个类只能有一个直接的父类
2.多个类可以继承同一个父类
3.在java中多层继承是可以的,即一个类的父类可以再去继承另外的父类,例如c类继承b类,而b类又可以去继承a这是c类也可乘坐a类的子类
在继承关系中,子类会自动继承父类中定义的方法,但有时子类中需要堆积成的方法进行一些修改,即对父类的方法进行重写。需要注意的是在子类中重写方法需要和父类被重写的方法有相同的方法名。参数列表以及返回值类型
在文件4-1中Dog类从Animal类继承了shout()方法,该方法在被调用时会打印“动物发出叫声”,这明显不能描述一种具体动物的叫声,Dog对象表示犬类发出的叫声应该是 “汪汪汪”
当子类重写父类方法后,子类对象将无法访问父类被重写的方法,为了解决这个问题,在java中专门提供了一个super关键字用于访问父类的成员,例如访问弗雷德成员变量,成员变量和构造方法,系欸笑傲来分两种情况学习一下super关键字的具体用法
1.使用super关键字访问父类的成员变量和成员方法 具体格式如下
super.成员变量
super.成员方法{[参数1,参数2]}
使用super关键字访问父类的构造方法。具体格式如下
super{[参数1,参数2]}
java中的类被final关键字修饰后,该类将被不可以被继承,也就是不能够派生子类
final关键字可用修饰类。变量和方法,他又“无法改变”或者“最终”的含义,因此被final修饰的类。变量和方法将具有以下特性;
final修饰的类不能被继承’
final修饰的方法布恩那个被子类重写,
final修饰的变量(成员变量和成员方法)是常量,只能赋值一次
>当定义一个类时,常常需要定义一些方法来描述该类的行为特征,但有时这些方法的实现方式是无法确定的。例如前面在定义Animal类时,shout()方法用于表示动物的叫声,但是针对不同的动物,叫声也是不同的,因此在shout()方法中无法准确描述动物的叫声。
>针对上面描述的情况,Java允许在定义方法时不写方法体,不包含方法体的方法为抽象方法,抽象方法必须使用 abstract关键字来修饰,具体示例如下:
abstract void shoutl://定义抽象方法shout()
>当一个类中包含了抽象方法,该类必须使用abstract关键字来修饰,使用 abstract关键字修饰的类为抽象类,具体示例如下:
11定义抽象类Anima1
abstract class Animal {
// 定义抽象方法 shout {}
abstract int shout()
}
>在定义抽象类时需要注意,包含抽象方法的类必须声明为抽象类,但抽象类
可以不包含任何抽象方法,只需使用abstract关键字来修饰即可。另外,抽象
类是不可以被实例化的,因为抽象类中有可能包含抽象方法,抽象方法是没有方法体的,不可以被调用。如果想调用抽象类中定义的方法,则需要创建
一个子类,在子类中将抽象类中的抽象方法进行实现。
>如果一个抽象类中的所有方法都是抽象的,则可以将这个类用另外一种方式来定义,即接口。接口是由常量和抽象方法组成的特殊类,是对抽象类的进一步
I
抽象。
>在定义接口时,需要使用interface关键字来声明,其语法格式如下:
[public] interface 接口名 [extends接口1,接口2...]{
[public] [static] [final]数据类型常量名=常量值;
+[public][abstract] 返回值 抽象方法名(参数列表);
>在上面的语法中,一个接口可以有多个父接口,他们之间用逗号隔开。Java使用接口的目的是为了克服单继承的限制,因为一个类只能有一个父类,而一个类可以实现多个接口。接口中的变量默认使用“public static final”来修饰,即
全局常量;接口中定义的方法默认使用“publicabstract”来修饰,即抽象方法如果接口声明为public,则接口中的变量和方法全部为public。
由于接口中的方法都是抽象方法,因此不能通过实例化对象的方式来调用接口中的方法。此时需要定义一个类,并使用implements关键字实现接口中所有的方法。一个类可以在继承的同时实现多个接口,在implements子句中用逗号隔开。接口的实现类声明格式如下:
[<修饰符>]class <类名>[extends <超类名>][implements <接口1>,<接口2>,..]
>为了加深初学者对接口的认识,接下来对接口的特点进行归纳,具体如下:
。接口中的方法都是抽象的,不能实例化对象。.接口中的属性只能是常量。
。当一个类实现接口时,如果这个类是抽象类,则实现接口中的部分方法即可,否则
需要实现接口中的所有方法。
。一个类通过implements关键字实现接口时,可以实现多个接口,被实现的多个接口
之间要用逗号隔开。
一个接口可以通过extends关键字继承多个接口,接口之间可以用逗号隔开
具体示例如下:
interface Run {
程序代码.....
}
intertace Fly {
程岸代吗.......
}
class Bird implements Run, Fly {
程序代码.......
}
一个类在继承另外的类同时还可以继承接口,此时 extends关键字必须位于implements关键字
创建一个接口类
创建一个测试类
>在设计一个方法时,通常希望该方法具备一定的通用性。例如要实现一个动物叫的方法,由于每种动物的叫声是不同的,因此可以在方法中接收一个动物类型的参数,当传入猫类对象时就发出猫类的叫声,传入犬类对象时就发出犬类的叫声。在同一个方法中,这种由于参数类型不同而导致执行效果各异的现象就是多态。继承是多态得以实现的基础。
>在Java中为了实现多态,允许使用一个父类类型的变量来引用一个子类类型的
对象,根据被引用子类对象特征的不同,得到不同的运行结果。
多态的类型转换
>在多态的学习中,涉及到将子类对象当作父类类型使用的情况,此种情况在 Java的语言环境中称之为“向上转型”,例如下面两行代码:
An1ma1 an1=newCat();//将Cat对象当作Animal类型来使用·
new Dog()://将Dog对象当作Anma类型来使用
>将子类对象当作父类使用时不需要任何显式地声明,需要注意的是,此时不能通过父类变量去调用子类中的特有方法。
Object类
>在JDK中提供了一个Object类,它是类层次结构的根类,每个类都直接或间接继
承自该类,所有对象(包括数组)都实现了这个类的方法。Object类中的常用方法如下表所示。
方法名称 方法说明
equals() 指示其他某个对象是否与此对象“相等”。
getClass() 返回此Object的运行时类。
hashCodeO)e 返回该对象的哈希码值·
toStringO 返回该对象的字符串表示。
>在Object类中定义了toString()方法,在该方法中输出了对象的基本信息,Object类的toString()方法中的代码具体如下:
aetClass().getName() +"@”+ Integer.toHexString(hashCode());+
>为了方便初学者理解上面的代码,接下来分别对其中用到的方法进行解释,具体如下:
·getClass().getName()代表返回对象所属类的类名,即Animal。·hashCode()代表返回该对象的哈希值。
Integer.toHexString(hashCode())代表将对象的哈希值用16进制表示。
>其中,hashCode()是Object类中定义的一个方法,这个方法将对象的内存地址
案例代码 返回一个int类型的哈希值。
>在编写Java程序时,在类里面定义的类称之为内部类(InnerClass),内部类是
外部类的一个成员。Java内部类可以分为:成员内部类、方法内部类和匿名内部类等。
>在前面多态的讲解中,如果方法的参数被定义为一个接口类型,那么就需要定义一个类来实现接口,并根据该类进行对象实例化。除此之外,还可以使用匿名内部类来实现接口。所谓匿名内部类就是没有名字的内部类,表面上看起来
它似乎有名字,实际那不是它的名字。当程序中使用匿名内部类时,在定义匿名内部类的地方往往直接创建该类的一个对象。
父类交通工具类
子类去继承抽象类 重写货物运输的方法
专用运输工具类
定义一个具有定位功能的设备 实现gps接口
测试类