3.1.2 访问控制符及修饰符

news2024/9/24 21:28:19

文章目录

  • 1.访问控制符
  • 2.静态字段/方法/代码块
    • 2.1 静态字段
    • 2.2 静态常量
    • 2.3 静态方法
    • 2.4 特点
    • 2.5 static入门案例
    • 2.6 静态的调用关系
    • 2.7 静态代码块
      • 2.7.1 格式
      • 2.7.2 特性:
      • 2.7.3 执行顺序
      • 2.7.4 案例练习
  • 3.final的概念
    • 3.1 特点
    • 3.2 final入门案例


1.访问控制符

在JAVA中,我们通过访问控制符来控制所属类和方法的访问权限。

在这里插入图片描述

上图表明的不同访问控制符修饰的类或方法在不同位置的访问权限问题。其中默认代表不写任何修饰符情况下的权限。

2.静态字段/方法/代码块

在前面的一些程序中,大家可以发现,所有的main方法都包含static修饰符,其代表当前方法为静态方法,当前static修饰符也可以用在类的修饰中。

2.1 静态字段

如果将一个字段定义为static,每个类只有一个这样的字段。而对于非静态的实例字段,每个对象都有自己的一个副本。例如,假设需要给每个员工赋予唯一的标识码。

class YuanGong{
	private static int nextId = 1;
	private int id;
	}

例如上方的代码,这个类的所有实例将共享一个nextId字段,但创建的每一个YuanGong对象都有一个自己的id字段,如果有100个YuanGong对象,那么就有100个id字段会被创建,分别对应每一个对象。

但是只有一个静态字段nextId存在,即使没有YuanGong对象的存在,静态字段YuanGong也存在,其属于类,而不属于任何一个单个的对象。

2.2 静态常量

在日常开发中,静态变量使用是比较少的,我们更多的是使用静态常量。

如在后续的多线程问题案例中,多个售票窗口同时售卖同一类型的票,在创建对个窗口对象时,如果使用普通常量创建,会导致同时创建多个静态的票,原本一共只有100张票,创建对象后则会变成多个100张,此时我们便可以使用静态常量来创建,避免这个问题。

2.3 静态方法

静态方法是不在对象上执行的方法。例如前边实例中的main方法。

在以下俩种情况下,可以使用静态方法:

  1. 方法不需要访问对象状态,因为它需要的参数都是通过显示参数提供的。
  2. 方法只需要访问类的静态字段

同时需要注意,main方法不对任何对象进行操作,事实上,在启动程序时还没有任何对象创建。静态的main方法将执行并构建程序所需要的对象,构建对象所需要的参数,都是显示参数提供的。

2.4 特点

  1. static可以修饰成员变量与成员方法
  2. 被static修饰的资源称为静态资源,静态资源也叫做类资源
  3. 静态资源随着类的加载而加载,是最先加载的,优先于对象进行加载
  4. 静态资源可以通过类名直接调用,所以也被称作类资源
  5. 静态资源只要加载一次,就会一直存在,不再开辟新空间, 直到类消失才一起消失
  6. 静态资源被全局所有对象共享,全局唯一,值只有一份
  7. 静态只能调用静态,非静态可以随意调用
  8. static静态区域内不能和this或者super共用,因为有static时可能还没有对象

2.5 static入门案例

package partTwo;
/* 本类用于测试静态static关键字*/
public class TestStatic {
    public static void main(String[] args) {
        Fruit f = new Fruit();
        f.grow();
        f.clean(); //没有提示需要自己写
        System.out.println(f.weight);
        System.out.println(f.kind);  //没有提示需要自己写
        Fruit f2 = new Fruit();

        //我们可以通过类名直接调用静态资源,而且这个IDEA会提示
        Fruit.clean();
        System.out.println(Fruit.kind);
        /* 静态资源在内存中只有一份,被全局所有对象共享
         * 所以我们会发现,通过任意一种方式修改了静态变量的值以后,其他任何方式查看,都是修改后的值*/
        Fruit.kind = "苹果";
        System.out.println(Fruit.kind);
        f.kind = "香蕉";
        System.out.println(Fruit.kind);
        System.out.println(f.kind);
        System.out.println(f2.kind);
        f2.kind = "猕猴桃";
        System.out.println(Fruit.kind);
        System.out.println(f.kind);
        System.out.println(f2.kind);
    }
}
/* 0.被stati修饰的资源称作静态资源
 * 静态资源是随着类加载而加载到内存中的,比对象优先进入内存
 * 所以静态资源可以通过类名直接调用,即使没有创建对象,也可以调用*/
