Java 变量作用域、构造方法官方教程

news2024/12/23 9:23:18

一、变量作用域

Java 中的变量有3种:
📖 ① 全局变量:被定义在类中(成员变量)
📖 ② 局部变量:被定义在成员方法、代码块、静态代码块中定义的变量
📖 ③ 参数:方法声明中的变量

There are several kinds of variables(变量):

📋 Member variables(成员变量) in a class:these are called fields(属性)
📋 Variables in a method or block of code(代码块):these are called local variables(局部变量)
📋 Variables in method declarations(方法声明):these are called parameters(参数)

✏️ 全局变量(成员变量)作用域为:整个类体
✏️ 局部变量(除全局变量之外的变量)作用域为:它所在的代码块
✏️ 全局变量可以不赋值,直接使用(全局变量有默认值)
✏️ 局部变量必须赋值后才能使用
✏️ 参数的值在方法被调用的时候才有

public class VariableDomain {
    // 全局变量
    private String name;

    {
        int age = 10; // 局部变量
    }

    static {
        double pai = 3.14; // 局部变量
    }

    // num1、description 参数
    public void test(int num1, String description) {
        String hobby = "睡觉"; // 局部变量
    }
}

📜 全局变量名和局部变量名可以一样,访问的时候遵循就近原则
📜 在同一作用域中(eg:同一成员方法中),不能有重名的局部变量
📜 同一类的同一代码块中的成员变量也不能重名

全局变量和局部变量重名的时候,访问遵循就近原则:

public class VariableDomain {
    // 全局变量
    private String name = "张浩男";

    public static void main(String[] args) {
        VariableDomain domain = new VariableDomain();
        domain.test();
    }

    private void test() {
        String name = "莫松"; // 局部变量(可以和全局变量重名)
        // output: name = 莫松
        System.out.println("name = " + name);
    }
}

不同类的成员变量可以重名:

📜 全局变量(成员变量)的生命周期长:【对象就像一个人🙍,成员变量就像一个人的手👋】全局变量的生命伴随着对象的存在而存在,便随着对象的销毁而销毁
📜 局部变量生命周期短:与它所在的代码块共生
📜 全局变量可以在本类或其他类中使用
📜 局部变量只能在它所在类的指定方法中使用
📜 全局变量可以被修饰符修饰(eg:private、static、final)
📜 局部变量不能被修饰符修饰

二、构造方法(Constructor)

(1) 官方教程解释构造方法

📝 A class contains constructors that are invoked to create objects from the class blueprint. Constructor declarations look like method declarations:except that they use the name of the class and have no return type.
📝 ① 类中包含构造方法(可通过调用构造方法从一个类模板中创建一个对象)
📝 ② 声明构造方法和声明成员方法一样,但也有区别(✒️构造方法的方法名和类名一模一样;✒️构造方法没有返回值类型)

下面是一个构造方法的例子:

public class Student {
    private String name;
    private int age;
    private double score;

    // (1) 没有返回类型
    // (2) 方法名和类名一致
    public Student(String stuName, int stuAge, double stuScore) {
        // 构造方法的方法体中一般给成员变量赋值
        name = stuName;
        age = stuAge;
        score = stuScore;
    }
}

📝 To create a new Student object called tom, a constructor is called by the new operator.
📝 要想创建一个名为 tom 的 Student 对象,可通过 new 运算符调用构造方法
new 运算符调用构造方法,创建 Student 对象:

Student zhn = new Student("张浩男", 12, 99.5); 

📝 new Student("张浩男", 12, 99.5): creates space in memory(内存空间) for the object and initializes its fields
📝 new Student("张浩男", 12, 99.5): 该代码在内存中为对象开辟了内存空间,并且初始化了成员变量的值

📝 Although Student only has one constructor, it could have others, including a no-argument constructor(无参构造方法):

    /**
     * Student 类的无参构造方法
     */
    public Student() {
        name = "庆医";
        age = 8;
        score = 100;
    }

📝 和成员方法一样,构造方法也是可以重载(Override)的:方法名和类名一致,参数列表各不相同

📝 Both constructors could have been declared in Student because they have different argument lists(参数列表). As with methods(与方法一样), the Java platform differentiates(区分) constructors on the basis of the number of arguments in the list and their types. You cannot write two constructors that have the same number and type of arguments for the same class, because the platform would not be able to tell(区分) them apart. Doing so causes a compile-time error.
📝 两个构造方法(有参构造方法和无参构造方法)都可在 Student 类中被声明,因为它们有不同的参数列表。与成员方法一样,Java 平台可通过参数数量和参数类型来区分构造方法。在同一个类中,你不能写两个拥有相同参数数量和参数类型的构造方法,因为 Java 平台无法区分。写两个拥有相同参数数量和参数类型的构造方法将会导致编译时错误。

