【自学笔记】01Java基础-09Java关键字详解

news2024/7/4 23:13:44

介绍java(基于java11)中所有关键字,以及主要重要的关键字详解。

1 Java 11中的关键字:

1.1 类型声明与变量定义

  • boolean:声明布尔类型变量,只有两个可能值 true 或 false。
  • byte:声明一个8位有符号整数类型变量。
  • short:声明一个16位有符号整数类型变量。
  • int:声明一个32位有符号整数类型变量。
  • long:声明一个64位有符号整数类型变量。
  • float:声明一个单精度(32位)浮点数类型变量。
  • double:声明一个双精度(64位)浮点数类型变量。
  • char:声明一个16位Unicode字符类型变量。
  • void:表示方法不返回任何值。

1.2 访问权限修饰符

  • public:公共,修饰类,方法变量,允许任意对象访问。
  • protected:保护,修饰方法与变量,只允许同一包内,或该类子类(即使在别的包)的对象访问。
  • private:限制,修饰方法与变量,为当前类内部。
  • default:默认,修饰类,方法变量,没有以上任一访问修饰符时,默认为default权限,不用在声明时特地写出来

以上权限范围排序为

1.3 类、成员修饰符

  • static:静态,修饰方法或变量,会让方法或变量变成类级别,称为静态变量或类变量,可以直接类名访问,不需对象访问。

  • final:不可变,可以应用于类(不能被继承)、方法(不能被重写)或变量(一旦赋值不能更改)。

  • abstract:抽象,声明抽象类或抽象方法,抽象类不能实例化,抽象方法没有具体实现。

  • strictfp:不常见,严格浮点指令集,保证跨平台时浮点运算的一致性。

1.4 流程控制与异常处理

  • if:条件语句关键字,用于执行基于条件的选择性代码块。
  • else:与 if 配合使用,表示当条件不满足时执行的代码块。
  • switch:多分支选择结构关键字。
  • case:配合 switch 使用,标识每个分支的入口条件。
  • default:在 switch 结构中提供默认分支。
  • while:循环结构,重复执行一段代码直到给定条件不再满足。
  • dowhile:先执行循环体再检查循环条件的循环结构。
  • for:循环结构,通常用于已知循环次数的情况。
  • break:跳出当前循环或 switch 语句。
  • continue:结束当前迭代,继续下一次循环。
  • try:开始异常处理块,包含可能抛出异常的代码。
  • catch:捕获并处理在 try 块中抛出的异常。
  • finally:无论是否发生异常,都会被执行的代码块。
  • throw:显式抛出异常对象。
  • throws:声明方法可能会抛出的异常类型列表。

1.5 类、接口与包相关

  • class:声明类的关键字。
  • interface:声明接口的关键字,接口定义了一组方法签名和常量。
  • extends:类继承另一个类的关键字。
  • implements:类实现接口的关键字。
  • package:声明源文件所在的包名,用于组织代码和管理命名空间。
  • import:导入其他包中的类或全部类。

1.6 其他重要关键字

  • this:引用当前对象实例的引用关键字。
  • super:在子类中引用父类的方法或字段。
  • new:创建新对象实例的关键字。
  • instanceof:操作符,检查对象是否属于某个类或其子类。
  • synchronized:用于声明同步方法或同步代码块,以实现线程安全。
  • volatile:声明变量在并发环境下具有可见性和有序性。
  • transient:标记字段不会被序列化。
  • native:声明一个方法由非Java语言实现,通常用于JNI调用本地方法。
  • assert:断言关键字,用于测试布尔表达式的预期结果,主要用于开发阶段调试。

1.7 Java保留关键字但未使用的

  • goto:Java中保留但未使用的关键字,曾经在某些其他编程语言中有跳转功能。
  • const:同样是Java中预留的关键字,但目前并未赋予实际功能。

请注意,以上信息适用于Java 11及之前的大多数版本。


常用关键字详解

private关键字

