首页 > 编程语言 >轻松理解Java中的public、private、static和final

轻松理解Java中的public、private、static和final

时间:2023-07-20 19:00:38浏览次数:27  
标签:Java 变量 静态 成员 private static 方法 final

一、概念
1、public和private
两个都是访问权限修饰符,用于控制外界对类内部成员的访问。

  • public:表明对象成员是完全共有的,外界可以随意访问。用public修饰的数据成员、成员函数是对所有用户开放的,所有用户都可以直接进行调用。
  • private:表明对象成员是完全私有的,不容许外界的任何访问。private表示私有,私有的意思就是除了class自己之外,任何人都不可以直接使用,包括子类。

2、static:static是控制类成员变化的修饰符之一。
 static:静态成员修饰符,其修饰的静态变量脱离具体对象独立存在,在内存中之后一份拷贝,所有的对象都公用这一个存储空间,所以对static修饰的静态变量进行的修改对该类的所有对象都起作用。static修饰的静态函数代表所有对象的统一操作,只能调用静态变量。static是针对面向对象中的“多态”而提出来的,static修饰的静态成员不存在多态性。
 static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。怎么理解这句话?记住java是一个面向对象的语言,万事万物皆对象,无论你做什么都需要创建一个对象,然后再调用这个对象的方法,所以java中压根就没有所谓的“全局变量”,但是没有这个概念,不代表你不可以实现这个功能,java存在的目的就是让人们使用它去达到人们想要的效果,所以static value就可以达到全局变量的作用。
 进一步解释一下。用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明这个类的对象时,不会生成static变量的副本,而是类的所有实例共享同一个static变量。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。

3、final:final也是控制类成员变化的修饰符。
 final:final用来修饰方法和属性表示特殊的意义。修饰方法时表示方法不能被重写;修饰属性时表示属性不能被改变,这里属性又分为对象和基本类型,修饰基本类型表示基本类型赋值以后不能再被赋值,修饰对象表示这个属性不能再指向其他对象(引用不变),但是他指向的这个对象本身还是可以被改变的。
 使用final关键字可以声明类、成员变量和成员方法,一经声明,便不可继承、不可修改和不能覆盖。还有,final方法不能被子类覆盖。编译器在调用final方法时会转入内嵌机制(直接将方法主体插入到调用处),大大提高执行效率(50%左右)。API类中的许多方法,如Object类中的getClass方法为final方法。同时,final还不能用于修饰构造方法。

特殊情况:

        class Base {
                private final void method() {
                        System.out.println(“In Base…”);
                }
        }
        class Sub extends Base {
                public void method() {
                        System.out.println(“In Sub…”);
                }
       }

大家看上边的代码,虽然父类和子类中都有method这个方法,但是不算是重写,因为基类中的method方法的访问修饰符是private,就表示这个方法是私有的,对子类是不可见的,所以子类中的method方法其实是一个全新的方法,不是对基类方法的重写,仅仅是同名罢了。

4、静态变量和实例变量的区别
 对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。
 对于实例变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。
所以一般在需要实现以下两个功能时使用静态变量:

  • 在对象之间共享值时
  • 方便访问变量时

5、静态方法

  • 静态方法可以直接通过类名调用,任何的实例也都可以调用静态方法。静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。因为实例成员与特定的对象关联!就是java面向对象的思想,实例是你这个类本身的属性,你会用这个本身的属性去做一些事情,而这些事情不是固定的,不能像静态方法一样一成不变。

  • 由于static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。静态方法是类内部的一类特殊方法,只有在需要时才将对应的方法声明成静态的,一个类内部的方法一般都是非静态的。

  • 有时你希望定义一个类成员,使它的使用完全独立于该类的任何对象。通常情况下,类成员必须通过它的类的对象访问,但是可以创建这样一个成员,它能够被它自己使用,而不必引用特定的实例。在成员的声明前面加上关键字static(静态的)就能创建这样的成员。如果一个成员被声明为static,它就能够在它的类的任何对象创建之前被访问,而不必引用任何对象。你可以将方法和变量都声明为static。static 成员的最常见的例子是main( ) 。因为在程序开始执行时必须调用main() ,所以它被声明为static。

  • 声明为static的方法有以下几条限制:

    • 它们仅能调用其他的static 方法。
    • 它们只能访问static数据。
    • 它们不能以任何方式引用this 或super

