文章目录
5.1类和类成员的访问控制
包实际上是一种访问控制机制,通过包来限制和制约类之间的访问关系。访问修饰符也同样可以限制和制约类之间的访问关系。
1.Java中类的访问修饰符
作用域\修饰符 | 同一包中 | 非同一包中 |
---|---|---|
public | 可以使用 | 可以使用 |
默认修饰符(default) | 可以使用 | 不可以使用 |
例:
class Person1 {
//这就是默认修饰符的类,要想调用访问必须在同一包中
}
2.类成员的访问修饰符
public:公有的
被声明为public的类、方法、构造方法和接口能够被任何其他类访问。
如果几个相互访问的public类分布在不用的包中,则需要导入相应public类所在的包。由于类的继承性,类所有的公有方法和变量都能被其子类继承。Java程序的main() 方法必须设置成公有的,否则,Java解释器将不能运行该类
protected:受保护的
被声明为protected的变量、方法和构造方法能被同一个包中的任何其他类访问,也能够被不同包中的子类访问。
protected访问修饰符不能修饰类和接口,方法和成员变量能够声明为protected,但是接口的成员变量和成员方法不能声明为protected。
子类能访问protected修饰符声明的方法和变量,这样就能保护不相关的类使用这些方法和变量。
下面的父类使用了protected访问修饰符,子类重载了父类的bark()方法。
public class Dog{
protected void bark() {
System.out.println("汪汪,不要过来");
}
}
class Teddy extends Dog{ // 泰迪
void bark() {
System.out.println("汪汪,我好怕,不要跟着我");
}
}
如果把bark()方法声明为private,那么除了Dog之外的类将不能访问该方法。如果把bark()声明为public,那么所有的类都能够访问该方法。如果我们只想让该方法对其所在类的子类可见,则将该方法声明为protected。
private:私有的
私有访问修饰符是最严格的访问级别,所以被声明为private的方法、变量和构造方法只能被所属类访问,并且类和接口不能声明为private。
声明为私有访问类型的变量只能通过类中公共的Getter/Setter方法被外部类访问。
private访问修饰符的使用主要用来隐藏类的实现细节和保护类的数据。
public class Dog{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Dog类中的name、age变量为私有变量,所以其他类不能直接得到和设置该变量的值。为了使其他类能够操作该变量,定义了两对public方法,getName()/setName() 和 getAge()/setAge(),它们用来获取和设置私有变量的值。
默认的:不使用任何关键字
不使用任何修饰符声明的属性和方法,对同一个包内的类是可见的。接口里的变量都隐式声明为public static final,而接口里的方法默认情况下访问权限为public。
如下例所示,类、变量和方法的定义没有使用任何修饰符
class Dog{
String name;
int age;
void bark(){ // 汪汪叫
System.out.println("汪汪");
}
void hungry(){ // 饥饿
System.out.println("我饿了");
}
}
如何使用访问控制符
访问控制符可以让我们很方便的控制代码的权限:
1.当需要让自己编写的类被所有的其他类访问时,就可以将类的访问控制符声明为 public。
2.当需要让自己的类只能被自己的包中的类访问时,就可以省略访问控制符。
3.当需要控制一个类中的成员数据时,可以将这个类中的成员数据访问控制符设置为 public、protected,或者省略
作用域\修饰符 | 同一类中 | 同一包中 | 子孙类中 | 其他包 |
---|---|---|---|---|
private | 可以使用 | 不可以使用 | 不可以使用 | 不可以使用 |
默认修饰符 | 可以使用 | 可以使用 | 不可以使用 | 不可以使用 |
protected | 可以使用 | 可以使用 | 不可以使用 | 不可以使用 |
public | 可以使用 | 可以使用 | 可以使用 | 可以使用 |
例:
Person和 Test类在同一包中
public class Person{
private String name;
public int age;
protected String gender;
}
Test类中:
public void test1(){
Person person = new Person();
person.gender="111";
person.name="111";//非法,报错
}
5.2static关键字
一个类可以创建n个对象。如果n个对象中的某些数据需要共用,就需要使用static关键字修饰这些数据。
Java中,一般情况下调用类的成员都需要先创建类的对象,然后同过对象进行调用。使用static关键字可以实现通过类名加"."直接调用类的成员,不需要创建类的对象。使用staic修饰的属性和方法属于类,不属于具体的某个对象。
1.用static关键字修饰属性
将Person类的name、gender和age属性保留,新建一个static修饰的属性,并调用。
分析如下:
使用static修饰的属性不依赖于任何对象,用类名直接加"."调用即可。
使用static修饰的属性不依赖于任何对象,用类名直接加“.”调用即可。
例:
public class Person{
public static int PERSON_LIVE;//人的生命只有一次
}
测试:
public void test1(){
Person.PERSON_LIVE=1;
}
在实际开发中,用static关键字修饰属性的最常用场景就是定义使用final关键字修饰的常量。使用final
关键字修饰的常量在整个程序运行时都不能被改变,和具体的对象没有关系,因此使用static修饰,
例如 “static final int PERSON_LIVE”
注意:
1.常量名一般由大写字母组成
2.声明常量时一定要赋值初值
2.用static关键字修饰方法
用staic修饰的方法称为静态方法或者类方法,不用static关键字修饰的方法称为实例方法
例:
将Person中的showDetails()方法使用static关键字修饰,并调用
public class Person{
public static void showDetails(){
System.out.println("1111111111");
}
}
测试:
public static void main(String[] args) {
Person.showDetails();
}
注意:
静态方法只能访问静态成员,实例方法可以访问静态和实例成员。之所以不允许静态方法访问实例成员变量,是因为实例成员变量是属于某个对象的,而静态方法在执行时,并不一定存在对象。同样,因为实例方法可以访问实例成员变量,如果允许静态方法调用实例方法,将间接地允许它使用实例成员变量,所以它也不能调用实例方法。基于同样的道理,静态方法中也不能使用关键字this。
main()方法是一个典型的静态方法,它同样遵循一般静态方法的规则,所以它可以由系统在创建对象之前就调用
本章总结:
1.了解了类和对象,也学习了如何定义类,创建对象和使用对象
2.面向对象的优点:与人类的思维习惯一致,封装使信息隐藏,提高了程序的可维护性和安全性,一个类可以创建多个对象的实例,体现了重用性。
3.对象用来描述客观事物的一个实体,由一组属性和方法构成
4.类是具有相同的属性和方法的一组对象的集合
5.使用类的步骤是,使用class定义类、使用new关键字创建类的对象,使用"."访问类的属性和方法。
6.如果一个类中包含了两个或两个以上方法,他们方法名相同,方法参数列表不同,则称为给重载。
7.构造方法用于创建类的对象。构造方法的作用主要就是创建对象时执行一些初始化操作。可以通过构造方法重载来实现多种初始化行为。
8.封装的好处在于隐藏类的实现细节,让使用者只能通过程序员规定的方法来访问数据库,可以方便的加入存取控制修饰符,以限制不合理操作。
9.Java中包含类的访问修饰符和类成员访问修饰符,其作用与不同。
10.static关键字修饰的属性和方法,不属于具体的对象,采用类名加"."方法即可直接访问。