【JavaSE】类和对象(下)(访问限定符 包的概念 导入包中的类 自定义包 包的访问权限控制举例 常见的包 实例内部类 静态内部类 局部内部类 对象的打印)

news2025/1/15 21:04:37

文章目录

  • 六、 封装
    • 6.1 封装的概念
    • 6.2 访问限定符
    • 6.3 封装扩展之包
      • 6.3.1 包的概念
      • 6.3.2 导入包中的类
      • 6.3.3 自定义包
      • 6.3.4 包的访问权限控制举例
      • 6.3.5 常见的包
  • 七、内部类
    • 7.1 内部类
      • 7.1.1 实例内部类
      • 7.1.2 静态内部类
    • 7.2 局部内部类
    • 7.3 匿名内部类
  • 八、对象的打印


六、 封装

6.1 封装的概念

  • 封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行 交互。

面向对象程序三大特性:封装、继承、多态。
封装简单来说就是套壳屏蔽细节。比如说你的手机、电脑,你见到的只是一个精致的东西,它已经被封装好了,地下的电路板等等你都看不到,对内部的细节进行封装,对外提供了接口,这就是一个简单的封装,要实现封装,要修改一定的权限,权限由访问修饰限定符进行修改。

6.2 访问限定符

访问修饰限定符:privatedefaultprotectedpublic

default是默认的,用的最多的是public

public:公开的,谁都可以看得到。
default: 对于同一个包中不是什么秘密,对于其他来说就是隐私。
private:私有的,只有自己知道,别人不知道。

6.3 封装扩展之包

6.3.1 包的概念

为了更好的管理类,把多个类收集在一起称为一组,称为软件包,类似于目录,将相似的东西放在一个文件夹,也可更加细致的分类。
包是对类、接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式,比如:一个包中的类不想被其他包中的类使用。包还有一个重要的作用:在同一个工程中允许存在相同名称的类,只要处不同的包中即可

包:
在这里插入图片描述

6.3.2 导入包中的类

使用 java.util.Date 导入 java.util 这个包中的 Date类。

在这里插入图片描述

public class Test {
    public static void main(String[] args) {
        java.util.Date date = new java.util.Date();
// 得到一个毫秒级别的时间戳
        System.out.println(date.getTime());
    }
}

更好的方法:使用 import语句导入包.

import java.util.Date;
public class Test {
    public static void main(String[] args) {
        Date date = new Date();
// 得到一个毫秒级别的时间戳
        System.out.println(date.getTime());
    }
}

如果需要使用 java.util 中的其他类, 可以使用 import java.util.*

import java.util.*;
public class Test {
    public static void main(String[] args) {
        Date date = new Date();
// 得到一个毫秒级别的时间戳
        System.out.println(date.getTime());
    }
}

6.3.3 自定义包

如何建文件夹?
在这里插入图片描述

在这里插入图片描述

6.3.4 包的访问权限控制举例

在这里插入图片描述
在这里插入图片描述
同一个包底下,不同的类可以访问,Test和Test2是两个不同的类,但是可以访问。
例如下面,不是一个包的,所以不可以访问,
在这里插入图片描述
不同包之间不能访问。但是可以实例化。

6.3.5 常见的包

    1. java.lang:系统常用基础类(StringObject),此包从JDK1.1后 自动导入。
    1. java.lang.reflect:java 反射编程包;
    1. java.net:进行网络编程开发包。
    1. java.sql:进行数据库开发的支持包。
    1. java.util:是java提供的工具程序包。(集合类等) 非常重要
    1. java.io:I/O编程开发包。

七、内部类

7.1 内部类

内部类:

  • 1.实例内部类
  • 2.静态内部类
  • 3.局部内部类
  • 4.匿名内部类

当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么整个内部的完整结构最好使用内部类。在 Java 中,**可以将一个类定义在另一个类或者一个方法的内部,前者称为内部类,后者称为外部类。**内部类也是封装的一种体现。

public class OutClass {
class InnerClass{
}
}
// OutClass是外部类
// InnerClass是内部类
  • 定义在class 类名{}花括号外部的,即使是在一个文件里,都不能称为内部类。
  • 内部类和外部类共用同一个java源文件,但是经过编译之后,内部类会形成单独的字节码文件。

7.1.1 实例内部类

