• JAVA中的属性、方法、构造器,你真的弄懂了吗?


    一、变量分类

    • 成员变量:在方法体外,类体内声明的变量称为成员变量;不以static修饰的是实例变量,以static修饰的为类变量
    • 局部变量:在方法体内部声明的变量称为局部变量
    成员变量局部变量
    声明的位置直接声明在类中方法形参或内部、代码块内、构造器内等
    修饰符四种权限修饰符、final等不能用权限修饰符修饰、可以用final修饰
    初始化有默认初始化没有默认初始化,必须显式赋值
    内存加载位置堆空间或静态域内栈空间

    二、初始化赋值

    当一个对象被创建时,会对其中各种类型的成员变量自动进行初始化赋值。除了基本数据类型之外的变量类型都是引用数据类型。

    成员变量类型初始值
    byte0
    short0
    int0
    long0
    float0.0
    double0.0
    char0或写为'\u0000'(表现为空)
    booleanfalse
    引用数据类型null

    三、对象的内存解析

    先看一下如下代码:

    1. public class Person {
    2. public static void main(String[] args) {
    3. Person p1 = new Person();
    4. p1.age = 20;
    5. p1.name = "cabbage";
    6. Person p2 = new Person();
    7. p2.age = 12;
    8. }
    9. private String name;
    10. private int age;
    11. }
    12. 复制代码

    内存解析图:

    简单解析一下:以p1对象引用为例,当我们创建该对象时,成员变量就会放在堆空间中,先是默认初始化值null0,之后通过对象.属性的赋值方式把属性值分别改为:cabbage20


    四、对象数组的内存解析

    先看如下代码:

    1. public class Person {
    2. public static void main(String[] args) {
    3. Person[] people = new Person[2];
    4. people[0] = new Person();
    5. people[0].name = "cabbage";
    6. people[0].age = 20;
    7. System.out.println(people[0].toString());
    8. System.out.println(people[1]);
    9. }
    10. private String name;
    11. private int age;
    12. @Override
    13. public String toString() {
    14. return "Person{" +
    15. "name='" + name + '\'' +
    16. ", age=" + age +
    17. '}';
    18. }
    19. }
    20. 复制代码

    内存解析图:

    简单解析一下:因为是对象数组,所有初始值每个默认值都是null,当给people[0]创建对象时,会在堆空间中开辟一个空间用来储存成员变量name、age;对象赋值的过程与对象内存解析的方式一样。

    运行结果:


    五、方法使用介绍

    1、方法的声明:

    • 权限修饰符 返回值类型 方法名(形参列表){ 方法体 }

    2、返回值类型:有返回值 vs 没有返回值

    • 如果方法有返回值,则必须在方法声明时,指定返回值的类型。同时,方法中,需要使用return关键字来返回指定类型的变量或常量:“return 数据”
    • 如果方法没有返回值,则方法声明时,使用void来表示。通常,没有返回值的方法中,就不需要使用return.但是,如果使用的话,只能“return;”表示结束此方法的意思

    3、return关键字的使用:

    • 使用在方法体中,方法中不可以定义方法
    • 作用:结束方法、针对于有返回值类型的方法,使用"return 数据"方法返回所要的数据
    • 注意点:return关键字后面不可以声明执行语句
    • 方法的使用中,可以调用当前类的属性或方法
    • 特殊的:方法A中又调用了方法A:递归方法

    六、方法重载

    • 含义:同一个类、方法名一样、形参列表(个数、类型、顺序)不同

    下列方法都构成了重载:

    1. public class Person {
    2. private String name;
    3. private Integer age;
    4. public void one() { }
    5. public void one(Integer age) { }
    6. public void one(String name) { }
    7. public void one(String name, Integer age) { }
    8. public void one(Integer age, String name) { }
    9. }
    10. 复制代码

    我们再来看看可变个数的形参:

    1. public class Person {
    2. public static void main(String[] args) {
    3. Person person = new Person();
    4. person.one("one","two","three");
    5. }
    6. public void one() { }
    7. public void one(String... names) { }
    8. }
    9. 复制代码
    • 可变个数形参的格式:数据类型 ... 变量名
    • 可变个数形参的方法与本类中方法名相同,形参不同的方法之间构成重载
    • 可变个数形参的方法与本类中方法名相同,形参类型也相同的数组之间不构成重载。换句话说,二者不能共存。
    • 可变个数形参在方法的形参中,必须声明在末尾且最多只能声明一个可变形参。

    最后来看看方法形参的传递机制:值传递

    • 形参:方法定义时,声明的小括号内的参数

    • 实参:方法调用时,实际传递给形参的数据

    值传递机制:

    • 如果参数是基本数据类型,此时实参赋给形参的是实参真实存储的数据值

    • 如果参数是引用数据类型,此时实参赋给形参的是实参存储数据的地址值


    七、构造器

    构造器说明:

    • 如果没有显式的定义类的构造器的话,则系统默认提供一个空参的构造器
    • 一个类中定义的多个构造器,彼此构成重载
    • 一旦我们显式的定义了类的构造器之后,系统就不再提供默认的空参构造器
    • 一个类中,至少会有一个构造器。
    1. public class Person {
    2. public static void main(String[] args) {
    3. Person person = new Person();
    4. }
    5. public Person() {
    6. System.out.println("我是构造器");
    7. }
    8. }
    9. 复制代码

    运行结果:

    八、this关键字

    this说明:

    • this可以用来修饰、调用:属性、方法、构造器

    • 在类的方法中,我们可以使用"this.属性""this.方法"的方式,调用当前对象属性或方法。

    • 在类的构造器中,可以显式的使用"this(形参列表)"方式,调用本类中指定的其他构造器

    • 构造器中不能通过"this(形参列表)"方式调用自己

    • 规定:"this(形参列表)"必须声明在当前构造器的首行

    • 构造器内部,最多只能声明一个"this(形参列表)",用来调用其他的构造器

    写个代码验证一下:

    1. public class Person {
    2. public static void main(String[] args) {
    3. Person person = new Person("cabbae", 20);
    4. }
    5. private String name;
    6. private Integer age;
    7. public Person(String name, Integer age) {
    8. this(name);
    9. this.name = name;
    10. this.age = age;
    11. }
    12. public Person(String name) {
    13. System.out.println("我的名字是:" + name);
    14. }
    15. }
    16. 复制代码

    运行结果:

  • 相关阅读:
    <C++>模板
    计算机毕设源代码网站ssm基于web的在线学习平台
    双向TVS的符号及几个参数问题?
    yarn资源配置及使用
    MySQL约束和表的复杂查询操作
    数据结构——二叉树的遍历【前序、中序、后序】
    C++提高编程:01 模板
    dns隧道攻击原理及常用工具流量分析
    IDEA Error: java: -source 1.5中不支持 lambda 表达式和 Error:java: Compilation failed
    31.JavaScript数组进阶,一网打尽数组操作函数slice、filter、map、reduce、some、every、find、splice
  • 原文地址:https://blog.csdn.net/java_beautiful/article/details/126138654