Java封装详解,通俗易懂

lucien-ma
• 阅读 1253

封装

什么是封装?

封装是指将类的属性隐藏在内部,外部不能直接访问和修改,必须通过类提供的方法来完成属性的访问和修改。封装的核心思想就是尽可能把属性都隐藏在内部,对外提供方法来访问,我们可以在这些方法中田间逻辑处理来实现过滤,以屏蔽错误的数据的赋值。


封装的步骤

  1. 修改属性的访问权限,使得外部不能直接访问
  2. 提供外部可以直接调用的方法
  3. 在方法中加入属性控制逻辑
  • 所以我们需要将类中的成员变量的访问权限设置为私有(private),既只能在类的内部访问,外部无法直接访问该属性。
  • 同时提供外部可以调用的方法,方法同样需要设置访问权限,很显然需要将方法的访问权限设置为 public。
  • 在方法中添加确保属性值正确的逻辑代码。

封装完成后每一个属性都添加了两个方法: getter 和 setter,外部通过 getter 获取该属性的值,通过 setter 方法修改该属性的值


static 关键字

Java 程序要运行就必须在某个类中定义一个 main 方法作为程序的入口,我们会发现爱定义 main 方法时,有一个 static 关键字,那 static 表示什么呢? 为什么要用 static 来修饰 main 方法?本节内容为你一一揭晓。

static 表示静态或全局,可以用来修饰成员变量和成员方法以及代码块。

  • 要访问类中的成员变量或者成员方法,必须首先创建该类的对象,然后通过对象才能访问成员变量的成员方法,也就是说成员变量和成员方法的访问必须依赖于对象,这是常规的方式
  • 而 static 修饰的成员变量和成员方法独立于该类的任何一个实例对象,访问时不依赖于该类的对象。可以理解为被该类的所有实例对象共用,所以说它是全局。
  • 用 static 修饰的成员变量叫作静态变量页脚类变量, static 修饰的成员方法叫作静态方法,也叫作类方法。多个对象共用,内存只有一份
  • 没有被 static 修饰的成员方法叫作实例变量,没有被 static 修饰的成员方法叫作实例方法,一个对象对应一个,内存中有多份

既然静态成员变量和静态成员方法独立于任何一个实例对象,我们在访问这些静态资源时就无须创建对象,直接通过类即可访问。

class User{
    public static String name;
    public static void show(){
        System.out.println("这是一个User对象")
    }
}

public class Test{
    public static void main(String[] args){
        User.name = "张三";
        System.out.println(User.name);
        User.show();
    }
}

这种写法是没有问题的,不会报错


下面进行几个实例分析

代码 A

public class Test{
    private int id;
    public static void main(String[] args){
        Test test = null;
        for(int i = 0; i < 10; i++){
            test = new Test();
            test.id++;
        }
        System.out.println(test.id);
    }
}

分析:代码 A 的运行结果为1,因为此时的 id 为成员变量,每个实例化对象都拥有一个自己的 id。循环中创建了10个 Test 对象,内存中就会有10个 id,每个 id 都进行了加一操作,由0变为1,并且每次循环都会将新创建的 Test 对象赋给变量 test ,相当于更新了 10 次 test 的引用。 应为每次的 id 值都为 1 ,所以最终的结果也为 1

代码 B

public class Test{
    private static int id;
    public static void main(String[] args){
        Test test = null;
        for(int i = 0; i < 10; i++){
            test = new Test();
            test.id++;
        }
        System.out.println(test.id);
    }
}

分析:代码 B 的运行结果为 10,因为此时的 id 是静态变量,属于类不属于对象,内存中只有一份,所以任何时候对 id 的修改都会作用在同一个变量,循环中共执行了 10 次 id++,所以 id 的值为 10

代码 C

public calss Test{
    private static int id;
    public static void main(String[] args){
        for(int i = 0; i < 10; i++){
            Test.id++;
        }
        System.out.println(Test.id);
    }
}

分析: 代码 C 的运行结果为 10 ,具体的原因同代码 B,唯一的却别在于代码 B 是通过实例化对象访问静态变量的, 代码 C 是通过类来访问静态变量的,运行结果没有区别。

我们在使用 static 修饰成员方法时需要注意,静态方法中不能使用 this 关键字,不能直接访问所属类的实例变量和实例方法,可直接访问类的静态变量和静态方法。若要访问类的实例变量和实例方法,必须先实例化类的对象,然后通过对象去访问

static 修饰代码块

重要:

