java之成员变量(实例成员变量和静态成员变量)

简介: java之成员变量(实例成员变量和静态成员变量)

类的成员

类的成员可以包含以下:字段、方法、代码块、内部类和接口等。此处我们重点介绍字段.


1.1字段/属性/成员变量

在类中, 但是方法外部定义的变量. 这样的变量我们称为 "字段" 或 "属性" 或 "成员变量"(三种称呼都可以, 一般不会严格区分).


在java中,成员变量分为两种:实例成员变量和静态成员变量。


1.1.1实例成员变量

实例成员变量:是定义在方法外部和类内部的且不被static所修饰的变量.用于描述一个类中包含哪些数据


代码示例:

class Person {
    public String name;//其别名有三种:属性/实例成员变量/字段
    public int age;
    public boolean flg;
    public char ch;
}
public class LeiHeDuiXiang {
    public static void main(String[] args) {
        Person person = new Person();
        //默认值为0
        System.out.println(person.age);
        //默认值为null
        System.out.println(person.name);
        //默认值为'\u0000',输出时不显示任何东西
        System.out.println(person.ch);
        //默认值为false
        System.out.println(person.flg);
    }


注意事项:

1:通过对象的引用来访问实例成员变量
2:"访问" 既包含读, 也包含写.
3:对于一个成员变量如果没有显式设置初始值, 那么会被设置一个默认的初值.
下面来介绍下成员变量(不管是静态成员变量还是实例成员变量)在不赋值情况下的默认取值吧:
 byte short int long默认取值为 0
 float 默认取值为0.0f;  
double 默认取值为0.0
 boolean  默认取值为false
 char 默认取值为'\u0000'(最终输出时为空)


1.1.2静态成员变量

static关键字修饰成员变量,简称静态成员变量,又称类变量

1.访问方式:通过类名.静态成员变量名进行访问

2.内存的存储方式:方法区

3.特点:静态的只有一份,且不依赖对象


代码示例:

class Man {
 public static int count;
}
public class LeiHeDuiXiang {
    public static void main(String[] args) {
        Man.count++;
        System.out.println(Man.count);
        Man.count++;
        System.out.println(Man.count);
        Man.count++;
        System.out.println(Man.count);
    }
}
//输出结果为:
1
2
3

因为count为静态成员变量,其存储在方法区中且只有一个,是共享的,所以每次当访问它时,都会影响它的值


1.2认识null

null 在 Java 中为 "空引用", 表示不引用任何对象. 类似于 C 语言中的空指针. 如果对 null 进行 . 操作就会引发异常.


代码示例:

class Person {
    public String name; public int age;
}
class Test {
    public static void main(String[] args) { Person person = new Person();
        System.out.println(person.name.length()); // 获取字符串长度
    }
}
// 执行结果
    Exception in thread "main" java.lang.NullPointerException at Test.main(Test.java:9)

同时假如我们给一个对象的引用赋值为null时,当输出这个引用此时还是为null,而假如此时不为空的话,输出值又会为多少呢?

Person person1 = new Person();
System.out.println(person1);

上述代码最终的输出结果为如下:


2.png


Person为类,@为分隔符,4554617c为对象地址的哈希值,那么为什么最终的输出结果为这个呢?我们来看下源码便一清二楚了


1首先来看println处的源码:


2.png


Object类为所有类的父类,valeOf方法是将引用x转化为字符串,那么是如何转化的呢?我们接着看valeOf的源码:


2.png


此处判断这个引用是否为空,若为空,则返回null,若不为空,则返回这个引用所调用的toString方法的返回值,那么我们再来看toString方法的源码吧:


2.png


我们可以看到,toString方法返回的是类的名字加上一个分隔符号@再加上一个把哈希值变成十六进制的数字


总结:1.当我们输出对象的引用时,此时我们会在底层调用Object类的toString方法,返回一个对象地址的十六进制哈希值


         2.toString 方法会在 println 的时候被自动调用. 将对象转成字符串这样的操作我们称为 序列化.


         3. toString 是 Object 类提供的方法, 我们自己创建的 Person 类默认继承自 Object 类, 可以重写 toString 方法实现我们自己版本的转换字符串方法. (关于继承和重写这样的概念, 我们后面会重点介绍).


