Java类和对象(2)

news2024/11/26 13:37:47

🐵本文继续讲解类和对象相关知识


一、封装

封装就是将对象的属性和实现方法隐藏起来,外部无法获得具体的实现细节,只对外公开接口和对象进行交互,将对象的属性隐藏起来的办法就是用关键字private,被private修饰的成员变量或成员方法只能在当前类中使用

class Student {
    private String name; //被private修饰
    public int age;
    
    //设置姓名
    public void setName(String name) {
        this.name = name;
    }

    //获取姓名
    public String getName() {
        return this.name;
    }
}
public class Test {
    public static void main(String[] args) {
        Student student = new Student();
        student.age = 12; //age是被public修饰的所以可以访问
        //student.name = "Sans"; //这样写编译会报错
        student.setName("Sans"); //只能使用公开的方法来设置学生对象的姓名
    }
}

二、访问限定修饰符

访问限定修饰符包括public、private、protected三种,当它们修饰成员变量和成员方法时会限定对成员变量和成员方法的访问

访问范围publicprivate没有修饰符protected

同一包中的同一类

✔️✔️✔️✔️
同一包中的不同类✔️✔️✔️
不同包中的子类✔️✔️
不同包中的非子类✔️

上面的表格中【不同包中的子类】【不同包中的非子类】【protected】今后会讲,接下来先对包的概念进行讲解

三、包

在Java中有许多类,为了更好的管理这些类就有了包,包在底层就是一个文件夹,文件夹中存在着Java提供给我们的类,同时我们也可以自定义一个包:

包名一般是域名逆置,比如我们可以这样写包名:com.test.www,这样写就会产生com、test、www这三个包,在src的路径下也能看到这三个文件夹,假如在www这个包里创建一个类,在第一行就会通过package关键字显示这个类所在的包的路径:

package com.test.www;

public class Test1 {
}

如果我们没有自己创建包而是在src里直接新建了一个类,在第一行并没有显示包的路径,此时这个类在默认的包中;而当在一个包中创建其它包的类的对象时,则需要进行导包,要用到import关键字

package test1;
import com.test.www.Test1; //导包

public class Num {
    public static void main(String[] args) {
        Test1 test1 = new Test1(); //在test1包中创建刚刚在www包中创建的Test1类的对象
    }
}

之前在使用Scanner从键盘输入数据时也需要导包

import java.util.Scanner; //导包

public class Scan {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
    }
}

注意:import无法导入默认包中的类

四、static成员

4.1 static修饰成员变量

被static修饰的成员变量叫做静态成员变量,静态成员变量不属于任何对象,它是所有对象的共同属性

public class Num {
    public static int a = 10;
    public static void main(String[] args) {
        Num num1 = new Num();
        Num num2 = new Num();
        
        System.out.println(num1.a); //10
        System.out.println(num2.a); //10
    }
}

正如刚刚说的,静态成员变量不属于任何对象,所以上述代码的num1.a是不合理的(这样写并不会报错)建议以【类名.】的形式来访问静态成员变量

System.out.println(Num.a);

4.2 static修饰成员方法

被static修饰的成员方法叫做静态成员方法,静态方法也不属于任何对象,它是类的方法;静态方法一般用来访问静态成员变量

class Test {
    private static int a = 10; //a同时被private和static修饰
    public static int getA() {
        return a;
    }
}
public class Num {
    public static void main(String[] args) {
        Test test = new Test();
        System.out.println(Test.getA());
    }
}

1.在静态方法中不能直接访问非静态成员变量,如果要访问可以创建该成员变量所在类的实例化对象,通过对象来访问成员变量

2. 静态方法中不能有this引用,所以在静态方法内部不能调用非静态方法,因为非静态方法的第一个参数就是this引用

五、代码块

“{}”“{}”包含的一段代码组成代码块,在Java中代码块有普通代码块实例代码块静态代码块

5.1 普通代码块

普通代码块定义在方法内,其使用场景很少

public static void main(String[] args) {
    {
        int x = 0;
    }
    int x = 1; //上一个x是定义在普通代码块的局部变量,其作用域只限定在普通代码块内,因此再定义一个x也不会报错
    System.out.println(x); //1
}

5.2 构造代码块

构造代码块(也叫实例代码块)定义在类内、方法外,其一般是用来初始化成员变量的,构造代码块在实例化对象时就会被执行