static 除了可以修饰成员变量和成员方法之外,还可以修饰代码块,被 static 修饰的代码块被叫作静态代码块。静态代码块的特点是只执行一次,在什么时候执行呢?当该类被加载到内存时执行,不需要手动调用,他会自动执行,在什么时候类第一次被加载?这里我们需要简单地阐述一下 Java 加载类的机制。我们知道 Java 代码时偶类构成的,但是真正运行时是通过对象和对象之间的相互调用关系来完成需求的。即在程序运行时,需要在内存中创建多个对象,对象怎么创建?需要通过类来创建,类是模板,同时这个模板只需要加载一次,所以程序在运行时,首先会讲程序中用到的类加载到内存中,并且只加载一次。然后通过类来创建多个对象以完成具体的业务。被加载到内存中的类叫作运行时类,静态代码块就是在加载类的时候执行的,因为类只加载一次,所以静态代码块也只执行一次。简单的理解,当代码中第一次出现某个类时,就会执行静态代码块,静态代码块只能访问静态变量和静态方法

public class User{
    public static int num;
    static{
        num++;
        System.out.println("执行了静态代码块");
    }
}

public class Test{
    public static void main(String[] args){
        User user = new User();
        User user2 = new User();
        User user3 = new User();
        System.out.println(user.num);
        System.out.println(user2.num);
        System.out.println(user3.num);
    }
}

运行结果应该为:


执行了静态代码块

1

1

1


通过结果可以得出结论:虽然创建了 3 个 User 对象,但是静态代码块只执行一次。如果有多个静态块同时存在,则按先后顺序执行,类的构造方法用于初始化类的实例,类的静态代码块用于初始化类,给类的静态变量赋值。

点赞
收藏
评论区
推荐文章
Irene181 Irene181
2年前
一篇文章带教会你Python访问限制那些事儿
一、前言在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑。二、案例分析以Teacher类的定义来看,外部代码还是可以自由地修改一个实例的name、score属性。classTeacher(object):definit(self,name,score):s
Wesley13 Wesley13
2年前
java面向对象的三大特性
java面向对象的三大特性1.封装,把事物封装成抽象的类,通过访问控制符把自己的成员变量和函数对不可信的进行信息隐藏以及提供方法给可信的类和对象来操作。2.继承,继承可以使用现有类的所有功能和成员变量,并且无需重新编写原来的类的情况下对这些功能进行扩展。3.多态,实现了对代码的复用,多态具体体现为重载和重
Wesley13 Wesley13
2年前
java的封装和this关键字知识整理
封装封装概述封装,是面向对象思想的特征之一。面向对象共有三个特征:封装,继承,多态。|封装表现:1.方法是最基本的封装体2.类也是一个封装体.封装的好处:1、提高了代码的复用性。 2、隐藏了实现细节,还要对外提供可以访问的方式。便于调用者的使用。这是核心之一,也可以理解为就是封装的概念。 3、提高了安全性。
Wesley13 Wesley13
2年前
java面向对象,final,super ,抽象类,重写,代码块,static,this,构造方法,堆栈
在jvm内存中主要分布有以下三个区域:栈:存放基础数据和自定义对象的引用堆:主要存储创建的对象,即new出来的对象方法区:加载存放class文件(字节码文件)什么是封装?封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。封装的优点:隐藏代码的实现细节,提高安全性。private
Wesley13 Wesley13
2年前
Java类和对象
一、类类是封装对象的属性和行为的载体,在Java语言中对象的属性以成员变量的形式存在,而对象的方法以成员方法的形式存在。1\.类的构造方法构造方法是一个与类同名的方法,对象的创建就是通过构造方法完成的,构造方法分为有参构造方法和无参构造方法,区别就在于有没有参数。说这么多概念是不是感觉有点麻木,直接看下面的例子吧。pub
Wesley13 Wesley13
2年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Wesley13 Wesley13
2年前
Java中的静态内部类学习记录
一、静态内部类:1.静态内部类,静态内部类对象可以不依赖于外部类对象,直接创建。 2.静态内部类中,只能直接访问外部类的静态成员,如果需要调用非静态成员,可以通过实例对象实例。3.静态内部类对象实例时,可以不依赖于外部类对象4.可以通过外部类.内部类.静态成员的方式,访问内部类中的静态成员。5.当内部类属性与外部类属性同名时,默认直接
Wesley13 Wesley13
2年前
Java面试题(一)
看到一篇不错的java面试题的文章,自己整理一下,作为备用吧!Java面试题面向对象的特征有哪些方面?封装最常见的是把属性私有化封装在一个类里面,只能通过方法去访问继承子类继承父类,从而继承了父类的方法和属性抽象
Wesley13 Wesley13
2年前
JAVA的封装
什么是封装?在定义类的时候,如果可以直接修改类中的字段那么就可能会出现以下的情况,age可以设置成1000,score可以设置为10000所以就引出了封装的概念,那么什么是封装呢或者说封装可以实现那些目的1.封装可以隐藏实现的细节2.让使用者只能通过实现写好的访问方法来访问这些字段,这样一来我们只需要在
Wesley13 Wesley13
2年前
Java面向对象之封装
概述面向对象编程语言是对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改。封装可以被认为是一个保护屏障,防止该类的代码和数据被其他类随意访问。要访问该类的数据,必须通过指定的方式。适当的封装可以让代码更容易理解与维护,也加强了代码的安全性。封装的原则将属性隐藏起来,若需要访问某个属性,提供公共方法