Java基础:类和对象

来源:互联网 发布:c语言 字符串统计函数 编辑:程序博客网 时间:2024/06/03 00:19

第三章  类和对象

3.1.1 定义类

    类:某一批对象的抽象,可以理解成某种概念,如人类,鱼类,鸟类

    对象:一个具体存在的实体,如张三,小丑鱼,喜鹊

 

    定义类的简单语法

  [修饰符]  class  类名

  {

      零个到多个构造器定义。。。

      零个到多个成员变量。。。

      零个到多个方法。。。                         (三者无顺序可言)

  }

   修饰符:publicfinalabstract。或者没有

   类名:每个单词首字母大写,其他全部小写,单词之间没有分隔符

   成员变量:用于定义该类或该类的实例所包含的状态数据

   方法:用于定义该类或该类的实例的行为特征或者功能实现

   构造器:用于构造该类的实例

   (static修饰的成员不能访问没有static修饰的成员,但反过来可言)

 

1.定义成员变量的语法格式

        [修饰符]  类型  成员变量名  [= 默认值];

    修饰符:可省略,可为public,protected,private,static,final,其中public,protected,private最多只能出现其中之一

    类型:Stingint等准许的数据类型

成员变量名:为了可读性,最好为一组有具体意思的字母,第一个单词的首字母小写,后面的首字母大写,之间无分隔符

默认值:可有可无,可指定一个可选的默认值

作用范围:成员变量在整个类内部有效,局部变量只在定义其的方法内有效。

 

2.定义方法的语法格式

         [修饰符]  方法返回值类型 方法名(形参列表)

         {

//由零条到多条可执行性语句组成的方法体

  }

     修饰符:可省略,可为public,protected,private,static,final,abstract,其中public,protected,private最多只能出现其中之一,abstractfinal最多只能出现其一

 方法返回值:Stingint等准许的数据类型,如果声明返回值,则方法体内必须有一个return语句,其可返回一个变量或表达式,这个变量或者表达式的类型必须与此处声明的类型相匹配;若没返回值,则必须使用void声明没有返回值

方法名:与成员变量名命名规则基本相同,但建议用动词开头

形参列表:用于定义该方法可接受的参数,形参列表可有零个到多个“参数类型 形参名”组合,多组之间用“,”隔开谁调用方法,谁负责为形参赋值

执行性语句有严格的执行顺序,谁在前,谁先执行;static修饰的成员属于该类的本身,不属于任何一个实例,所以被static修饰的成员成为:类变量,类方法;没有static修饰的成员则属于该类的单个实例,而不属于该类,所以被称为:实例量,实例方法

3.构造器是一个特殊的方法,其格式

[修饰符]  构造器名(形参列表)

{

       //由零条到多条可执行性语句组成的方法体

}

修饰符:可省略,也可以为publicprotectedprivate其一

构造器名:必须与类名相同

形参列表:和定义方法的规则完全相同。

(不能定义返回值类型,也不能使用void声明没有返回值。若用void声明了,则不会报错,但会被当做一个方法对待。构造器的返回值是隐式的。若无显式构造器,则系统默认提供一个不含任何参数的构造方法,若有,系统则不再提供)

 

3.1.2对象的产生和使用

可通过new调用某个类的构造器创建这个类的实例  Person a = new Person();

类或实例访问方法或成员变量的语法是:类.类变量|方法,或者实例.实例变量|方法

Static修饰的量即可通过类调用,也可通过实例调用,无static修饰的量只能通过实例调用

 

3.1.3this关键词

