目录
一、静态变量和静态函数
1. 静态变量
1.1 概念
在类中,使用 static 修饰符修饰的属性(成员变量)称为静态变量,也可以称为类变量,常量称为静态常量,方法称为静态方法或类方法,它们统称为静态成员,归整个类所有。
静态成员不依赖于类的特定实例,被类的所有实例共享,就是说 static 修饰的方法或者变量不需要依赖于对象来进行访问,只要这个类被加载,Java 虚拟机就可以根据类名找到它们。
1.2 调用静态成员的语法结构:
类名.静态成员
注意:
- static修饰的成员变量和方法,从属于类;
- 普通变量和方法从属于对象;
- 静态方法不能调用非静态成员,编译时会报错。
- 从底层上讲,静态变量在类被载入时创建,只要类存在,静态变量就存在。
1.3 静态变量的应用
(1)保存跨对象信息
例:登录QQ时,在登陆界面输入账号、密码,单击“登录”,若登录成功,则到达聊天界面。
聊天界面如何知道登录界面的账号?
我们可以定义一个类,使用静态变量保存账号,代码如下:
class Conf{
static String loginAccount;
}
在登陆界面,若登录成功,账号将存入Conf.loginAccount。在聊天界面,访问Conf.loginAccount即可得到登录的账号。
(2)存储对象个数
保存一个类已经实例化的对象个数。
2.静态函数
2.1 概念
在普通函数的定义前加上关键字static,则称该函数为静态函数,也叫静态方法。
方法是一组变量和语句,它们作为一个逻辑单元一起发挥作用。像字段一样,方法可以有修饰符(如私有、公共或静态)。方法也有一个返回类型(如果该方法什么都不返回,则可能是无效的)。返回类型可以是引用类型(如对象或数组)。一个方法可以有任意数量的参数或参数。
2.2 静态函数的属性
- 它只能访问静态成员。
- 它可以在没有实例的情况下调用。
- 它不与对象关联。
- 静态函数不能访问非静态数据成员。
2.3 静态函数的声明
函数有函数原型和函数体两部分。
函数原型包含函数签名,其中包括函数名称、返回类型、访问说明符和参数列表。
函数体包含要执行的逻辑或功能。
语法结构:
访问权限类型 static 函数返回类型 函数名(参数列表){
函数成员;
}
2.4 静态函数的调用
语法结构:
类名.函数名
注意:
① 静态方法不能使用非静态数据成员或直接调用非静态方法。
② this和super关键字不能与静态上下文一起使用。
二、封装(Encapsulation)
1. 概念
封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。
2. 封装的优点
(1)封装避免了命名冲突的问题,具有隔离作用,不同的类中可以有相同名称的方法和属性,但不会混淆,也可以减少耦合(比如实现界面和逻辑分离);
(2)可以让类对外接口不变,内部可以实现自由的修改;
(3)从安全性考虑,封装使对代码的修改更加安全和容易,封装明确的指出了哪些属性和方法是外部可以访问的;
(4)因为封装的类功能相对独立,因此能更好的实现代码复用
(5)从设计角度来讲,封装可以对外屏蔽一些重要的信息。
3. 封装的实现
(1)将不能暴露的成员隐藏起来,不让其在类的外部被直接赋值。实现方法是将该成员定义为私有的,在成员定义前加上修饰符private。
(2)用公共方法暴露对该隐藏成员的访问,可以给函数加上修饰符public,将该方法定义为公共的。
三、包(package)
1. 包的引入
在本课程中不乏会出现一些代码,而这些代码各自占有一个.java文件,大量的文件堆积后显得十分混乱,这时为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间。
2. 什么是包?
在Java中,包是一种封装一组类、子包和接口的机制,可用于组织一组相关的类和接口。
从概念上讲, 包类似于计算机操作系统中的文件管理。
3. java中使用包的好处
(1)把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
(2)如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免命名冲突。
(3)包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。
4. 包的创建和导入
4.1 包的创建
package 包名;//声明必须放在第一行
如果一个源文件中没有使用包声明,那么其中的类,函数,枚举,注释等将被放在一个无名的包(unnamed package)中。
4.2 包的导入
为了能够使用某一个包的成员,我们需要在 Java 程序中使用 "import" 语句导入该包。
在 java 源文件中 import 语句应位于 package 语句之后,所有类的定义之前,可以没有,也可以有多条,其语法格式为:
import package1[.package2…].(classname|*);
四、访问控制修饰符
访问控制符是一组限定类、属性或方法是否可以被程序里的其他部分访问和调用的修饰符。
1. 类的访问控制修饰符
1.1 定义类时的访问控制符:
public或 默认。类只有这两种访问控制符。
如果为public类,则该类可以被其他类所访问。
如果为 默认 类,则该类只能被该包中的类所访问。
1.2 方法与变量的访问控制符
作用范围| |访问控制符 | public | protected | 默认(包可访问) | private(私有) |
同一个类中 | √ | √ | √ | √ |
同一个包中 | √ | √ | √ | |
不同包中的子类 | √ | √ | ||
不同包中的非子类 | √ |
(1)private
用 private 修饰的类成员,只能被该类自身的方法访问和修改,而不能被任何其他类(包括该类的子类)访问和引用。因此,private 修饰符具有最高的保护级别。
(2)friendly(默认)
如果一个类没有访问控制符,说明它具有默认的访问控制特性。这种默认的访问控制权规定,该类只能被同一个包中的类访问和引用,而不能被其他包中的类使用,即使其他包中有该类的子类。
(3)protected
用保护访问控制符 protected 修饰的类成员可以被三种类所访问:该类自身、与它在同一个包中的其他类以及在其他包中的该类的子类。使用 protected 修饰符的主要作用,是允许其他包中它的子类来访问父类的特定属性和方法,否则可以使用默认访问控制符。
(4)public
当一个类被声明为 public 时,它就具有了被其他包中的类访问的可能性,只要包中的其他类在程序中使用 import 语句引入 public 类,就可以访问和引用这个类。
2. 成员的访问控制修饰符
1.1 定义成员时的访问控制符:
private、default、protected、public。
1.2 特性
(1)private:成员只能在定义它的类的内部被访问。
(2)default:成员可以在定义它的类的内部被访问,也可以被这个包中的其他类访问。
(3)protected:成员可以在定义它的类的内部被访问,也可以被这个包中的其他类访问,还可以被包外的子类访问。
(4)public:成员可以在定义它的类的内部被访问,也可以被包内、包外的所有其他类访问。
从开放的程度上讲,private<default<protected<public。
五、类中类
1. 概念
在一个类内部进行其他类结构的嵌套操作,也叫内部类。
2. 内部类的优点
- 内部类与外部类可以方便的访问彼此的私有域(包括私有方法、私有属性)。
- 内部类是另外一种封装,对外部的其他类隐藏。
- 内部类可以实现java的单继承局限。
注意:
- 内部类中的成员只在内部类范围内才能使用,外部类不能像使用自己的成员变量一样使用它们。
- 如果在内部类中使用 this ,仅代表内部类的对象,因此也只能引用内部类的成员。