//1.创建一个水果类
class Fruit{
    /* 1.可以用static修饰属性吗  可以*/
    //2.定义属性
    static  String kind; //种类
    double weight; //重量

    //3.定义普通方法
    /* 2.可以用static修饰方法吗?  可以*/
    static public void clean(){
        System.out.println("洗洗更健康");
    }
    public void grow(){
        System.out.println("这个水果长的真大");
    }
}
  1. 没有提示需要自己写的部分为idea智能提醒,此处不是最高效的调用方式;
    静态资源可以通过类名直接调用,不需要创建对象后再调用;
  2. 静态资源在内存中只有一份,被全局所有对象共享
    所以我们会发现,通过任意一种方式修改了静态变量的值以后,其他任何方式查看,都是修改后的值

2.6 静态的调用关系

  1. 非静态资源可以调用静态资源也可以调用非静态资源;
  2. 静态资源只能调用静态资源
package partTwo;
/* 本类用于测试静态的调用关系*/
public class TestStatic2 {
    public static void main(String[] args) {
        Teacher2 t = new Teacher2();
        t.ready();
        System.out.println(t.name);
    }
}

//创建一个老师类
class Teacher2{
    //定义属性与方法
    String name;
    static int age;

    public void ready(){
        System.out.println("正在备课中。。。");
        /* 普通资源能否调用静态资源?   可以*/
        System.out.println(age);
        teach();
    }

    //定义静态方法
    public static void teach(){
        System.out.println("正在授课中");
        /* 静态资源能否调用普通资源?  不可以*/
        //System.out.println(name);
        //ready();
    }
    public static void eat(){
        System.out.println("干饭人...");
        /* 静态资源能否调用静态资源  可以*/
        System.out.println(age);
        teach();
    }
}

2.7 静态代码块

2.7.1 格式

static{  }

2.7.2 特性:

  1. 位置:类里方法外
  2. 执行时机:静态代码块也属于静态资源,随着类的加载而加载,优先于对象加载,并且只加载一次
  3. 作用:用于加载那些需要第一时间就加载,并且只需要加载一次的资源,常用量初始化

2.7.3 执行顺序

静态代码块 > 构造代码块 > 构造方法 > 普通方法 > 局部代码块

2.7.4 案例练习

package partTwo;
/* 本类用来测试静态代码块*/
public class TestStatic3 {
    public static void main(String[] args) {
        Person2 p = new Person2();
        p.play();
        Person p2 = new Person();

    }
}
// 1.创建Person类
class  Person2{
    //6.创建静态代码块
    static {
        /* 静态代码块stati
         * 位置:类里方法外
         * 执行时机:静态代码块也属于静态资源,随着类的加载而加载,优先于对象加载,并且只加载一次
         * 作用:用于加载那些需要第一时间就加载,并且只需要加载一次的资源,常用量初始化*/
        System.out.println("我是静态代码块");
    }
    //2.创建构造代码块
    {
        //位置:类里方法外
        //执行时机:创建对象时执行,优先构造方法执行
        //作用:用于提取所有构造方法的共性功能
        System.out.println("我是一个构造代码块");
    }
    //3.创建无参构造方式
    public Person2(){

    }
    //4.创建普通方法play
    public void play(){
        System.out.println("我爱玩代码");
        //5.创建局部代码块
        {
            //位置:方法里
            //执行时机:调用其所处的方法时执行
            //作用:用于控制变量的作用范围
            System.out.println("我是一个局部代码块");
        }
    }
}


结论:执行顺序:静态代码块 --> 构造代码块 --> 构造方法 --> 局部代码块

  1. 静态代码块:在类加载时就加载,并且只被加载一次,一般用于项目的初始化
  2. 构造代码块:在创建对象时会自动调用,每次创建对象都会被调用,提取构造共性
  3. 局部代码块:方法里的代码块,限制局部变量的范围

3.final的概念

  1. 是java提供的一个关键字
  2. final是最终的意思
  3. final可以修饰类,方法,字段(属性)
    初衷:java出现继承后,子类可以更改父类的功能,当父类功能不许子类改变时,可以利用final关键字修饰父类。