class OuterClass {
    public int date1;
    int date2;
    public static int date3;

    public void test() {
        System.out.println("OuterClass::test()");
    }

    //实例内部类`在这里插入代码片`
    class InnerClass {
        public int date4;
        int date5;

        //public static int date6;error
        public void func() {
            System.out.println("InnerClass::func()");
        }
    }
}

如何获取实例内部类的对象?

    public static void main(String[] args) {
        OuterClass outerClass = new OuterClass();
        OuterClass.InnerClass innerClass = outerClass.new InnerClass();
    }

注意:实例内部类当中不能有静态的成员变量。

    //实例内部类
    class InnerClass {
        public int date4;
        int date5;
        //public static int date6;error
        public void func() {
            System.out.println("InnerClass::func()");
        }
    }

它被调用的时候是要通过外部类对象的引用,有了外部类对象以后才能调用它,但是static是类的成员,类加载的时候它就会被执行。所以实例内部类当中不能有静态的成员变量。实例内部类比较特殊,写成下面的写法就可以了,

    //实例内部类
    class InnerClass {
        public int date4;
        int date5;

        public static final int date6 = 10;
        public void func() {
            System.out.println("InnerClass::func()");
        }
    }

不报错的原因是加了final后,值相当于一个常量,常量就是在编译的时候确定date6就是10。final是用来定义常量的,常量是在程序编译的时候确定的,一旦初始化就不能再进行修改了。

class OuterClass {
    public int date1 = 1;
    int date2 = 2;
    public static int date3 = 3;

    public void test() {
        System.out.println("OuterClass::test()");
    }

    //实例内部类
    class InnerClass {
        public int date4 = 4;
        int date5 = 5;

        public static final int date6 = 6;
        public void func() {
            System.out.println("InnerClass::func()");
            System.out.println(date1);
            System.out.println(date2);
            System.out.println(date3);
            System.out.println(date4);
            System.out.println(date5);
            System.out.println(date6);
        }
    }
}
public class Test {
    public static void main(String[] args) {
        OuterClass outerClass = new OuterClass();
        OuterClass.InnerClass innerClass = outerClass.new InnerClass();
        innerClass.func();
    }
}

如果class InnerClass内也有date1,就近原则,打印的是class InnerClass内的date1。如果一定要在实例内部类当中访问外部类中和内部类相同的成员变量,可以这样写:
第一种:

OuterClass outerClass = new OuterClass();
System.out.println(outerClass.date1);

第二种:

System.out.println(OuterClass.this.date1);

注意

  1. 外部类中的任何成员都可以在实例内部类方法中直接访问。
  2. 实例内部类所处的位置与外部类成员位置相同,因此也受public、private等访问限定符的约束。
  3. 在实例内部类方法中访问同名的成员时,优先访问自己的,如果要访问外部类同名的成员,必须:外部类名称.this.同名成员 来访问。
  4. 实例内部类对象必须在先有外部类对象前提下才能创建。
  5. 实例内部类的非静态方法中包含了一个指向外部类对象的引用。
  6. 外部类中,不能直接访问实例内部类中的成员,如果要访问必须先要创建内部类的对象。

7.1.2 静态内部类

class OuterClass2{
    public int data1 = 1;
    int data2 = 2;
    public static int data3 = 3;

    public void test(){
        System.out.println("out::test()");
    }
    static class InnerClass2{
        public int data4 = 4;
        int data5 = 5;
        public static int data6 = 6;
        public void func(){
            System.out.println("out::func()");
        }
    }
}

如何获取静态内部类对象?

OuterClass2.InnerClass2 innerClass2 = new OuterClass2.InnerClass2();

在这里插入图片描述
静态内部类当中,不能访问外部类的非静态成员。外部类的非静态成员,需要通过外部类对象的引用才能访问。如果非要访问,如下:

OuterClass2 outerClass = new OuterClass2();
System.out.println(outerClass.data1);

注意

  1. 在静态内部类中只能访问外部类中的静态成员。
  2. 创建静态内部类对象时,不需要先创建外部类对象。

7.2 局部内部类

  • 局部内部类:定义在方法体内部。
  • 不能被public、static等访问限定符修饰。
  • 只能在该方法体内部使用,其他位置都不能用。
  • 编译器也有自己独立的字节码文件,命名格式:外部类名字$数字内部类名字.class。