private 属于访问权限修饰符(access modifier),用于控制类成员(变量和方法)的可见性及可访问范围。

  1. 定义

    • 当你在一个类中声明一个变量或方法时,如果使用了 private 关键字,那么这个成员就只能在这个类的内部被访问。
  2. 作用

    • 封装(Encapsulation):private 关键字是实现封装的基础,它隐藏了类的内部细节,确保外部代码不能直接访问或修改类的私有数据成员,从而提高了代码的安全性和稳定性。
    • 数据保护:通过将字段(成员变量)设为 private,限制对这些字段的直接访问,强制其他类通过公共的 getter 和 setter 方法来读取或修改它们,从而可以对数据进行验证、转换或其他必要操作。
  3. 访问权限

    • private 成员只能在其所在的类内被访问,这意味着同一类中的静态方法、实例方法、构造器都可以访问该类的 private 成员。
    • 同一包内的其他类、子类以及所有外部类都不能直接访问 private 成员。
    • 若需要提供对外部的访问途径,通常会创建公共的(public)getter和setter方法(对于字段)或者公共的方法(对于行为)。
  4. 示例

    public class MyClass {
        private String secretMessage; // 私有变量
    
        public MyClass(String message) { // 公共构造器
            this.secretMessage = message;
        }
    
        public String getSecretMessage() { // 公开getter方法
            return secretMessage;
        }
    
        private void changeSecretMessage(String newMessage) { // 私有方法
            this.secretMessage = newMessage;
        }
    }
    
    public class AnotherClass {
        public static void main(String[] args) {
            MyClass obj = new MyClass("Hello, World!");
            // 直接访问private变量会编译错误
            System.out.println(obj.secretMessage);
            // 但是可以通过公开的getter方法访问
            System.out.println(obj.getSecretMessage());
        }
    }
    
  5. 好处

    • 提高安全性:由于外部无法直接访问和修改对象的私有状态,因此可以防止意外的修改导致的数据不一致或破坏对象的状态。
    • 提高可维护性:通过封装,可以在不影响外部调用者的情况下修改类的内部实现。
    • 增强代码的可理解性:通过清晰地标识出哪些部分是内部实现细节,有助于提高代码的可读性和设计意图的表达。

static关键字

  1. 静态变量
  • static修饰变量 时,这个变量成为类级别的变量,称为静态变量或类变量。
    • 静态变量存储在 Java 方法区(PermGen 或 Metaspace),而不是堆内存中每个对象实例的数据区域。
    • 所有该类的实例共享同一个静态变量,也就是说,无论创建了多少个对象,都只有一个静态变量的副本。
    • 静态变量可以通过类名直接访问,无需创建类的实例。
public class MyClass {
    public static int count; // 静态变量

    public MyClass() {
        count++; // 不需要通过 this.count 访问
    }
}

// 直接通过类名访问和修改静态变量
MyClass.count = 0;
System.out.println(MyClass.count); // 输出:0
  1. 静态方法
  • static 修饰的方法被称为静态方法或类方法,它们不属于任何特定的对象实例,而属于类本身。
    • 静态方法可以直接通过类名调用,不需要先创建类的实例。
    • 在静态方法内部不能访问非静态变量或方法,除非通过一个已经创建的实例来引用它们。
public class MyClass {
    private static void printHello() {
        System.out.println("Hello from the static method!");
    }

    public static void main(String[] args) {
        MyClass.printHello(); // 直接通过类名调用静态方法
    }
}
  1. 静态代码块
  • 静态初始化块是一组在类加载时会被执行一次的语句,且在任何实例创建之前运行。
    • 通常用于初始化静态变量和静态方法
public class MyClass {
    public static String greeting;

    static { // 静态代码块
        greeting = "Hello, World!";
    }

    public static void main(String[] args) {
        System.out.println(MyClass.greeting); // 输出:"Hello, World!"
    }
}
  1. 好处
  • static 关键字的主要用途是提供一种机制,使某些成员能够在不依赖于类的具体实例的情况下被访问和使用。

  • 静态成员非常适合用来描述那些与类本身而非其对象实例有关的状态或行为,比如工具类中的实用方法、全局配置变量等。


abstract关键字

