java基础之面向对象

面向对象编程初步

4.1 类和对象

4.11 类的定义

Java中的类的简单语法格式
【修饰符】class 类名{
零个或多个构造方法定义
零个或多个变量
零个或者多个方法}

1.修饰符可以是public final也可以直接省略前者
Java 必须是一个合法的,由一个或者多个有意义的单词组合而成,每个单词首字母大写且单词和单词之间不要使用分隔符
一个类中包含着三种最常见成员1.构造方法 2.变量 3.方法(三种成分可定义为零个或者多个,但如果三种成分都定义为零个,就定义了一个空类,没有实际意义)
变量用于定义该类或该类的实例(对象)所包含的数据;方法用于定义该类或该类的实例(对象)的行为特征或者功能实现;构造方法用于构造该类的实例(对象),
Java中通过new关键字来调用构造方法从而能够返回对象。
!!!构造方法是一个类创建对象的根本途径,如果一个类没有构造方法,那么该类通常无法创建实例(对象)【当程序员没有为一个类编写构造方法时,系统将会自动为类提供默认的构造方法;
反之系统将不会提供默认的构造方法】
1.定义变量的语法格式
【修饰符】变量类型 变量名【=默认值】;
【修饰符】:可省略或【public ,protected,private】三者之一,可以与static,final组合起来修饰变量
变量类型:可以是 Java 语言允许的任何数据类型,包括基本数据类型和现在介绍的引用数据类型(类)。
变量名:变量名应该由一个或多个有意义的单词组合而成,第一个单词首字母小写,后面每个单词首字母大写,其他字母全部小写,单词与单词之间不需使用任何分隔符
!!!在 Java 的官方说法里,变量被称为field,因此有的地方也把变量翻译为字段
2.定义方法的语法格式
【修饰符】方法返回值类型 方法名(【形参列表】){
//由零条或多条语句组成的方法体
}
【修饰符】:可省略或【public ,protected,private】三者之一,可以与static,final组合起来修饰变量
方法返回值类型:返回值类型可以是 Java 语言允许的任何数据类型,包括基本数据类型和引用数据类型;如果声明了方法返回值类型,则方法体内必须有一条有效的
return 语句,该语句返回一个变量或一个表达式的值,这个变量或者表达式的类型必须与方法返回值类型匹配。除此之外,如果一个方法没有返回值,则必须使用 void 来
声明
static 是一个特殊的关键字,可用于修饰方法、变量等成员。static 修饰的成员表明它是属于这个类共有的,而不是属于该类的单个实例,因此通常把 static 修饰的变量和方法也称为类
变量、类方法。不使用 static 修饰的普通方法、变量则属于该类的单个实例,而不是属于该类,因此通常把不使用 static 修饰的变量和方法也称为实例变量、实例方法。由于 static 直译就是
静态的意思,因此也把 static 修饰的变量和方法称为静态变量和静态方法,把不使用 static 修饰的变量和方法称为非静态变量和非静态方法。静态成员不能直接访问非静态成员
3.构造方法的语法格式
修饰符】构造方法名(【形参列表】){
//由零条或多条语句组成的方法体
}
【修饰符】:public ,protected,private其中之一
【构造方法名】:构造方法名必须和类名相同
【形参列表】:和定义方法形参列表的格式完全相同
!!!与其他方法不同的是,构造方法不能声明返回值类型,也不能使用 void 关键字声明构造
方法没有返回值。如果为构造方法声明了返回值类型,或使用 void 关键字声明构造方法没有
返回值,编译时不会出错,但 Java 会把这个所谓的构造方法当成普通方法来处理
4.1.2 对象的使用
创建对象的根本途径是构造方法,通过new关键字来调用某个类的构造方法即可创建这个类的实例(对象)
如果访问权限允许,类里定义的方法和变量都可以通过类或实例来调用。类或实例访问方
法或变量的方法的格式为:
类名.变量名 或 类名.方法名([参数列表])
对象名.变量名 或 对象名.方法名([参数列表])
在这种方式中,类或对象是主调者,用于访问该类或该对象的指定变量或方法。
static 修饰的方法和变量,既可通过类来调用,也可通过对象来调用;没有使用 static 修饰
的普通方法和变量,则只能通过对象来调用。
4.1.3 this的使用
在Java中提供了一个this作为自身的引用,在该类的自身方法用于引用该对象自身。
注意:在不引起歧义的情况下,this 关键字是可以省略的。
在Java中,变量分为类变量,方法变量和局部变量。在一个类中,类变量是不能重名的,但方法变量和局部变量是可以和类变量重名的,这时可以使用this来限定和区分是否是类变量。
由于 static修饰的方法不能使用 this 引用,所以 static 修饰的方法不能访问不使用 static 修饰的普通成员,这与前面指出的静态成员不能直接访问非静态成员的结论也完全一致。
4.2 方法
在面向对象编程语言里,整个系统由一个一个的类组成。因此在 Java 语言里,方法不能独立存在,必须属于类或对象 。
一旦将一个方法定义在某个类体内,如果这个方法使用了 static 修饰,则这个方法属于这个类,否则这个方法属于这个类的对象
Java 语言是静态的,意味着一个类定义完成后,只要不再重新编译这个类文件,该类和该类的对象所拥有的方法是固定的,永远都不会改变。
即所有方法都必须使用“类名.方法名()”或者“对象名.方法名()”的形式来调用。这里需要指出:
同一个类的一个方法调用另外一个方法时,如果被调用方法是普通方法,则默认使用 this 作为调用者;如果被调方法是静态方法,则默认使用类作为调用者。也就是说,表面上看起来某些方法可以被独立执行,但实际上还是使用this或者类作为调用者。
永远不要把方法当成独立存在的实体,正如现实世界里由类和对象组成,而方法只能作为类和对象的附属,Java 语言里的方法也是一样。需注意:
⚫ 方法不能独立定义,只能在类体里定义。
⚫ 从逻辑意义上看,方法要么属于一个类,要么属于一个对象。
⚫ 永远不能独立执行方法,执行方法必须使用类或对象作为调用者。
4.2.1 方法的参数传递
Java 里的方法是不能独立存在的,调用方法也必须使用类或对象作为调用者。
如果定义方法时包含了形参,则调用方法时必须给这些形参指定参数值,
调用方法时实际传给形参的参数值也被称为实参。
4.2.2 形参长度可变的方法
如果在定义方法时,在最后一个形参的类型后增加 3 点(…),则表明该形参可以接受多个参数值,多个参数值被当成数组传入。
注意:
数组形式的形参可以处于形参列表的任意位置,但个数可变的形参只能处于形参列表的最后。即一个方法中最多只能有一个长度可变的形参。
4.2.3递归方法
一个方法在其方法体内调用自身,被称为方法的递归调用。方法递归调用包含了一种隐式的循环,它会重复执行某段代码,但这种重复执行无须循环控制。
阶乘:
public class CalcFactorial{
public static long factorial(int n){
if(n==1){
return 1;
}else{
return n*factorial(n-1);
}
}
public static void main(String[] args){
System.out.println(“10 的阶乘为:”+factorial(10));
}
}
4.2.4 方法重载
Java 允许同一个类里定义多个同名方法,只要形参列表不同。如果同一个类中包含了两个或两个以上方法的方法名相同,但形参列表不同,则被称为方法重载(overloaded)。
从上面介绍可以看出,确定一个方法需要 3 个要素。
⚫ 调用者,也就是方法的所属者,既可以是类,也可以对象。
⚫ 方法名,方法的标识。
⚫ 形参列表,当调用方法时,系统将会根据传入的实参列表匹配。
方法重载的要求就是两同、一不同:同一个类中方法名相同,参数列表不同,即参数的个数、类型、顺序的不同。至于方法的其他部分,如方法返回值类型、修饰符等,与方法重载没有任何关系