This相当于“我的”意思,可调用本身自己的方法或成员变量,不用在方法中从新创建一个实例去调用本类中的其他方法或成员变量;this可以省略;static修饰的方法不能使用this引用;使用的格式为:this.方法|成员变量

  (在一个静态方法中访问另一个普通方法,则只需要创建一个对象。new 类名().方法名()

   this在构造器中使用时,this总是引用该构造器正在初始化的对象;如果构造器中有一个与成员变量同名的局部变量,又必须在构造器中访问这个被覆盖的成员变量,则必须使用this前缀;this可以作为返回值,可以多次连续的调用同一个方法,从而使代码更简洁,但可能造成实际意义的模糊

 

3.2方法详解

3.2.1方法的传递机制

参数的传递方式只有一种:值传递。所谓值传递,就是将实际参数值的副本传入方法内,而参数本身不会受到任何影响。

3.2.1方法重载

指一个类中可以有多个方法具有形同的名字,但是方法的参数必须不同,不同之处可以是参数的类型和数量。

3.2.2形参个数可变方法

如果在定义方法时,在最后一个形参的类型后增加三点(...),则表明该形参可以接受多个参数值,多个参数值被当成数组传入。

个数可变的形参只能处于形参列表的最后,也就是说一个形参列表最多只能有一个个数可变的形参。

3.2.3递归方法

一个方法体内调用它自身,被称为方法递归。方法递归包含了一种隐式的循环,它会重复执行某段代码,但这种重复执行无须循环控制。

递归一定要向一直方向递归。

 

3.3成员变量和局部变量

3.3.1成员变量和局部变量

成员变量指在类里定义的变量,局部变量指在方法里定义的变量。

命名规则:第一个单词首字母小写,后面每个单词首字母大写,无分隔符。

定义成员变量无static修饰的为实例变量,有static修饰的为类变量。

成员变量无须显示初始化,只要为一个定义类定义了类变量或实例变量,系统就会在这个类的准备阶段或创建该类的实例时进行默认初始化,其初始化赋值规律与数组动态初始化规律相同。

 

成员变量的生命周期

形参:在定义方法签名时定义的变量,形参的作用域在整个方法内有效。

方法局部变量:在方法体内定义的局部变量,他的作用域是从定义该变量的地方生效,到该方法结束时失效。

代码块局部变量:在代码块中定义的局部变量,这个局部变量的作用域从定义该变量的地方生效,到该代码块结束时失效。

 

成员变量除了形参之外,都必须显示初始化。一个类里不能定义两个同名的成员变量;一个方法里不能定义两个同名的方法方法局部变量,方法局部变量与形参也不能同名;一个方法中不同代码块内的代码局部变量可以同名;如果先定义代码块局部变量,后定义方法局部变量,前面定义的代码块局部变量与后面定义的方法局部变量也可以同名。

 

成员变量的隐藏:当定义的局部变量的名字和成员变量的名字相同时,则成员变量被隐藏,使用的是局部变量,若想使用成员变量,必须通过关键词this来引用。

 

3.3.2变量的使用规则

1.如果需要定义的变量是用于描述某个或某个对象的固有信息的,例如人的身高、体重等信息,他们是人对象的固有信息,每个人对象都具有这些信息。这种变量应该定义为成员变量。如果这种信息对这个类的所有实例完全相同,或者说它是类相关的,例如人的眼睛数量,这种类相关的信息应该定义成类变量;如果这种信息是实例相关的,例如人的身高、体重等,每个人实例的身高。体重可能互不相同,这种信息是实例相关的,因此应该定义成实例变量。

2.如果在某个类中需要以一个变量来保存该类或者实例运行时的状态信息,这种用于保存某个类或者某个实例状态信息的变量通常应该使用成员变量。

3.如果某个信息需要在某个类的多个方法之间进行共享,则这个信息应该使用成员变量来保存。

即使在程序中使用局部变量,也应该尽可能地缩小局部变量的作用范围,局部变量的作用范围越小,他在内存里停留的时间越短,程序运行性能就越好。因此,能用代码块局部变量的地方,就坚决不要使用方法局部变量。

 

3.4隐藏和封装

3.4.1理解隐藏

对一个类或对象实现良好的封装,可以实现以下目的:

1.隐藏类的细节。

2.让使用者只能通过事先预定的方法来访问数据,从而可以在该方法里加入控制逻辑,限制对成员变量的不合理访问。

3.可进行数据检查,从而有利于保证对象信息的完整性。

4.便于修改,提高代码的可维护性

为了实现良好的封装,需要从两个方面考虑:

1.将对象的成员变量和实现细节隐藏起来,不允许外部直接访问。

2.把方法暴露出来,让方法来控制对这些成员变量进行安全的访问和操作。

3.4.2使用访问控制符

 

private

Default()

protected

public

同一个类中

同一个包中

 

子类中

 

 

全局范围内

 

 

 

 

 

 

 

 

 

对于外部类而言,它也可以使用访问控制符修饰,但只能用public和默认,因为外部类没有处于任何类的内部,也就没有其所在类的内部、所在类的子类两个范围。

private修饰的成员变量,可以用settergetter方法访问。

 

访问控制符的使用基本规则:

1.类里的绝大部分都应该使用private修饰,只有一些static修饰的,类似全局变量的成员变量,才可能考虑使用public。除此之外,有些方法只用于辅助实现该类的其他方法,这些方法被称为工具方法,工具方法也应该使用private修饰。

2.如果某个类主要用做其他的父类,该类里包含的大部分方法可能仅希望被其子类重写,而不想被外界直接调用,则用该用protected修饰。

3.希望暴露出来给其他类自由调用的方法应该使用public修饰。因此,类的构造器通过使用public修饰,从而允许在其他地方创建该类的实例。因为外部类通常都希望被其他类自由使用,所以大部分外部类都是用public修饰。

3.4.3packageimportimport static

1.包结构,应该在源程序的第一个非注释行放置如下代码:package  packageName;

2.从可读性来说,包名应该全部是小写字母,而且应该由一个或者多个有意义的单词连缀而成。

3.java引入了import关键词,import可以向某个java文件导入指定包层次下某个类或全部类,import语句应该出现在package语句(如果有的话)之后、类定义之前。一个java源文件只能包含一个package语句,但可以包含多个import语句,多个import语句用于导入多个包层次下的类

import package.subpakage.(...).ClassName;     (导入指定包下的指定类)

import package.(...).*                 (导入指定包下的全部类)

静态导入,用于指定类的某个静态成员变量、方法或全部静态成员变量、方法。

import static package.subpackage.(...).ClassName.fieldName|methodName;

(导入指定类的单个静态成员变量、方法)

import static package.subpackage.(...).ClassName.*;

   (导入指定类的全部静态成员变量、方法)

使用import可以省略包名;使用import static则可以连类名都省略。

4.包的三个作用:

(1)组织类,包能将类组织成单元,就像文件目录。

(2)防止类命名混乱,为了防止类的命名想相同而造成影响。

(3)控制包中类、接口、成员变量和方法的可见性,在包中除了声明为private的成员变量和方法外,其余的均可被同一包中的其他类和方法访问。

5.创建包的dos口令:javac -d . ClasName.Java

3.5深入构造器

构造器最大的用处就是在创建对象时执行初始化。因为构造器主要用于被其他方法调用,用以返回该类的实例,因而通常把构造器设置成public访问权限。

构造器重载和方法重载类似,在一个构造器中引用另一个构造器可以用this

0 0
原创粉丝点击