当编程中遇到暂不明确实现的类或方法时,可以声明为抽象类/方法,在之后以继承的方式实现

  1. 抽象类
  • 当一个类被声明为 abstract 时,它就成为了一个抽象类。
  • 抽象类不能被实例化,即不能通过 new 关键字创建其对象。
  • 抽象类可以包含抽象方法(必须使用 abstract 关键字声明)以及非抽象方法(有具体实现的方法)。
  • 抽象类的主要目的是作为其他类的基类,子类必须继承抽象类并实现其中的所有抽象方法,才能实例化子类。
public abstract class Animal {
    public abstract void makeSound(); // 抽象方法

    public void sleep() { // 非抽象方法,有具体实现
        System.out.println("Zzz...");
    }
}

public class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Woof!");
    }
}
  1. 抽象方法
  • 抽象方法没有具体的实现,只有方法签名(包括返回类型、方法名和参数列表)。
  • 在抽象类中声明的全部抽象方法,其子类必须提供相应的实现,除非子类也是抽象的。
  • 如果一个类包含了至少一个抽象方法,则该类必须声明为抽象类。
public abstract class Shape {
    public abstract double getArea(); // 抽象方法,计算形状的面积
}
  • 使用场景

  • 定义通用行为:抽象类可以定义一些通用的行为,而将特定的实现留给子类去完成。

  • 设计模板方法模式:在抽象类中定义算法骨架,具体的步骤由子类实现。

  • 强制接口契约:通过抽象类和抽象方法来强制子类遵循一定的接口规则或契约。


super关键字

super 关键字主要用于访问和调用父类(超类)的成员变量、方法和构造函数。

  • 访问父类成员变量
    当子类中定义了一个与父类同名的成员变量时,会默认就近使用子类的变量,为了区分并明确访问父类中的变量,可以使用 super 关键字。

    class Parent {
        private int value;
    }
    
    class Child extends Parent {
        private int value;
    
        public void showParentValue() {
            System.out.println(super.value); // 访问父类Parent的value变量
        }
    }
    
  • 调用父类的方法
    同样的,子类可以通过 super 关键字调用父类中非私有(private)的实例方法。

    class Parent {
        public void displayMessage() {
            System.out.println("Hello from Parent");
        }
    }
    
    class Child extends Parent {
        @Override
        public void displayMessage() {
            super.displayMessage(); // 调用父类Parent的displayMessage方法
            System.out.println("Hello from Child");
        }
    }
    
  • 调用父类的构造方法
    在子类构造器的初始化列表或构造器的第一行代码中,必须且只能使用 super() 来调用父类的一个构造方法。

    class Parent {
        public Parent(String name) {
            System.out.println("Parent constructor called with: " + name);
        }
    }
    
    class Child extends Parent {
        public Child(String childName) {
            super(childName); // 调用父类Parent的带有String参数的构造方法
            // 其他子类初始化代码...
        }
    }
    
  • 注意

  • super() 的调用必须是子类构造器的第一条语句,如果没有显示调用,则默认会有一个隐式的无参 super() 调用。

  • 不能在一个静态上下文中使用 super 关键字,因为静态方法并不属于任何特定对象,因此无法通过 super 访问非静态成员。

  • thissuper 不能同时出现在同一个构造函数的初始化列表中。


final关键字

  • final的作用

    • final 关键字是最终的意思,可以修饰(类、方法、变量)
    • 修饰类:表明该类是最终类,不能被继承。
    • 修饰方法:表明该方法是最终方法,不能被重写。
    • 修饰变量:表示该变量第一次赋值后,不能再次被赋值(有且仅能被赋值一次)。
  • final修饰变量的注意

    • final修饰的变量是基本类型:那么变量存储的数据值不能发生改变。
    • final修饰的变量是引用类型:那么变量存储的地址值不能发生改变,但是地址指向的对象内容是可以发生变化的。

举个例子:

public class Example {
    public static final List<String> list = new ArrayList<>();