public class Main {
    public void func(){
        //局部内部类:
        class Inner{
            public void test(){
                System.out.println("11111");
            }
        }
        Inner inner = new Inner();
        inner.test();
    }
    public static void main(String[] args) {
    }
}

7.3 匿名内部类

class Person{
    public int age;
    public String name;
}
public class Test2 {
    public static void main(String[] args) {
        Person person = new Person();
        System.out.println(person.age);
        System.out.println(person.name);
        new Person();
        System.out.println(new Person().age);//匿名对象
        System.out.println(new Person().name);//匿名对象 只能用一次
       //匿名内部类
        new Person(){
        };
    }

后续在抽象接口再细细总结。

八、对象的打印

在这里插入图片描述
在这里插入图片描述
自动生成toString,方便我们打印。

class Person{
    public int age;
    public String name;

    @Override
    public String toString() {
        return "Person{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

public class Test2 {
    public static void main(String[] args) {
        Person person = new Person();
        System.out.println(person);
    }

在这里插入图片描述
也可以自己写:

    @Override
    public String toString() {
        return "姓名:"+ name +"年龄:"+age;
    }
}

在这里插入图片描述
@Override叫做注解,帮我们检查,我们写的对不对,充当的是一个检查的角色。Java当中注解有很多,我们慢慢学。

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

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

相关文章

人工智能-线性回归2--房价预测、欠拟合过拟合、正则化、模型保存加载

7,案例:波士顿房价预测 回归性能评估MSE from sklearn.datasets import load_boston from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression,SGDRegressor from sklearn.meyrics import mean_squa…

详解PHP解决swoole守护进程Redis假死 ,mysql断线重连问题

详解PHP解决swoole守护进程Redis假死 ,mysql断线重连问题最近公司有个项目,要举办一个线上活动,我这边负责提供接口记录用户访问记录,与操作记录,由于活动参与人数可能比较多,为了不影响正常业务运行&#…

安全性归约(游戏)

文章目录基于游戏的安全性定义归约中的概率关系某事件发生某事件不发生互斥事件基于游戏的安全性定义 在将攻击 Γ\GammaΓ 的算法 A′AA′ 归约到攻击 Π\PiΠ 的算法 AAA 时, 让 A′AA′ 根据 ChΓCh_\GammaChΓ​ 提供的信息,为 AAA 模拟出同分布的 …

股票自动下单接口够接入多种股票数据源吗?

很多的股票交易接口在原先只能接入行情的CTP程序,那么股票自动下单接口现在可以通过openctp提供的CTPAPI,可以接入到多种多样的股票数据源!但是目前由于大多的股票交易接口是受到监管限制的就很难接入实盘,那么股票自动下单接口通…

知心世界姐王瑞平:谷传民与大衣哥朱之文是沟通问题不是人品问题

大衣哥和谷传民的官司走到现在,互联网上面也出现了两大阵营对垒,一方面是大衣哥的粉丝,旗帜鲜明地支持自己的偶像,另一大阵营的人,则一心一意支持谷传民。虽然每个阵营都有自己的道理,但是毕竟都太过极端&a…

Virtual Data Augmentation: 虚拟数据扩增技术

听说过数据扩增(Data Augmentation),也听说过虚拟对抗训练(Virtual Adversarial Traning),但是我没想到会有人将其结合,谓之虚拟数据扩增(Virtual Data Augmentation)。这…

CANoe诊断测试

诊断协议那些事儿 本文为诊断协议那些事儿专栏文章,当我们在开发工程中越来越多的需要使用到总线测试工具,其中包括BUSMASTER、周立功、PCAN、CANOE等,本文将使用德国Vector公司的CANoe介绍诊断测试的基本环境。 文章目录诊断协议那些事儿一…

Python编程从入门到实践 第五章:if语句 练习答案记录

Python编程从入门到实践 第五章:if语句 练习答案记录 练习题导航Python编程从入门到实践 第五章:if语句 练习答案记录5.1 一个简单示例5.2 条件测试5.2.1 检查是否相等5.2.2 检查是否相等时忽略大小写5.2.3 检查是否不相等5.2.4 数值比较5.2.5 检查多个文…

运行yolov5 v6遇到的问题

1. Arial.ttf无法在运行时下载的问题 可以选择用浏览器下载,然后拷贝到docker或者ubuntu下,创建服务器的http访问方式。 具体为: 1.1 下载文件 Arial.ttf 并拷贝到docker或者ubuntu下 1.2 在ubuntu下创建http访问方式: # 安装…

有限元仿真分析误差来源之边界条件,约束和point mass

导读:前不久,我在这里分享了一篇《有限元仿真分析误差来源之材料参数设置,小心为妙》的文章,引发了同行们的关注和讨论。在此感谢仿真秀平台讲师们的批评和指正,一起认真交流技术和进步。今天我将继续带来关于边界条件…

spring data jpa在mysql分页中的实例(一次访问同时获取数据和总数)

一、原生sql语句 mysql中语句如下 select SQL_CALC_FOUND_ROWS sn,max(count) as active_count from sn_state_changed where sn_year zz group by sn limit 0,10; select FOUND_ROWS() as total; 解释: SQL_CALC_FOUND_ROWS 供后面的查询总数sql语句使…

(STM32)从零开始的RT-Thread之旅--SPI驱动ST7735(1)

上一篇: (STM32)从零开始的RT-Thread之旅--GPIO 我使用的开发板是WeAct的H743板子,板子带一个0.96的SPI驱动的LCD,给的有现成的测试用例,看源码应该是ST的工程师写的ST7735的驱动,打算把这个驱动直接拿到RTT工程里面使…

SolidWorks 入门笔记01:草图绘制

全文目录简介1. 草图的创建1.1 在基准面上新建一个二维草图多学一招:退出草图绘制模式,快捷键切换视图1.2 从已有的草图派生新的草图。1.3 在零件的平面上绘制草图多学一招:SolidWorks 中鼠标滚轮放大缩小功能反的解决办法 。2. 基本图形绘制…

【2022秋线上作业-第5次-第11-13周】判断题

1-1 一棵有124个结点的完全二叉树,其叶结点个数是确定的。T 解析: 一棵124个叶节点的完全二叉树,假设n0为叶子节点数,n1为度为1结点数,n2为度为2结点数,则有总结点数为n0n1n2;而n2n0-1123&#…

如何杜绝 spark history server ui 的未授权访问?

如何杜绝 spark history server ui 的未授权访问? 1 问题背景 默认状况下,Spark history Sever ui 是没有任何访问控制机制的,任何用户只要知道 shs 对应的 url,就可以访问链接查看 spark 作业的运行状况。 在证券基金银行等金融行业中&a…

Kotlin 开发Android app(六):Kotlin 中的空判断 问号和感叹号

如果有人对程序的崩溃原因做下统计的话,那么由于对象为空,但是又访问了对象的某个属性而导致的崩溃,也许会是程序崩溃的第一大原因了。 比如我们在使用字符串的时候,变量字符串为空的时候,我们去访问了这个字符串变量的…

2022-11-16 每日打卡:单调栈解决最大矩形问题(一维直方图,二维最大红矩形)

每日打卡:单调栈解决最大矩形问题(一维直方图,二维最大红矩形) 柱状图中最大的矩形 思路 这个题最明显的思路就是:矩形面积底高。 版本1:底的长度可以通过二重循环来完成,高通过循环来寻找最…

44、Spring AMQP 数据转换器

1、操作案例 2、发送一个对象到队列中 3、控制台查看 4、使用消息转换器 5、消费者接收消息, 传递什么类型,就接受什么类型,发送方与接收方所使用的消息转换器必须对应 6、总结分析 默认的消息推送是通过JDK序列化的方式进行的,…

【STM32+cubemx】0029 HAL库开发:HMC5883L磁力计的应用(电子指南针)

今天我们来学习电子磁力计HMC5883L的使用。先介绍磁力计的基础知识,再给一个获取磁力计数据的例子,最后讲解HMC5883L磁力计的校准,以及一些使用中的经验。 1)HMC5883L磁力计的基础知识 磁力计是用来测量磁场强弱(也就…

Android 录音没有声音,设置AudioSource.VOICE_CALL直接MediaRecorder.start异常等系列问题

一、我的需求:来电后,我的三方应用主动开启录音,挂断后结束录音,查验音频 我遇到的问题:录制的音频没有声音。 通过各种尝试,结果如下 :设置不同的录音来源的效果 MediaRecorder API\创建MediaR…