public class Code {
    public int x;
    public int y;
    {
        this.x = 1;
        this.y = 2;
    }
    public static void main(String[] args) {
       Code code = new Code(); //这条语句执行完后,其对象的x和y就被初始化了
    }
}

5.3 静态代码块

被static修饰的代码块称为静态代码块,静态代码块定义在类内、方法外,一般用来初始化静态成员变量

public class Code {
    public static int x;
    public int y;
    static {
        x = 1; //这里不能使用this引用,因为静态成员变量不属于任何对象
    }
    public static void main(String[] args) {
       Code code = new Code();
    }
}

1. 静态成员变量是属于类的,因此在类被加载时就会被执行,比main方法执行顺序还要高

2. 由于一个类只会被加载一次,所以不管实例化了多少对象静态代码块都只会执行一次

5.4 静态代码块,构造代码块,构造方法的执行顺序

public class Code {
    
    {
        System.out.println("构造代码块");
    }

    static {
        System.out.println("静态代码块");
    }

    public Code() {
        System.out.println("构造方法");
    }
    
    public static void main(String[] args) {
       Code code = new Code();
    }
}

静态代码块在类加载时执行,因此最先执行,构造代码块始终优先于构造方法


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

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

相关文章

安科瑞电力监控系统在浙中总部经济中心的设计与应用

安科瑞 崔丽洁 摘要:电力供应是整个社会生产、人民生活的基本保证之一,也是全世界普遍的能源形式,而且多数资源都被人类运用各种方式转换为电能而加以利用,经济的高速运行也使各领域的用电负荷急速上升,各种疏漏和故障…

刷题学习记录BUUCTF