    public static void main(String[] args) {
        // 正确:向final修饰的list添加元素,修改的是list对象的内容
        list.add("Element1");
        list.add("Element2");

        // 错误:试图将list指向另一个ArrayList实例
        list = new ArrayList<>();  // 这行代码会导致编译错误

        System.out.println(list);  // 输出:[Element1, Element2]
    }
}

final修饰的引用类型变量list一旦被初始化为一个ArrayList实例后,就不能再指向其他的ArrayList实例了。由于list仍然指向原来的ArrayList对象,所以可以自由地向其中修改元素。


后续继续更新。。。。。

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

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

相关文章

[UUCTF 2022 新生赛]ez_rce

[UUCTF 2022 新生赛]ez_rce wp 在做这道题时&#xff0c;我参考了这篇博客&#xff1a; https://www.cnblogs.com/bkofyZ/p/17594549.html 认识到了自己的一些不足。 题目代码如下&#xff1a; <?php ## 放弃把&#xff0c;小伙子&#xff0c;你真的不会RCE,何必在此纠…

实验笔记之——基于COLMAP的Instant-NGP与3D Gaussian Splatting的对比

之前博客进行了COLMAP在服务器下的测试 实验笔记之——Linux实现COLMAP-CSDN博客文章浏览阅读794次&#xff0c;点赞24次&#xff0c;收藏6次。学习笔记之——NeRF SLAM&#xff08;基于神经辐射场的SLAM&#xff09;-CSDN博客NeRF 所做的任务是 Novel View Synthesis&#xf…

静态网页设计——个人兴致小屋(HTML+CSS+JavaScript)

前言 使用技术&#xff1a;HTMLCSSJS 主要内容&#xff1a;对个人兴致的一些介绍&#xff0c;画风优美。 主要内容 1、首页 首页是一个优美的背景加一句欢迎来到xxx的兴致小屋&#xff0c;可将XXX改成自己。点击确定可以跳到主页。 部分代码&#xff1a; <body><…

接口自动化-allure测试报告

学习目标&#xff1a; 1、测试报告的作用 2、allure的安装 3、allure的基本使用 4、allure的高级使用 学习内容&#xff1a; 1、测试报告的作用 自动化接口的结果呈现虽然可以通过日志文件去查看用例的成功或者失败&#xff0c;但是这样的结果就是不美观&#xff0c;不能…

外包干了3个多月,技术退步明显。。。。。

先说一下自己的情况&#xff0c;本科生生&#xff0c;19年通过校招进入广州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测…

阿里云大模型「让照片跳舞」刷屏朋友圈,有哪些信息值得关注?

介绍 大家好&#xff0c;我分享聊聊阿里通义千问APP中全民舞王功能。 网络热舞结合AI视频&#xff0c;这是以后不用学习跳舞&#xff1f; 可以尝试下效果&#xff0c;一张图片生成视频。 APP快速使用 搜索下载通义千问APP 打开APP&#xff0c;选中一张照片来跳舞。 这里…

Halcon算子精讲:形态学操作(圆形操作)

膨胀操作&#xff08;圆形膨胀&#xff09; 算子 dilation_circle(Region, RegionDilation, 3.5) 原理 将区域中边界的每个像素点以3.5为半径做圆&#xff0c;原有区域 所做圆区域 膨胀后区域。 作用 扩大目标所在区域或连接区域破碎部分。 对比图 腐蚀操作&#xff08;圆…

陀螺研究院发布《中国产业区块链生态图谱 2024版》

从发展实践来看&#xff0c;产业区块链在我国已历经了4年的高速发展&#xff0c;发展至今&#xff0c;我国区块链发展环境基本夯实&#xff0c;形成了技术突破与应用拓宽的创新土壤&#xff0c;围绕区块链为主体的产业链条不断纵深延伸&#xff0c;在基础设施支撑、融合创新拓展…

外包干了5个月,技术明显退步了...

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入湖南某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年12月份&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测…

惊呆:RocketMQ顺序消息,是“4把锁”实现的(顺序消费)

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多关于RocketMQ 的、很重要的面试题&#xff1a; 如何保证RocketMQ消息有序&#xff1f; Ro…

一文详解 Java 限流接口实现