4.3 变量
在 Java 语言中,根据定义变量位置的不同,可以将变量分成两大类,即成员变量和局部变量。
成员变量指的是在类范围里定义的变量;(实例变量(不用static修饰)和类变量(使用static修饰));
局部变量(形参,方法内定义的局部变量,代码块中定义的局部变量)指的是在一个方法或复合语句内定义的变量。
类变量和实例变量统称为成员变量,其中类变量可以理解为类成员变量,它作为类的一个成员,与类共存亡;
实例变量则可理解为实例成员变量,它作为实例的一个成员,与实例共存亡。
局部变量根据定义形式的不同,又可以被分为如下 3 种:
⚫ 形参:在定义方法签名时定义的变量,作用域在整个方法内有效,到方法结束时消失。
⚫ 方法局部变量:在方法体内定义的局部变量,作用域是从定义该变量的地方生效,到
该方法结束时消失。
⚫ 代码块局部变量:在代码块中定义的局部变量,这个局部变量的作用域从定义该变量
的地方生效,到该代码结束时失效。
与成员变量不同的是,局部变量除了形参之外,都必须显示初始化。
也就是说,必须先给方法局部变量和代码块局部变量指定初始化值,否则不可以访问它们。
在同一个类里,成员变量的作用范围是整个类内有效,一个类里不能定义两个同名的成员变量,
即使一个是类变量,一个是实例变量也不行;
一个方法里不能定义两个同名的局部变量。
Java 允许局部变量和成员变量同名,如果方法里的局部变量和成员变量同名,
局部变量会覆盖成员变量,如果需要在这个方法里引用被覆盖的成员变量,
则可使用 this(对于实例变量)或类名(对于类变量)作为调用者来限定访问成员变量。
4.4 隐藏和封装
4.4.1 理解封装
封装(Encapsulation)是面向对象三大特征之一(另外两个是继承和多态),它指的是将对象的状态信息隐藏在内部,
不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。
封装是面向对象编程语言对客观世界的模拟,客观世界里的属性都是被隐藏在对象内部的,外界无法直接操作和修改。
对一个类或对象实现良好的封装,可以实现以下目的:
⚫ 隐藏类的实现细节。
⚫ 让使用者只能通过事先预定的方法来访问数据,从而可以在该方法里加入控制逻辑,限制对属性的不合理访问。
⚫ 可进行数据检查,从而有利于保证对象信息的完整性。
⚫ 便于修改,提高代码的可维护性。为了实现良好的封装,需要从两个方面考虑:
⚫ 将对象的属性和实现细节隐藏起来,不允许外部直接访问。
⚫ 把方法暴露出来,让方法来操作或访问这些属性。
因此,封装实际上有两个方面的含义:把该隐藏的隐藏起来,该暴露的暴露出来。这两个
方面都需要通过使用 Java 提供的访问控制符来实现
4.4.2 使用访问控制符
Java 提供了 3 个访问控制符,即 private、protected 和 public,分别代表了 3 个访问控制级别,另外还有一个不加任何控制符的访问控制级别,共 4 个访问控制级别。
Java 的访问控制级别由小到大依次是 private—>default—>protected—>public
这 4 个访问控制级别的详细介绍如下。
⚫ private 访问控制级别:如果类里的一个成员(包括属性和方法)使用 private 访问控制
符来修饰,则这个成员只能在该类的内部被访问。很显然,这个访问控制符用于修饰
属性最合适,可以把属性隐藏在类的内部。
⚫ default 访问控制权限(包访问权限):如果类里的一个成员(包括属性和方法)或者
一个顶级类不使用任何访问控制符修饰,我们就称它是默认访问控制。default 访问控
制的成员或顶级类可以被相同包下其他类访问。关于包的介绍参见 4.4.3 节。
⚫ protected 访问控制权限(子类访问权限):如果一个成员(包括属性和方法)使用
protected 访问控制符修饰,那么这个成员就可以被同一个包中其他类访问,也可以被
不同包中的子类访问。通常情况下,如果使用 protected 来修饰一个方法,通常是希望
其子类重写这个方法。关于父类、子类的介绍请参见 5.6 节的内容。
⚫ public 访问控制权限(公共访问权限):这是一个最宽松的访问控制级别,如果一个成
员(包括属性和方法)或者一个顶级类使用了 public 修饰,这个成员或顶级类就可以
被所有类访问,不管访问类和被访问类是否处于同一包中,是否具有父子继承关系。
通过上面关于访问控制符介绍不难发现,访问控制符用于控制一个类的成员是否可以被其
他类访问,对于局部变量而言,其作用域就是它所在的方法,不可能被其他类来访问,因此不
能使用访问控制符来修饰。
对于类而言,也可以使用访问控制符修饰,但类只能有两种访问控制级别----public 和
default,不能使用 private 和 protected 修饰,因为类既不处于任何类的内部,也就没有其外部类
的子类了,因此 private 和 protected 访问控制符对类没有意义。
类可以使用 public 和默认访问控制级别,使用 public 修饰的类可以被所有类使用,如声明
变量;不使用任何访问控制符修饰的类只能被同一个包中的所有类访问
注意的是,如果一个 Java 源文件里定义的所有类都没有使用 public 修饰,则这个 Java源文件的文件名可以是一切合法的文件名。
但如果一个 Java 源文件里定义了一个 public 修饰的类,则这个源文件的文件名必须与 public 类的类名相同

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值