Day6.类和类成员的访问控制

本文详细讲解了Java中类的访问修饰符(public、protected、private、默认)的应用,以及static关键字如何控制类成员的可见性和共享。理解了访问控制对于代码封装和类间交互至关重要,同时学习了如何合理使用static属性和方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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关键字修饰的属性和方法,不属于具体的对象,采用类名加"."方法即可直接访问。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xem626

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值