         4.IDEA快速生成Object的toString方法快捷键:alt+f12(insert),此处我们没有重写这个默认的toString方法,并无大碍,后面会详细介绍。


1.3成员变量初始化

很多时候我们不希望成员变量使用默认值, 而是需要我们显式设定初值. 那么此时有五种方法供我们成员变量初始化:


1:默认初始化,即程序所赋予的默认值,上面已经讲过,此处不再过多陈述。


2:就地初始化:即在定义成员变量时便进行初始化,如下所示:

public String name = "张三";
public int age = 18;

3:类外初始化,即通过对象的引用进行初始化,这种方法一般用的最多,下面来看下实现过程:(注意私有的可通过setXX和getXX方法实现)

public static void main(String[] args) {
        Person person = new Person();
        person.name = "张三";
        person.age = 14;
        }

4:通过实例代码块和静态代码块进行初始化:这个在后面我们会专门讲到,在这里只需要知道这两个代码块的作用一般是提前初始化一些数据.


5.通过构造方法进行初始化。


相关文章
|
12天前
|
Java
Java——接口的使用实例
Comparable接口用于自定义类的对象比较。通过实现此接口并重写`compareTo`方法,可以定义自定义类型的比较规则。 接下来介绍了Comparator接口,它提供了一种更灵活的比较方式。通过实现Comparator接口并重写`compare`方法,可以根据不同属性定义不同的比较规则。例如,定义一个`BrandComparator`类来比较汽车的品牌。 最后,介绍了Cloneable接口,用于实现对象的克隆。实现该接口并重写`clone`方法后,可以创建对象的浅拷贝或深拷贝。浅拷贝仅复制对象本身,深拷贝则会递归复制所有成员变量。
14 4
Java——接口的使用实例
|
1天前
|
存储 Java
Java之静态(static)与实例(instance)
Java之静态(static)与实例(instance)
|
2天前
|
存储 Java
java基础(7)变量以及变量的分类
Java变量是内存中存储数据的基本单元,包含数据类型、名称和字面值。变量的数据类型决定了分配的内存空间大小。变量声明格式为“数据类型 变量名;”,变量名应符合标识符命名规范。变量可以重新赋值,但数据类型需一致。变量可以一行声明多个,作用域决定了变量的可用范围。变量分为局部变量和成员变量,局部变量定义在方法体内,成员变量定义在方法体外、类体内。
15 2
|
14天前
|
存储 Java
Java内置数据类型和实例的详解
Java内置数据类型分为基本和引用两类。基本数据类型包括整型(`byte`、`short`、`int`、`long`)、浮点型(`float`、`double`)、字符型(`char`)和布尔型(`boolean`),用于存储简单的数值;引用数据类型则用于存储对象的引用,包括类(如`String`)、接口和数组。掌握这两类数据类型是Java编程的基础。以下示例展示了各种数据类型的使用方法。
|
15天前
|
Java
Java实例详解
Java实例是通过类创建的对象,其核心在于将抽象的类定义转化为具体的实体。类作为对象的模板定义了属性和行为,而实例则是这些定义的具体实现。通过`new`关键字可以创建实例,并利用点运算符访问其属性和方法。实例拥有自己的生命周期,从创建到使用直至被垃圾回收机制自动清理。此外,实例变量和静态变量的区别在于前者属于单个实例,后者则为所有实例共享。理解Java实例的概念及其管理对编程至关重要。
|
20天前
|
存储 Java 开发者
【Java新纪元启航】JDK 22:解锁未命名变量与模式,让代码更简洁,思维更自由!
【9月更文挑战第7天】JDK 22带来的未命名变量与模式匹配的结合,是Java编程语言发展历程中的一个重要里程碑。它不仅简化了代码,提高了开发效率,更重要的是,它激发了我们对Java编程的新思考,让我们有机会以更加自由、更加创造性的方式解决问题。随着Java生态系统的不断演进,我们有理由相信,未来的Java将更加灵活、更加强大,为开发者们提供更加广阔的舞台。让我们携手并进,共同迎接Java新纪元的到来!
45 11
|
23天前
|
存储 Java 程序员
优化Java多线程应用:是创建Thread对象直接调用start()方法?还是用个变量调用?
这篇文章探讨了Java中两种创建和启动线程的方法,并分析了它们的区别。作者建议直接调用 `Thread` 对象的 `start()` 方法,而非保持强引用,以避免内存泄漏、简化线程生命周期管理,并减少不必要的线程控制。文章详细解释了这种方法在使用 `ThreadLocal` 时的优势,并提供了代码示例。作者洛小豆,文章来源于稀土掘金。
|
1月前
|
Java 应用服务中间件 HSF
Java应用结构规范问题之AllLoggers接口获取异常日志的Logger实例的问题如何解决
Java应用结构规范问题之AllLoggers接口获取异常日志的Logger实例的问题如何解决
|
14天前
|
JavaScript 前端开发 Java
通过JUnit5访问Java静态、私有、保护变量和方法
在《通过Gtest访问C++静态、私有、保护变量和方法》一文中介绍了如何通过Gtest访问C++静态、私有、保护变量和方法,本文介绍如何通过Junit5访问Java静态、私有、保护变量和方法。
14 0
|
27天前
|
算法 Java 开发者
你的Java代码还可以这样写:JavaIO的简单代码实例和展示
在编程世界中,Java无疑是璀璨的明星。本文通过两个示例介绍抽象类与接口的魅力:首先,通过抽象类`Shape`及其子类`Circle`和`Rectangle`展示多态性;接着,通过接口`PerimeterCalculator`为形状类添加周长计算功能,展现了接口的灵活性。掌握这两者将助你在Java编程中更进一步,应对复杂项目游刃有余。
33 0