在Java语言中,值分为两种,基本类型和引用类型,基本类型就是直接赋值,引用类型就是需要在堆中来创建对象。
对于基本类型来说,是有默认值的;对于引用类型来说,也是有值的,但是默认值为null
那么问题就出现在这里:如果为null,那么对于一个程序来说,是没有任何意义的,而且还会导致程序出现问题,那么如何来进行避免?
那么最根本的解决方式就是避免为空,直接赋值。
下面来看一下案例:
地址类:
public class Address { /** * 城市名称 */ String name; /** * 建造年限 */ Integer buildAge; @Override public String toString() { return "Address{" + "name='" + name + '\'' + ", buildAge=" + buildAge + '}'; } }
创建Student类:
/** * @Description 从来为从能够想到的方式,潜移默化的东西能够被别人一针见血的指出来,豁然开朗 * <p> A has a B,那么在类A中创建属性B,B类来作为引用; * A is a B,那么用类A去实现或者是继承类B * 为什么会需要进行封装,如何来区别:是继承(实现)还是通过继承,都有明确的要求和规定来进行实现!以前是随心所欲,所以说达不到别人的要求使用的地方! * 这些是思维层面上的东西,需要我们来进行大量的练习之后,才能够达到这样的要求! * @Author liguang * @Date 2022/03/27/15:45 */ public class Student { /** * 学生名称 */ int age; /** * 学生姓名 */ String name; /** * 所处城市 */ Address address; @Override public String toString() { return "Student{" + "age=" + age + ", name='" + name + '\'' + ", address=" + address + '}'; } public static void main(String[] args) { // 创建一个对象,并对其赋予初始值,那么对象中的属性了都有了初始值,但是对于引用类型来说对应的值为null,所以不能够来进行直接使用 // 还需要来对其进行赋值才能够来进行使用! Student student = new Student(); // 那么直接来进行输出看一下对应的值,因为是基本类型,所以赋值之后应该为0 System.out.println("赋值之前,student对应的值是:" + student.age); // 赋值直接使用基本变量即可 student.age = 12; System.out.println("赋值之后,student对应的值是:" + student.age); // 引用类型!这里是比较特殊的使用,"liguang"是一个对象 student.name = "liguang"; // 对于address来说,没有进行过初始化,所以student.address对应的值是null,那么null不能够调用任何属性和方法,所以会报出空指针异常 // 为了避免出现空指针异常,那么首先需要对其进行初始化,初始化之后,可以调用对应的属性,那么对应的属性buildAge才会为null,从而不会导致程序出现问题 // student.address.buildAge = 12; System.out.println("未对address进行初始化前,对象student中的属性address对应的值是:"+student.address); student.address = new Address(); // 在这里修改了Address类中的toString方法,所以将会导致这里的结构会发生变化! System.out.println("对address进行初始化后,对象student中的属性address对应的值是:"+student.address); System.out.println("可以来进行赋值了>>>>>>>>>>>>>>>>>>>>>>>>>"); student.address.buildAge = 11; student.address.name = "深圳"; System.out.println(student); } }
由java中的值来印出来的空指针异常,通过空指针异常找到对应的解决方式,通过对应的解决方式反过来来理解java中的封装!
所以封装方法还是有效果的!最起码可以保证我们的程序在代码运行过程中是可以正常的来进行运行的。