3.1 特点

  1. 被final修饰的类,不能被继承
  2. 被final修饰的方法,不能被重写
  3. 被final修饰的字段是个常量,值不能被修改
  4. 常量的定义形式:final 数据类型 常量名 = 值

3.2 final入门案例

package partTwo;
/* 本类用于测试final关键字*/
public class TestFinal {
    public static void main(String[] args) {
        Father f = new Father();
        f.work();
        Son s = new Son();
        s.work();
        System.out.println(s.a);
        // s.a = 100;  报错,不可以给被final修饰的变量a重新赋值
    }
}

/* 1.final可以用来修饰类吗?  可以
 *  被final 修饰的类是最终类,不可以被继承
 * 可以把final修饰的类看成树结构中的叶子节点*/
//1.定义父类
//3.测试类被final修饰
//final class Father{
class Father{
    /* 2.final可以用来修饰方法吗? 可以
     * 被final修饰的方法是这个方法最终的实现,不可以被重写*/
    //4. 测试方法被final修饰
    //public final void work(){
    public void work(){
        System.out.println("在工厂里上班");
    }
}

//2.定义子类
//class Son extends Father{  报错,不可以继承一个被final修饰的类
class Son extends Father{
    /* 3.final可以用来修饰变量吗?
     *  被final修饰的是常量,值不可以被修改
     * 注意:定义常量时必须要赋值,不赋值就报错*/
    final int a=10 ;

    //5.重写父类方法
    public void work(){
        System.out.println("在家玩游戏");
    }
}

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

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

相关文章

【HBase——陌陌海量存储案例】8. 基于Phoenix消息数据查询(下)

索引示例二:创建本地索引 需求 在程序中,我们可能会根据订单ID、订单状态、支付金额、支付方式、用户ID来查询订单。所以,我们需要在这些列上来查询订单。 针对这种场景,我们可以使用本地索引来提高查询效率。 创建本地索引 cre…

超全小程序开发的学习 知识点

第一章:邂逅小程序开发 01_小程序开发和各个平台小程序的介绍 小程序加载的时候是双线程模型.wxml文件和wxss文件是一个线程,js和json文件是一个线程。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mEP3PUoo-1675132790458…

七步让您的MySQL服务器更安全

本文将以最常见的数据库管理系统——MySQL为例,向您介绍如何通过7步骤来安全加固数据库服务器。 不知您是否发现一种现象,那些初学渗透测试的人员往往过于关注应用的安全性,而对数据库的安全性不太重视。他们殊不知,没有数据库的…

上海亚商投顾:兔年首日开门红 北向资金净流入超186亿

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。市场情绪两市早盘受外围影响大幅高开,随后指数高开低走,板块及个股相对活跃,汽车产业链&a…

视频图像分析处理流程(完整版)

来源:投稿 作者:LSC 编辑:学姐 一、视频分析处理的完整流程 (1)视频编解码的入门知识 尽管压缩工具五花八门,但是他们的目的都只有一个:都是为了减小文件的占用空间。 除去我们常见的.zip,.7z&#xff0…

MyBatis框架如何实现数据查询?有几种方法?

在实际开发中,查询操作通常都会涉及到单条数据的精确查询,以及多条数据的模糊查询。那么使用MyBatis框架是如何进行这两种查询的呢?接下来,本小节将讲解下如何使用MyBatis框架根据客户编号查询客户信息,以及根据客户名…

【前沿技术】在安全且可靠的区块链基础设施中运行业务条线应用

发表时间:2022年4月27日 信息来源:coingeek.com 了解特定企业的业务需求将使你能够构建出一个可扩容的业务条线应用,它将按照你想要的方式进行运作,并在不可篡改的BSV区块链中保存相关记录。 大多数企业都有一个业务条线&#xf…

《吐血整理》保姆级系列教程-玩转Fiddler抓包教程(1)-HTTP和HTTPS基础知识

1.简介 有的小伙伴或者童鞋们可能会好奇地问,不是讲解和分享抓包工具了怎么这里开始讲解HTTP和HTTPS协议了。这是因为你对HTTP协议越了解,你就能越掌握Fiddler的使用方法,反过来你越使用Fiddler,就越能帮助你了解HTTP协议。 Fid…

HashMap原理分析