作者&#xff1a;非有 一、限流 1.1 为什么要进行限流&#xff1f; 1.瞬时流量过高&#xff0c;服务被压垮&#xff1f; 2.恶意用户高频光顾&#xff0c;导致服务器宕机&#xff1f; 3.消息消费过快&#xff0c;导致数据库压力过大&#xff0c;性能下降甚至崩溃&#xff1f…

图像分割实战-系列教程10:U2NET显著性检测实战2

&#x1f341;&#x1f341;&#x1f341;图像分割实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 U2NET显著性检测实战1 U2NET显著性检测实战2 U2NET显著性检测实战3 5、残差Unet模块 class RSU7(n…

【经验】VSCode连接远程服务器(可以使用git管理、方便查看和编辑Linux源码)

1、查看OpenSSH Windows10通常自带OpenSSH不需要安装。 Windows10下检查是否已经安装OpenSSH的方法: 1)按下快捷键Win + X,选择Windows PoweShell(管理员) 2)输入以下指令: Get-WindowsCapability -Online | ? Name -like ‘OpenSSH*’ 3)如果电脑未安装OpenSSH,…

全视通-医院智能视讯系统 病房视讯系统解决方案 智能医院对讲系统信息发布系统

医院智能视讯系统解决方案 1、行业背景 对于患者来说现阶段各大医院的住院部大都面临同样的问题&#xff0c;例如患者就医缺乏精准化医疗&#xff0c;缺乏对患者的心理健康引导&#xff0c;缺乏多维度沟通渠道&#xff0c;缺乏多元增值服务等。 对于传统医院住院部病房&am…

C# Attribute特性实战(1):Swtich判断优化

文章目录 前言简单Switch问题无参Swtich方法声明Swtich Attribute声明带有Swtich特性方法主方法结果 有参Switch修改代码修改运行过程运行结果 总结 前言 在经过前面两章内容的讲解&#xff0c;我们已经简单了解了如何使用特性和反射。我们这里解决一个简单的案例 C#高级语法 …

【Unity】如何在Unity中使用C#的NuGet 包资源

【背景】 Unity的脚本语言是C#&#xff0c;而C#有很多功能和能力可以通过nuget包提供。有没有办法把这些能力结合到Unity中一起使用呢&#xff1f;如果可以&#xff0c;那将大大扩展Unity中各类功能实现的便捷性。 【方法】 答案是&#xff1a;你可以&#xff01; 获取Nuge…

【数据库原理】(8)关系数据库的关系代数

关系数据语言可以分为三类: 关系代数、关系演算和介于关系代数与关系演算之间的语言 SQL。 下面专门讲述用对关系进行运算来表达查询要求的关系代数。关系代数的运算对象是关系&#xff0c;运算结果也是关系。关系代数用到的运算符包括四类:集合运算符、专门的关系运算符、算术…

Mac上安装 Node.js 的版本管理工具 n,以及 n 使用,的使用

安装 最近刚更换 Mac 本进行项目的开发&#xff0c;刚上手 Mac 本还不是很熟练&#xff0c;需要安装 Node.js 的包管理工具 在 Windows 上我是实用的 nvm 来管理的 Node 版本&#xff0c;但是我尝试下载 Nvm &#xff0c;发现下载安装后的 Nvm 无法使用&#xff0c;提示 “Th…

关于苹果iOS 16:揭开伪装成飞机模式的隐形蜂窝接入漏洞的动态情报

一、基本内容 在日常生活中&#xff0c;网络威胁不断演变&#xff0c;给个人和组织带来了一系列重大挑战。网络犯罪分子使用的一种最常见的、最具破坏性的方法之一就是网络钓鱼。这种攻击方式通过电子邮件、短信或其他通讯渠道冒充可信实体&#xff0c;诱使个人泄露敏感信息&am…

AI到底是啥?

什么是AI? AI&#xff0c;即人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;是一门研究如何让机器模拟人类智能的学科。它涉及到构建可以感知、推理、学习和决策的智能系统&#xff0c;以解决复杂问题和实现人类类似的任务。 AI的技术包括机器学习、自…