💡 You don’t have to provide any constructors for your class, but you must be careful when doing this. The compiler(编译器) automatically provides a no-argument, default constructor(默认构造方法) for any class without constructors. This default constructor will call the no-argument constructor of the superclass(超类). In this situation, the compiler will complain(抱怨、埋怨、发恼骚) if the superclass(超类) doesn’t have a no-argument constructor so you must verify(验证) that it does. If your class has no explicit(明确的、显式的) superclass, then it has an implicit (隐式的、含蓄的)superclass of Object, which does have a no-argument constructor.
💡 你并不是必须得給你的类提供一个构造方法(你可以不同你的类提供任何构造方法)。若不给类提供任何构造方法的话,你必须当心一点。编译器会自动提供一个无参的默认构造方法,这个默认的无参构造方法是提供给那些没有任何构造方法的类的。这个默认的无参构造方法将会调用超类的无参构造方法,所以必须确保超类拥有无参构造方法,否则编译器会发恼骚(报错的)😡。如果你的类没有明确的超类,你的类会有一个隐式的超类(Object),Object 类是所有类的超类(是 Java 平台提供的),Object 类百分百拥有一个无参构造方法。

💚 You can use access modifiers(访问修饰符) in a constructor’s declaration to control which other classes can call the constructor.
💚 你可以在声明构造方法的使用使用访问修饰符(public、protected、private),用以控制哪些其他类可以调用这个构造方法。

💜 If another class cannot call a Student constructor, it cannot directly(直接地) create Student objects.
💜 如果其他类不能调用 Student 类的构造方法,其他类就无法直接地创建 Student 对象。

(2) 构造方法概念

🍀 构造方法:也叫构造器,用于更方便地创建一个对象
🍀 方法名必须和类名一模一样
🍀 没有返回值类型
🍀 可以重载(方法名一样,方法签名不一样)

构造方法案例:

public class Handsome {
    private int age;
    private double weight;

    public Handsome() {

    }

    public Handsome(int age) {
        this.age = age;
    }

    public Handsome(int age, double weight) {
        this.age = age;
        this.weight = weight;
    }
}

使用构造方法创建 Handsome 对象:

    // 可通过3种构造方法创建 Handsome 对象
    Handsome hs1 = new Handsome();
    Handsome hs2 = new Handsome(17);
    Handsome hs3 = new Handsome(17, 123.5);

(3) this 的本质 ☆☆☆☆☆

🍀 this:指向当前对象的引用

this 的用途:
🍀 ① 访问当前类中定义的成员变量
🍀 ② 调用当前类中定义的方法(包括构造方法)

public class Computer {
    private String brand;
    private double price;

    public Computer(String brand) {
        // this 作用:调用当前类中定义的方法(包括构造方法)
        this(brand, 0.0);
    }

    public Computer(String brand, double price) {
        // this 作用:访问当前类中定义的成员变量
        this.brand = brand;
        this.price = price;
    }
}

🍀 在类中直接写成员变量、直接调用成员方法,默认都是访问和调用当前对象的

public class Cat {
    public int age;

    public void eat() {
        // 等价于:System.out.println(this.age + "eat()");
        System.out.println(age + "eat()");
    }

    public void run() {
        // 等价于:this.eat();
        eat();
    }
}

💙 this 的本质是一个隐藏的、位置最靠前的方法参数。(面向对象的语言的 this 都是这样的)

🌱 只能在构造方法中用 this 调用其他构造方法
🌱 如果在构造方法 A 中调用了其他构造方法,调用构造方法的语句必须是构造方法 A 中的第一条语句

image.png

🌼 默认构造方法(Default Constructor):如果一个类没有自定义构造方法,编译器会自动为它提供无参数的默认构造方法
🌼 一旦自定义了构造方法,默认构造方法就不再存在

三、对象创建流程分析

public class Person {
    private int age = 17;
    private String name;

    public Person(String name, int age) {
        this.age = age;
        this.name = name;
    } 
}
    Person zhn = new Person("张浩男", 18);

对象创建流程:
🥤 ① 方法区加载一次类信息
🥤 ② 在堆中分配对象的内存空间
🥤 ③ 完成对象属性初始化(属性默认初始化;显示初始化;构造器初始化)
🥤 ④ 对象在堆中的内存地址赋值给 zhn(zhn 指向对象在堆中的地址)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/77578.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1.Spring简介

1.概念 Spring是一个免费开源框架,为了简化企业级项目开发,提供全面的开发部署解决方案。 2.体系结构 Data Access/Integeration是Spring对数据持久层的支持,SpringDataJpa就是其中的一种。Web是Spring对表现层处理的支持,Spir…

Springboot多环境开发

文章目录一. 前言二. 单文件版多环境配置三. 多文件版多环境配置四. 多环境开发配置技巧五. 多环境配置分组管理一. 前言 在日常开发中我们使用的环境可能会不一样,比如开发环境,测试环境,生产环境,那么这些环境对应的配置也会不…

【计算机视觉】数据获取、数据标注、数据增强的概念简介

觉得有帮助麻烦点赞关注收藏~~~ 基于深度学习的视频分析算法是依赖于数据训练的,数据是深度学习的主要原料,对于算法性能的提升是非常重要的。本章将重点介绍数据的获取、标注、增强及处理方法。 一、数据获取 训练数据的来源主要包括网上公开数据库和…

