Java类与对象详解Java类的定义及其实例化•类必须先定义才能使用。类是创建对象的模板,创建对象也叫类的实例化。示例说明•public是类的修饰符,表明该类是公共类,可以被其他类访问。•class是定义类的关键字。•Dog是类名称。•name、age是类的成员变量,也叫属性;bark()、hungry()是类中的函数,也叫方法。•一个类可以包含以下类型变量:–局部变量:在方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。–成员变量:成员变量是定义在类中、方法体之外的变量。这种变量在创建对象的时候实例化(分配内存)。成员变量可以被类中的方法和特定类的语句访问。–类变量:类变量也声明在类中,方法体之外,但必须声明为static类型。static也是修饰符的一种构造方法•在类实例化的过程中自动执行的方法叫做构造方法,它不需要你手动调用。构造方法可以在类实例化的过程中做一些初始化的工作。构造方法的名称必须与类的名称相同,并且没有返回值。每个类都有构造方法。如果没有显式地为类定义构造方法,Java编译器将会为该类提供一个默认的构造方法。创建对象•对象是类的一个实例,创建对象的过程也叫类的实例化。对象是以类为模板来创建的。在Java中,使用new关键字来创建对象,一般有以下三个步骤:声明:声明一个对象,包括对象名称和对象类型。•实例化:使用关键字new来创建一个对象。•初始化:使用new创建对象时,会调用构造方法初始化对象。访问成员变量和方法Java访问修饰符(访问控制符)•Java通过修饰符来控制类、属性和方法的访问权限和其他功能,通常放在语句的最前端。•Java的修饰符很多,分为访问修饰符和非访问修饰符。•访问修饰符也叫访问控制符,是指能够控制类、成员变量、方法的使用权限的关键字。在面向对象编程中,访问控制符是一个很重要的概念,可以使用它来保护对类、变量、方法和构造方法的访问。public:公有的•被声明为public的类、方法、构造方法和接口能够被任何其他类访问。如果几个相互访问的public类分布在不用的包中,则需要导入相应public类所在的包。由于类的继承性,类所有的公有方法和变量都能被其子类继承。•Java程序的main()方法必须设置成公有的,否则,Java解释器将不能运行该类。protected:受保护的•被声明为protected的变量、方法和构造方法能被同一个包中的任何其他类访问,也能够被不同包中的子类访问。protected访问修饰符不能修饰类和接口,方法和成员变量能够声明为protected,但是接口的成员变量和成员方法不能声明为protected。子类能访问protected修饰符声明的方法和变量,这样就能保护不相关的类使用这些方法和变量。private:私有的•私有访问修饰符是最严格的访问级别,所以被声明为private的方法、变量和构造方法只能被所属类访问,并且类和接口不能声明为private。声明为私有访问类型的变量只能通过类中公共的Getter/Setter方法被外部类访问。private访问修饰符的使用主要用来隐藏类的实现细节和保护类的数据。•在类中定义访问私有变量的方法,习惯上是这样命名的:在变量名称前面加“get”或“set”,并将变量的首字母大写。例如,获取私有变量name的方法为getName(),设置name的方法为setName()。这些方法经常使用,也有了特定的称呼,称为Getter和Setter方法。默认的:不使用任何关键字•不使用任何修饰符声明的属性和方法,对同一个包内的类是可见的。接口里的变量都隐式声明为publicstaticfinal,而接口里的方法默认情况下访问权限为public。访问控制和继承•父类中声明为public的方法在子类中也必须为public。•父类中声明为protected的方法在子类中要么声明为protected,要么声明为public。不能声明为private。•父类中默认修饰符声明的方法,能够在子类中声明为private。•父类中声明为private的方法,不能够被继承。如何使用访问控制符•访问控制符可以让我们很方便的控制代码的权限:当需要让自己编写的类被所有的其他类访问时,就可以将类的访问控制符声明为public。•当需要让自己的类只能被自己的包中的类访问时,就可以省略访问控制符。•当需要控制一个类中的成员数据时,可以将这个类中的成员数据访问控制符设置为public、protected,或者省略。Java变量的作用域•在Java中,变量的作用域分为四个级别:类级、对象实例级、方法级、块级。•类级变量又称全局级变量或静态变量,需要使用static关键字修饰,你可以与C/C++中的static变量对比学习。类级变量在类定义后就已经存在,占用内存空间,可以通过类名来访问,不需要实例化。•对象实例级变量就是成员变量,实例化后才会分配内存空间,才能访问。•方法级变量就是在方法内部定义的变量,就是局部变量。•块级变量就是定义在一个块内部的变量,变量的生存周期就是这个块,出了这个块就消失了,比如if、for语句的块。•方法内部除了能访问方法级的变量,还可以访问类级和实例级的变量。•块内部能够访问类级、实例级变量,如果块被包含在方法内部,它还可以访问方法级的变量。•方法级和块级的变量必须被显示地初始化,否则不能访问。this关键字详解•this关键字用来表示当前对象本身,或当前类的一个实例,通过this可以调用本对象的所有方法和属性。•注意:this只有在类实例化后才有意义。方法重载•在Java中,同一个类中的多个方法可以有相同的名字,只要它们的参数列表不同就可以,这被称为方法重载(methodoverloading)。参数列表又叫参数签名,包括参数的类型、参数的个数和参数的顺序,只要有一个不同就叫做参数列表不同。重载是面向对象的一个基本特性。说明•参数列表不同包括:个数不同、类型不同和顺序不同。•仅仅参数变量名称不同是不可以的。•跟成员方法一样,构造方法也可以重载。•声明为final的方法不能被重载。•声明为static的方法不能被重载,但是能够被再次声明。方法的重载的规则•方法名称必须相同。•参数列表必须不同(个数不同、或类型不同、参数排列顺序不同等)。•方法的返回类型可以相同也可以不相同。•仅仅返回类型不同不足以成为方法的重载。•方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错,这叫做重载分辨。Java类的基本运行顺序•基本运行顺序是:•先运行到第9行,这是程序的入口。•然后运行到第10行,这里要new一个Demo,就要调用Demo的构造方法。•就运行到第5行,注意:可能很多人觉得接下来就应该运行第6行了,错!初始化一个类,必须先初始化它的属性。•因此运行到第2行,然后是第3行。•属性初始化完过后,才回到构造方法,执行里面的代码,也就是第6行、第7行。•然后是第8行,表示new一个Demo实例完成。•然后回到main方法中执行第11行。•然后是第12行,main方法执行完毕。Java包装类、拆箱和装箱详解•虽然Java语言是典型的面向对象编程语言,但其中的八种基本数据类型并不支持面向对象编程,基本类型的数据不具备“对象”的特性——不携带属性、没有方法可调用。沿用它们只是为了迎合人类根深蒂固的习惯,并的确能简单、有效地进行常规数据处理。这种借助于非面向对象技术的做法有时也会带来不便,比如引用类型数据均继承了Object类的特性,要转换为String类型(经常有这种需要)时只要简单调用Object类中定义的toString()即可,而基本数据类型转换为String类型则要麻烦得多。为解决此类问题,Java为每种基本数据类型分别设计了对应的类,称之为包装类(WrapperClasses),也有教材称为外覆类或数据类型类。自动拆箱和装箱•上面的例子都需要手动实例化一个包装类,称为手动拆箱装箱。Java1.5(5.0)之前必须手动拆箱装箱。Java1.5之后可以自动拆箱装箱,也就是在进行基本数据类型和对应的包装类转换时,系统将自动进行,这将大大方便程序员的代码书写。再谈Java包•在Java中,为了组织代码的方便,可以将功能相似的类放到一个文件夹内,这个文件夹,就叫做包。包不但可以包含类,还可以包含接口和其他的包。•包以.来表示层级关系,例如p1.p2.Test表示的目录为\p1\p2\Test.class。如何实现包•通过package关键字可以声明一个包,例如:packagep1.p2;必须将package语句放在所有语句的前面packagep1.p2;publicclassTest{publicTest(){System.out.println(我是Test类的构造方法);}}包的调用•1)在每个类名前面加上完整的包名publicclassDemo{publicstaticvoidmain(String[]args){java.util.Datetoday=newjava.util.Date();System.out.println(today);}}包的调用•2)通过import语句引入包中的类importjava.util.Date;//也可以引入java.util包中的所有类//importjava.util.*;publicclassDemo{publicstaticvoidmain(String[]args){Datetoday=newDate();System.out.println(today);}}包的访问权限•被声明为public的类、方法或成员变量,可以被任何包下的任何类使用,而声明为private的类、方法或成员变量,只能被本类使用。没有任何修饰符的类、方法和成员变量,只能被本包中的所有类访问,在包以外任何类都无法访问它。Java源文件的声明规则•当在一个源文件中定义多个类,并且还有import语句和package语句时,要特别注意这些规则:一个源文件中只能有一个public类。•一个源文件可以有多个非public类。•源文件的名称应该和public类的类名保持一致。例如:源文件中public类的类名是Employee,那么源文件应该命名为Employee.java。•如果一个类定义在某个包中,那么package语句应该在源文件的首行。Java源文件的声明规则•如果源文件包含import语句,那么应该放在package语句和类定义之间。如果没有package语句,那么import语句应该在源文件中最前面。•import语句和package语句对源文件中定义的所有类都有效。在同一源文件中,不能给不同的类不同的包声明。•类有若干种访问级别,并且类也分不同的类型:抽象类和final类等。这些将在后续章节介绍。•除了上面提到的几种类型,Java还有一些特殊的类,如内部类、匿名类。