Java基础--封装+static
目录
什么是封装?
什么是访问限定符?
static静态修饰符
用static修饰的类变量或类方法的注意事项:
什么是封装?
封装是面向对象的三大特性之一,指的是将一个类中的实现细节进行隐藏,对外只提供一些开放的接口而看不见内部的字段,通过访问限定符来控制对数据的访问,以此来提高程序的安全性。那么怎么实现封装呢?通常使用private关键字对类中的成员变量进行封装起来,通过用public方法提供对属性的访问和修改:
class Student{//在Student类外面直接访问是访问不到private修饰的成员变量的;private String name;private int age;public Student(String name, int age) {this.name = name;this.age = age;}//不能够直接访问字段,而我们可以写一些方法间接访问public void setName(String name) {this.name = name;}//获取name的方法public String getName() {return name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public void write(){System.out.println(this.name+"正在写作业");}
}
public class Test {public static void main(String[] args) {Student student = new Student("张三",10);//写完setName就可以修改字段了student.setName("小张");//通过getName方法去获取姓名System.out.println(student.getName());student.write();}
}
运行结果:
什么是访问限定符?
Java中主要通过类和访问权限来实现封装:类可以将数据以及封装数据的方法结合在一起,而访问权限用来控制方法或者字段能否直接在类外使用。Java中提供了以下访问限定符:
范围 | private | protected | public |
---|---|---|---|
同一包中的同一类 | ✔ | ✔ | ✔ |
同一包中的不同类 | ✔ | ✔ | |
不同包中的子类 | ✔ | ✔ | |
不同包中的非子类 | ✔ |
- 访问权限除了可以限定类中成员的可见性,也可以控制类的可见性
- 一般情况下成员变量设置为private,成员方法设置为public。
static静态修饰符
static修饰成员变量:被static修饰的成员变量,它属于类本身,而不是类的某个对象,称为类对象;在计算机中只有一份,能被类中的所有对象共享。没有被static修饰成员变量,它属于类的每个对象。每个对象在创建时都会拥有自己的一份实例变量。实例变量的内存空间在对象创建时分配,在对象销毁时释放。
public class Student {//实例变量,属于对象,每个对象都有自己的实例变量public String name;public int age;//类变量(静态变量),属于类,所有对象共享//当每个Student的教室都是相同的时候需要用到类变量会更加方便一些public static String classRoom = "2-412";public Student(String name, int age) {this.name = name;this.age = age;}public static void main(String[] args) {// 创建两个Student对象Student s1 = new Student("张三", 18);Student s2 = new Student("李四", 19);//实例化成员变量只能通过先实例对象,对象.成员变量来访问。System.out.println(s1.name);//静态成员变量可以直接通过类名访问System.out.println(Student.classRoom);//也可以通过对象访问System.out.println(s1.classRoom);}
}
通过以上的例子可以知道: 类变量可以通过类名.成员变量的方法来直接访问;当然可以通过实例化个对象,通过对象.成员变量方法来访问。而只能通过通过实例化个对象,通过对象.成员变量方法来访问。
被static修饰成员方法:也是一样的规则,类方法通过类名.成员的方法来直接访问,也可以通过实例化个对象,通过对象.成员方法来访问。而只能通过通过实例化个对象,通过对象.成员方法来访问。
public class Student {// 类变量(静态变量),属于类,所有对象共享private static int studentCount = 0;// 实例变量,属于对象,每个对象都有自己的实例变量private String name;private int age;// 构造方法public Student(String name, int age) {this.name = name;this.age = age;studentCount++; // 每次创建对象时,类变量studentCount自增}// 静态方法,可以访问类变量,但不能直接访问实例变量public static int getStudentCount() {return studentCount;}// 实例方法,可以访问实例变量和类变量public void displayInfo() {System.out.println("Name: " + name + ", Age: " + age);System.out.println("Total students: " + studentCount);}public static void main(String[] args) {// 创建两个Student对象Student student1 = new Student("Alice", 20);Student student2 = new Student("Bob", 22);// 通过类名访问类变量 System.out.println("Total students: " + Student.getStudentCount());// 调用实例方法student1.displayInfo();student2.displayInfo();}
}
用static修饰的类变量或类方法的注意事项:
- 在静态方法的内部 不能使用非静态的数据成员
- this 不能出现在静态方法当中