Redis实现短信登录

文章目录一、基于Session实现登录二、基于Redis实现共享Session实现登录一、基于Session实现登录 ---------------------------------------------------Controller PostMapping("code") public Result sendCode(RequestParam("phone") String phone, Http…

JavaScript进阶教程——面向对象、原型对象、this关键字、bind appl call方法

文章目录面向对象ES2015的面向对象语法:ES5的面向对象语法:原型对象原型链Object对象的原型this关键字**指向调用方法的对象:****构造函数:**触发事件指向全局对象:箭头函数总结bind appl call方法call的用法参数apply…

【计算机图形学入门】笔记4:变换(模型、视图、投影)

目录04变换(模型、视图、投影)1.使用齐次坐标表示的三维变换2.view/Camera 视图变换3.Projection 投影变换1.Orthographic projection 正交投影2.Perspective projection 透视投影 ——更适合人眼成像(近大远小,鸽子为什么这么大&…

AlphaControls 读取存贮数据VCL OnChange事件的处理

AlphaControls 读取存贮数据VCL OnChange事件的处理 AlphaControls控件,窗口时显示,对于VCL控件的处理,需要通过调用皮肤模板重新画出来。因此,在窗口的显示过程中,对VCL控件的数据装载(变更&#x…

从获评毕马威中国领先地产科技50强 看贝壳的长期主义

11月9日,在上海进博会现场,毕马威发布了2022年度(第二届)“毕马威中国领先地产科技企业50”报告,并正式发布了年度毕马威中国领先地产科技企业50榜及地产科技新锐企业榜。作为国内居住产业数字服务平台的贝壳上榜。 众…

前辈给的 Spring Cloud 与 Docker 微服务实战,挽救了要被辞退的我

前言 还记得那天天气阴冷,整个人心都是拔凉拔凉的;原因是因为领导找我聊了一下,委婉地说觉得我的技术不太行,能力不突出;要么自己做出改变,要么选择离开。 说实话,我是有点难过的,…

Lambda完整学习指南

什么是Lambda表达式 Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。Lambda表达式还增强了集合库。 Java La…

大学生HTML作业篮球网页 HTML作业篮球网页期末作业 HTML+CSS篮球网页 HTML学生作业体育篮球网页

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

ARS系列毫米波雷达技术一览

近年来,自动驾驶成为了当下最热门的话题。随着自动驾驶技术的发展,作为其关键传感器之一的毫米波雷达,也得到了广泛关注。但就目前来看,海外巨头公司主导着全球毫米波雷达产业的发展,其中,大陆ARS540更以九…

吊打面试官,聊聊:Java中String对象的大小?(史上最全)

下面是一个常见的Java 面试题: 聊聊:Java中String对象的大小? 首先,看看空String占用的空间 当前内存大小是在默认开启压缩指针的条件下 对象头 12char[]数组引用 4int 类型 hash数据大小 4loss due to the next object alignm…

MacOS好用的系统清理工具CleanMyMac有哪些特点功能?

怎么样为Mac选择一款专业靠谱的清理工具?需要满足那些功能呢?对于大多数的新手用户可能并不知道如何来清理Mac系统,当然也不知道在众多清理工具中如何选择。选择一款清理工具最重要的是它的性能如何,能不能有效的帮助用户清理系统…

[附源码]JAVA毕业设计小说阅读网站(系统+LW)

[附源码]JAVA毕业设计小说阅读网站(系统LW) 项目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术&…

听说你还不了解二叉树?赶紧进来轻松解决

✨个人主页: Yohifo 🎉所属专栏: 数据结构 | C语言 🎊每篇一句: 图片来源 Only by self-respect will you compel others to respect you. 只有自尊才能迫使他人尊敬你。 文章目录📘前言📘正文…

java的vo实体类字段和返回前端接收的字段大小写不一致

java的vo实体类字段和返回前端接收的字段不一致 后台的vo字段和前端接收到的出现大小写一直的情况 例如: 后台字段 /** a_lwa */private String aLwa;前端实际接收到的 这是由于使用lombok插件导致的 解决办法 实体类添加注解强制绑定 /** a_lwa */JsonProperty("aLwa&…

【JavaWeb开发-Servlet】day07-学生成绩管理系统-实现登录注册功能

目录 一、登录功能 1、实现登录页面 ①新建一张登录表:login ②插入一条测试数据 ③新建一个login.jsp登录界面 ④此表的实体Teacher类: ⑤ 然后在写一个dao方法,需要根据用户名查询登录表中的用户信息 ⑥业务层中我们直接调用dao层方法 ⑦在…

【负荷预测】基于灰色理论负荷预测的应用研究(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

南京邮电大学编译原理实验一(词法分析器的构造)

文章目录一、 实验目的和要求二、实验环境(实验设备)三、实验原理及内容(一)设计概要1、C语言子集2、单词及编码3、状态转换图(二)实现分析(三)结果分析四、实验小结(包括问题和解决方法、心得体…