标签:Java,变量,静态,成员,private,static,方法,final
From: https://www.cnblogs.com/ACAI-cc/p/17569388.html

相关文章

  • JavaScript
    JavaScript简称js一个完整的JavaScript实现是由以下3个不同部分组成。1、核心(ECMAscript)——基础语法2、文档对象模型(DOM)Documentobjectmodel(整合js,css,html)3、浏览器对象模型(BOM)Broswerobjectmodel(整合js和浏览器)简单来说,ECMscript描述了JavaScript语言本身的相关内容......
  • poi导出excel加水印,单元格可修改 java 下载生成Excel文件添加水印
    poi导出excel加水印,单元格可修改java下载生成Excel文件添加水印原文链接:https://blog.csdn.net/weixin_40077255/article/details/112848376目录poi导出excel加水印,单元格可修改(只支持XSSFWorkbook)引入的jar包:操作水印的工具类:最终效果 小提示poi导出excel加水印......
  • CODOTA:你需要的JAVA编程AI助手
    最近使用了Codota,令我印象深刻。Codota的目标是让开发更简单、更快。Codota能在后台运行,以便节约时间。1什么是CodotaCodota会学习我们如何在编程,然后反过来帮助我们更好的编程。它会使用AI和机器学习技术来给工作中的人提供与正在写的代码相关的建议。2用Codota编码如果说Codot......
  • C# RSA2 SHA256 对应JAVA(SHA256withRSA)
     //用于高德调用商家,数据已经替换敏感数据,所以运行会验证失败//请拿实际参数代入privatestaticStringgetSignContent(Dictionary<String,String>paramMap){StringBuildercontent=newStringBuilder();List<String>keys=newList<string>(paramMap.Keys);//......
  • 前端(JavaScript)
    JavaScript一个完整的JavaScript实现是由以下3个不同部分组成的:核心(ECMAScript) ------------>基础语法---------->必须要会的文档对象模型(DOM)Documentobjectmodel(整合js,css,html)  ---------->重要浏览器对象模型(BOM)Broswerobjectmodel(整合js和浏览器)-------......
  • JAVA面试之SpringMVC
    一、工作流程流程 1、用户发送请求至前端控制器DispatcherServlet 2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。 3、处理器映射器找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。 4、DispatcherServlet调用Han......
  • io.reactivex.rxjava3:rxjava
    如何使用io.reactivex.rxjava3:rxjava概述在本文中,我将向您介绍如何使用io.reactivex.rxjava3:rxjava。rxjava是一个流行的响应式编程库,它提供了丰富的操作符和工具,用于简化异步操作和事件处理。以下是我们将要讨论的步骤概览:步骤动作代码示例1添加依赖implementa......
  • idea给java程序创建test目录
    在Java程序中创建test目录的方法在Java开发中,我们经常需要编写测试代码来验证我们的程序的正确性。为了更好地组织测试代码,我们可以创建一个独立的test目录来存放所有的测试代码。为什么要创建test目录?创建test目录有以下几个好处:更好的组织结构:将测试代码与正式代码分离,使项......
  • int类型范围java
    Java实现int类型范围流程为了实现int类型范围,我们需要以下几个步骤:步骤描述1定义一个int类型变量2给变量赋最大值3给变量赋最小值4打印变量的值接下来,我们将通过代码来展示每个步骤的具体实现。代码实现步骤1:定义一个int类型变量在开始实现之前,......
  • idea中java jxl程序包导入
    导入JavaJXL程序包的步骤为了在IDEA中导入JavaJXL程序包,你可以按照以下步骤进行操作。这些步骤将指导你如何在你的项目中添加所需的依赖,并确保你可以成功使用JavaJXL库进行开发。步骤概览下表列出了完成整个过程所需的步骤:步骤描述1创建一个新的Java项目2打开......