HashMap原理分析JDK7 HashMap1、模型介绍2、底层实现原理3、描述一下put的过程4、HashMap扩容机制:5、HashMap中的循环链表是如何产生的6、HashMap和HashTable的区别7、HashMap为什么用红黑树而不用B树?JDK8 HashMapJDK7 HashMap 1、模型介绍 HashMap在…

18. time和calendar模块

当代码中需要使用到时间时,我们通常会使用time模块来获取当前时间或者时间戳。 时间戳:从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。 1. 时间戳 获取当前时间戳: import timeprint(time…

Springboot+vue预约上门维修服务系统

前端技术:nodejsvueelementui一般是采用前后端分离模式, 后端支持python/php/java/nodejs MTV模式 M:model,模型,负责与数据库交互 V:view,视图是核心,负责接收请求、获取数据、返回结果 T:template&…

并发编程学习(八):ReentrantLock特性、哲学家吃饭问题

ReentrantLock 是java.util.concurrent.locks包下的类。相对于synchronized,它具备如下特性:可中断。可以设置超时时间。可以设置公平锁。支持多个条件变量。即可以有个多个waitset等待队列。与synchronized都支持可重入。ReentrantLock的基本语法:// 获…

c++11 标准模板(STL)(std::multiset)(二)

定义于头文件 <set>template< class Key, class Compare std::less<Key>, class Allocator std::allocator<Key> > class multiset;(1)namespace pmr { template <class Key, class Compare std::less<Key>> using…

Day12【元宇宙的实践构想01】—— 元宇宙概念和发展历程

&#x1f483;&#x1f3fc; 本人简介&#xff1a;男 &#x1f476;&#x1f3fc; 年龄&#xff1a;18 ✍每日一句&#xff1a;【道固远&#xff0c;笃行可至&#xff1b;事虽巨&#xff0c;坚为必成】 &#x1f6a9; 今日留言&#xff1a;亮亮被迫去练科目二啦&#xff0c;定时…

K8S架构熟悉及日常操作

目录 一、架构介绍 二、组件介绍 三、调度介绍 四、CLI指令介绍 五、常见CLI指令 六、常见问题排查思路 一、架构介绍 Kubernetes系统架构为客户端/服务端&#xff08;C/S&#xff09;架构&#xff0c;Master作为服务端&#xff0c;Node作为客户端。 Master服务端也被称…

学习逆向安全的必备基础: 汇编的初步了解

什么是汇编 汇编语言是一种低级编程语言&#xff0c;它使用简单的助记符来表示计算机底层的机器指令。 汇编语言是直接与计算机硬件交互的&#xff0c;它能够控制计算机中的每一个细节。 由于汇编语言非常低级&#xff0c;所以编写汇编程序通常比较困难。不过&#xff0c;汇…

微信怎样开发小程序【公司企业小程序开发】

现在很多公司企业都有自己的小程序&#xff0c;没有小程序的公司企业也会寻找开发小程序的途径。那么今天就给大家简单介绍微信怎样开发小程序&#xff0c;希望对需要开发小程序的公司企业有帮助。 一、注册小程序账号 有一个小程序账号是必须的&#xff0c;小程序账号可以在…

那些外贸老鸟们都在认真使用的8个实用小工具

在我们日常的外贸工作中&#xff0c;有很多地方都可以用到一些实用外贸小工具去提高工作效率&#xff0c;突破局部限制。是否能够灵活的应用这些实用外贸小工具&#xff0c;是一位成熟优秀外贸业务员的衡量标准之一。第一个&#xff1a;知识信息整理和CRMhttps://www.notion.so…

Linux(六)基础I/O

引言 C语言进阶 文件管理 上一篇文章详细回顾了C语言方面关于文件操作的一些库函数&#xff0c;比如输入输出重定向fscanf、fprintf&#xff0c;对于文件内容以字符形式读取的fgetc、fputc&#xff0c;对于文件内容以字符串形式读取的fgets、fputs&#xff0c;对于二进制文件的…

ieee会议论文从手稿到发表

0. 前言 在创新点得到认可之后就可以准备发论文了&#xff0c;这个一定要早点&#xff0c;可以给自己设置一个明确的deadline&#xff0c;毕竟ddl是第一生产力。 1. 确定发什么期刊、会议 一定要符合学校的毕业要求&#xff0c;有一些水的学校并不认。时间看能不能赶上学校毕…