[极客大挑战 2019]RCE ME1 进入环境直接就有代码 <?php error_reporting(0); if(isset($_GET[code])){$code$_GET[code];if(strlen($code)>40){die("This is too Long.");}if(preg_match("/[A-Za-z0-9]/",$code)){die("NO.");}eval($co…

社区街道治安智慧监管方案,AI算法赋能城市基层精细化治理

一、背景需求分析 随着城市建设进程的加快&#xff0c;城市的管理也面临越来越多的挑战。例如&#xff0c;在城市街道的管理场景中&#xff0c;机动车与非机动车违停现象频发、摊贩占道经营影响交通、街道垃圾堆积影响市容市貌等等&#xff0c;都成为社区和街道的管理难点。这…

中波发射机概述

一、简介 1.1 中波发射机简介 中波发射机是一种用于广播电台传输中波频率信号的设备。它们是广播电台系统的重要组成部分&#xff0c;用于发送声音、音乐和其他信息到广泛的地理区域。中波频率范围一般介于530kHz至1700kHz之间&#xff0c;具有较好的传播性能&#xff0c;可以…

Sentinel网关限流

背景 在微服务架构下&#xff0c;每个服务的性能都不同&#xff0c;为避免出现流量洪峰将服务冲垮&#xff0c;需要依赖限流工具来保护服务的稳定性。sentinel是阿里提供的限流工具&#xff0c;社区活跃&#xff0c;功能也很全面&#xff0c;包含实时监控、流控、熔断等功能。…

数据结构-链表的简单操作代码实现【Java版】

目录 0.链表前序工作 1.构建出一个链表 2.展示链表中的所有存储数据 3.查找关键字key是否在链表中 4.求链表的长度 5.头插法 6.尾插法 7.插入任意位置&#xff08;规定第一个元素位置为0下标&#xff09; 8.删除第一次出现的值为key的关键字 9.删除所有值为key的关键字…

阿里巴巴将开源720亿参数大模型;开源语言大模型演进史

&#x1f989; AI新闻 &#x1f680; 阿里巴巴将开源720亿参数大模型 摘要&#xff1a;在2023世界互联网大会乌镇峰会上&#xff0c;阿里巴巴集团CEO吴泳铭透露&#xff0c;阿里巴巴即将开源720亿参数大模型&#xff0c;这将是国内参数规模最大的开源大模型。目前&#xff0c…

【启扬方案】启扬安卓屏一体机在医疗自助服务终端上的应用解决方案

为了解决传统医疗模式下的“看病难、看病慢”等问题&#xff0c;提高医疗品质、效率与效益&#xff0c;自助服务业务的推广成为智慧医疗领域实现信息化建设、高效运作的重要环节。 医疗自助服务终端是智慧医疗应用场景中最常见的智能设备之一&#xff0c;它通过与医院信息化系统…

计算机网络篇 | 走进计算机网络

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 计算机网络 ✨特色专栏&#xff1a; M…

TensorFlow2.0教程3-CNN

` 文章目录 基础CNN网络读取数据卷积层池化层全连接层模型配置模型训练CNN变体网络简单的深度网络添加了其它功能层的深度卷积NIN网络文本卷积基础CNN网络 读取数据 import numpy as np import tensorflow as tf import tensorflow.keras as keras import tensorflow.keras.la…

11月7日 mybatis缓存

mybatis的缓存 缓存的条件&#xff1a;必须要有存在的数据 一级缓存: SqlSession级别缓存.存储的数据.只能在同一个SalSession有效.默认开启 二级缓存: SqlSessionFactory级别的缓存. SqlSessionFactory只有一个的,单例,全局共享的,不同的 SqlSession共享&#xff0c;默认没有…

宏集案例 | eX707G人机界面在石油钻井工程中的应用

来源&#xff1a;宏集科技 宏集案例 | eX707G人机界面在石油钻井工程中的应用 01 应用背景 石油钻井工程是石油开采过程中最为关键的一个环节&#xff0c;直接决定着石油开采的质量和经济效益&#xff0c;而钻井工程参数的实时监测、分析处理和存储是保证安全、可靠、高效钻…

利用百度地图api获取经纬度和uniapp定位计算距离

获取百度地图api&#xff0c;成为开发者&#xff0c;去控制台创建应用得到一个ak就可以了 百度地图开放平台网址&#xff1a;百度地图开放平台 | 百度地图API SDK | 地图开发 后端是node // 根据百度api地址获取经纬度 https://lbsyun.baidu.com/async getLocation(val) {try …

基于SSM的博客系统

基于SSM的博客系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringMyBatisSpringMVC工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 热点 博客详情 登录界面 管理员界面 博主界面 摘要 博客系统作为信息传播和分享的重…

Linux系统编程——文件的光标移动

光标移动(lseek) 主要用于不断对文件写入数据或读取数据的的用法&#xff0c;每次写入数据后光标在数据尾&#xff0c;若要进行读取则只会没法读取到光标前的数据&#xff0c;这个时候就不需要重启文件&#xff0c;只需对光标位置做出调整就可以读取数据 使用lseek函数需要包…

抢抓泛娱乐社交出海新风口!Flat Ads深圳沙龙活动引爆海外市场

随着全球化进程的加速&#xff0c;中国的应用类APP不断走向国际市场。作为产品和服务的提供者&#xff0c;中国开发者围绕社交泛娱乐创新&#xff0c;开启直播出海、短视频出海、游戏社交出海、1V1 视频出海、音频社交出海等出海热潮。“社交、泛娱乐”融合成为行业主流发展趋势…

Three.js 实现简单的PCD加载器(可从本地读取pcd文件)【附完整代码】

1 功能实现 初始会显示我们之前 SfM 做出的点云&#xff0c;包括相机位置可以点击右上角加载你本地的PCD文件可以通过选择多个文件加载多个点云并显示在同一场景中可以通过左上角的控制界面查看/调整点云的属性&#xff0c;如点大小、颜色等可以通过右上角的控制界面选择旋转 …

Android T 实现简易的 USB Mode Select 需求

Android T 实现 USB Mode Select 需求 一、实现效果 二、主要实现思路 在手机连接 USB 发生/取消通知的同时&#xff0c;控制弹窗 Dialog 的显示/消失。 三、主要代码实现 连接 USB 发送/取消的主要实现是在 UsbDeviceManager.java 类中。类路径如下&#xff1a; system/f…

公司批量寄件教程

公司批量寄快递如何实现&#xff1f;相信不少企业行政人员、财务人员等都有类似的困扰。 很简单&#xff0c;随着经济和快递行业的发展&#xff0c;因公寄件在企业中已经是件常事了&#xff0c;其中不乏有批量寄件的时候。比如说财务批量寄递发票、行政批量寄递节日慰问品、业…

工作利器!熟悉这几款数据流图工具,事半功倍!

数据流图工具在现代工作中起到了非常重要的作用。无论是在企业内部的流程优化&#xff0c;还是在软件开发、项目管理、系统设计等领域&#xff0c;数据流图工具都扮演着关键的角色。本文将为大家介绍8款高效的数据流图工具&#xff0c;帮助大家选择适合自己工作需求的工具。 1.…