面向对象——权限修饰符、匿名内部类

news2024/11/8 4:32:15

package关键字

为什么要有包?
将字节码(.class)进行分类存放
包其实就是文件夹

包的定义及注意事项

定义包的格式
package 包名
多级包用.分割,如package com.heima里面的.就是分隔符

定义包的注意事项

  1. package语句必须是程序的第一条可执行的代码
  2. package语句在一个Java文件中只能有一个
  3. 如果没有package默认表示无包名

cmd如何编译运行带包的类

  1. javac编译的时候带上-d即可,例如javac -d.HelloWorld.java
  2. 通过java命令执行,java 包名.HelloWorld
    不同包下类之间的访问

import关键字

为什么会有import?
其实就是让有包的类对调用者可见,不用写全类名了

导包格式:

  • import包名
  • 这种方式导入是到类的名称,最后可以写*通配符但是不建议
    package语句子啊java文件中第一个
    import在中间
    class在package和import下面

没有导包前每次访问其他类都需要写包名
在这里插入图片描述
导包后不用在写包名
在这里插入图片描述
*通配符
在这里插入图片描述

权限修饰符

结论:
在这里插入图片描述
protected
在这里插入图片描述

面向对象—类及其组成所使用的常见修饰符

修饰符

  • 权限修饰符:private,默认的(default),protected,public
  • 状态修饰符:static,final
  • 抽象修饰符:abstract

  • 权限修饰符:默认的(default),public(用的最多)
  • 状态修饰符:final
  • 抽象修饰符:abstract

成员变量

  • 权限修饰符:private(用的最多),默认的,protected,public
  • 状态修饰符:static,final

构造方法

  • 权限修饰符:private,默认的,protected,public(用的最多)

成员方法

  • 权限修饰符:private,默认的,protected,public(用的最多)
  • 状态修饰符:static,final
  • 抽象修饰符:abstract

组合规则

  • 成员变量:public static final(接口成员变量)
  • 成员方法:
    1、public static;
    2、public final;
    3、public abstract

内部类概述和访问特点

内部类概述:被定义为在另一个类中声明的类
内部类的访问特点:1、内部类可以直接访问外部类的成员,包括私有;2、外部类访问内部类成员必须向创建类,格式为:外部类名.内部类名 对象名 = 外部类对象.内部类对象

练习代码

public class InnerClass {
    public static void main(String[] agrs) {
        //创建内部类对象,外部类访问内部类的成员必须创建对象,格式为:外部类名.内部类名 对象名 = 外部类对象.内部类对象
        out.inner oi = new out().new inner();
        oi.print();
    }
}

class out {
    private int num = 15;

    class inner {
        public void print() {
            System.out.println(num);//内部类直接访问外部类成员变量,包括私有
        }
    }
}

输出结果:在这里插入图片描述

成员内部类的私有使用

练习代码

public class InnerClass {
    public static void main(String[] agrs) {
        //创建内部类对象,外部类访问内部类的成员必须创建对象,格式为:外部类名.内部类名 对象名 = 外部类对象.内部类对象
        //out.inner oi = new out().new inner();
        //oi.print();无法访问私有的方法
        
        //实例化out类,然后访问类中的方法
        out o = new out();
        o.print();
    }
}
class out {
    private int num = 15;

    class inner {
        private void print() {
            System.out.println(num);//内部类直接访问外部类成员变量,包括私有
        }
    }

    //在本类创建一个public公用方法来访问本类的private方法
    public void print() {
        out.inner oi = new out().new inner();
        oi.print();
    }
}

运行结果
在这里插入图片描述

静态成员内部类

访问静态内部类的格式:外部类名.内部类名 对象名 = 外部类名.内部类对象

练习代码

public class StaticClass {
    public static void main(String[] agrs) {
        //访问静态内部类的格式:外部类名.内部类名 对象名 = 外部类名.内部类对象
        Outer.Inner OI = new Outer.Inner();
        OI.methed();

//访问静态内部类中静态方法
        Outer.Inner1.methed1();
    }
}

class Outer {
    static class Inner { //静态内部类
        public void methed() {
            System.out.println("静态内部类的输出");
        }
    }

    static class Inner1 {
        public static void methed1() {
            System.out.println("静态内部类+静态方法的输出");
        }
    }
}

内部类之所以能获取到外部类的成员,是因为他能获取到外部类的引用,外部类名.this

局部内部类访问局部变量

局部内部类访问局部变量必须用final修饰
原因:因为当调用这个方法时,局部变量如果没有final修饰,他的生命周期和方法的生命周期一样,当方法弹栈,局部变量消失,如果局部内部类对象还没有马上消失,想用这个变量就没有了,如果用final修饰会在类加载的时候进入常量池,即使方法弹栈,常量池的常量还在也可以继续使用,但是jdk1.8取消了这个规则,感觉是bug
练习代码

package com.Demo08;

public class Demo08_InnerTest {
    public static void main(String[] agrs) {
        Outerr o = new Outerr();
        o.Outmethed();
    }
}

class Outerr {
    public void Outmethed() {
        final int n = 20;//局部内部类访问局部变量必须用final修饰
        class inner {
            public void Innermethed() {
                System.out.println("hello");
                System.out.println(n);
            }
        }
        inner i = new inner();
        i.Innermethed();
    }
}

运行结果
在这里插入图片描述

匿名内部类的格式和理解

匿名内部类就是内部类的简化写法
前提:存在一个类或者接口,这里的类可以是具体类也可以是抽象类
格式:new 类名或者接口名(){重写方法}
本质上是一个继承了该类或者实现了该接口的子类匿名对象

练习代码

package com.Demo08;

public class Demo08_nonameclass {
    public static void main(String[] agrs) {
        name name = new name();
        name.mehted();

    }
}

interface inter {
    public void print();
}

class name {
    class name1 implements inter { //有名字的内部类

        public void print() {
            System.out.println("有名字的内部类");
        }
    }

    public void mehted() {
        name1 n = new name1();
        n.print();

        //inter的子对象 new inter是实现inter
        new name1().print();
        new inter() {                            //实现了inter接口
            public void print() {                //重写了抽象方法
                System.out.println("匿名内部类");
            }
        }.print();//后面的print相当于执行方法
    }
}

运行结果
在这里插入图片描述

匿名内部类重写多个方法调用

匿名内部类只针对重写一个方法时候使用
匿名内部类不能向下转型
练习代码

public class Demo08_nonameclass {
    public static void main(String[] agrs) {
        name name = new name();
        name.mehted();
    }
}

interface inter {
    public void print1();
    public void print2();
}

class name {
    class name1 implements inter { //有名字的内部类
        public void print1() {
            System.out.println("有名字的内部类1");
        }

        public void print2() {
            System.out.println("有名字的内部类2");
        }
    }

    public void mehted() {
        name1 n = new name1();
        n.print1();
        n.print2();

        //inter的子对象 new inter是实现inter
        // new name1().print1();
        inter i = new inter() {                     //实现了inter接口
            public void print1() {                //重写了抽象方法1
                System.out.println("匿名内部类1");
            }

            public void print2() {                //重写了抽象方法2
                System.out.println("匿名内部类2");
            }
        };//.print();//后面的print相当于执行方法
        i.print1();
        i.print2();
    }
}

运行结果
在这里插入图片描述

匿名内部类在开发中的应用

练习代码

public class NoNameClassTest {
    public static void main(String[] agrs) {
        persondemo pd = new persondemo();
        pd.method(new student() {  //匿名内部类当作参数传递(本质把匿名内部类看作一个对象)
            public void show() {
                System.out.println("匿名内部类在开发中的应用 1");
            }
        });
    }
}

abstract class person {
    public abstract void show();
}

class persondemo {
    public void method(person p) { //person p = new student();
        p.show();
    }
}

class student extends person {
    public void show() {
        System.out.println("匿名内部类在开发中的应用");
    }
}

运行结果
在这里插入图片描述

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

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

相关文章

扩容系统盘【centos-root】

问题描述: 磁盘空间有42G,但是系统盘只有6G。 问题抛出:(P2原本只有7G,其中有30G错误分配到nvmeOn1p2了)p2的30G空间怎么合理分配给系统盘? (执行: sudo growpart /dev/nvme0n1 …

[学习笔记] [机器学习] 7. 集成学习(Bagging、随机森林、Boosting、GBDT)

视频链接数据集下载地址:无需下载 1. 集成学习算法简介 学习目标: 了解什么是集成学习知道机器学习中的两个核心任务了解集成学习中的 Boosting 和 Bagging 1.1 什么是集成学习 集成学习通过建立几个模型来解决单一预测问题。它的工作原理是生成多个分…

【P53】JMeter 断言结果(Assertion Results)

文章目录 一、断言结果(Assertion Results)参数说明二、准备工作三、测试计划设计 一、断言结果(Assertion Results)参数说明 可以查看断言的成功和失败数 使用场景:一般在调试测试计划期间用来查看断言的成功和失败…

水库大坝的安全监测内容包括哪些?

在水库大坝的实时监测中,主要任务是通过无线传感网络监测各个监测点的水位、水压、渗流、流量、扬压力等数据,并在计算机上用数据模式或图形模式进行实时反映,以掌握整个水库大坝的各项变化情况。大坝安全监测系统能实现全天候远程自动监测&a…

本地项目托管到 Gitee

本地项目托管到 Gitee 1、创建远程仓库2、Git Bash Here第一步:初始化本地仓库 git init第二步:建立链接git remote add origin xxx第三步:将远程仓库中的文件推送至本地仓库中git pull --rebase origin master第四步:将本地项目放…

Paddle与AFFormer环境配置

本次重新记录一下paddle的安装过程,主要是因为在进行服务器环境初始化时没有进行正确的环境安装。 基础环境 云硬盘部署 conda安装 Anaconda安装 首先是下载相关包命令: sudo wget https://repo.anaconda.com/archive/Anaconda3-2020.02-Linux-x86_64.…

7.面向对象编程(基础部分)|Java学习笔记

文章目录 类与对象类与对象的关系类和对象的区别和联系对象在内存中的存在形式类和对象的内存分配机制 成员方法方法的调用机制原理 成员方法传参机制基本数据类型的传参机制引用数据类型的传参机制成员方法返回类型是引用类型应用实例 方法递归调用递归重要规则汉诺塔和八皇后…

有哪些内外网都能传输文件的工具-镭速

随着互联网的快速普及,不同地区的人们之间进行了更为频繁的交流与合作。对于企业和组织而言,文件的共享和传输也变得越来越重要,特别是在不同的地理位置之间。此时,一个既可在内网使用,又能在外网实现高速传输的工具就…

企业直播MR虚拟直播实例(混合现实直播)

MR虚拟直播带来的内容、体验和互动的升级,对多个行业、场景具有重大意义,尤其是在汽车、科技、带货、活动等对视觉呈现要求更高的行业和场景中,将会重塑用户的观看体验,​高效赋能企业业务增长​。随着用户对直播体验的需求、企业…

Learning C++ No.29 【右值引用实战】

引言: 北京时间:2023/6/7/9:39,上午有课,且今天是周三,承接之前博客,今天我又去帮我舍友签到早八,但愿这次不会被发现吧!嘻嘻嘻!并且刚刚发文有关对C11相关知识&#xf…

Day_47选择排序

目录 一. 选择排序的实现 1. 简单选择排序 2. 性能分析 二. 代码实现 1. 核心代码 三. 代码展示 四. 数据测试 五. 总结 一. 选择排序的实现 1. 简单选择排序 选择排序的基本思想是:每一趟(如第i趟)在后面n-i1(i1,2,3...n-1&a…

Java 面试题:Spring,Spring MVC,Spring Boot 之间什么关系?

来,先和我看张图: Spring全家桶了为了解决不同场景的问题,逐渐演化出多套生态环框,如:Spring、SpringMVC、SpringBoot、SpringCloud。 Spring MVC和Spring Boot都属于Spring,Spring MVC是基于Spring的一个…

【每日算法】【168. Excel表列名称】

☀️博客主页:CSDN博客主页 💨本文由 我是小狼君 原创,首发于 CSDN💢 🔥学习专栏推荐:面试汇总 ❗️游戏框架专栏推荐:游戏实用框架专栏 ⛅️点赞 👍 收藏 ⭐留言 📝&…

Vue-ECharts使用说明

Vue-ECharts使用说明 vue-echarts 是在Apache Echarts官网的echarts使用方法上二次封装的组件,方便我们创建echarts图应用到我们的项目中。 参考: vue-echarts 官网:https://github.com/ecomfe/vue-echarts Apache Echarts 官网:h…

推荐一款比Flink CDC更好用的免费CDC工具

很多中大型企业都希望选择一款足够轻量好用的CDC工具,而且最好是小白用户都能使用的CDC工具,今天就推荐一款小白都能安装并立即使用的CDC工具给大家。 CDC(Change Data Capture)是一种用于捕获和传递数据库实时变更的技术。它允许…

怎样通过大数据获客?

零售商知道他们需要大数据,并且正在向前冲锋以进入游戏。但许多零售商继续面临挑战。应该收集什么类型的数据?应如何使用数据来生成见解?如何衡量投资回报率? 101data最近对美国各种规模的零售商进行了调查。当被问及哪些流程将受…

YOLOv5/v7 添加注意力机制,30多种模块分析②,BAM模块,CBAM模块

目录 一、注意力机制介绍1、什么是注意力机制?2、注意力机制的分类3、注意力机制的核心 二、BAM模块1、BAM模块的原理2、实验结果3、应用示例 三、CBAM模块1、CBAM模块的原理2、实验结果3、应用示例 大家好,我是哪吒。 🏆本文收录于&#xf…

测试之路-我曾经跨过无数Bug,也怼过各大佬开发

前言: 这是我从事测试的第五个年头的开端,忙忙碌碌到头发现好像忙了个寂寞。也忘了最初走向这条不归路的初心是什么。当时14年学完计算机出来找工作,看着茫茫人海,第一反应就是退缩,该找什么工作?开发&…

sparkSQL的使用

sparksql只能处理结构化数据 基于rdd构建dataframe对象 from pyspark.sql import SparkSession from pyspark.sql.types import StructType, StringType, IntegerTypeif __name__ __main__:spark SparkSession.builder.appName(test).master(local[*]).getOrCreate()sc spa…

JS-Object无序问题

1、 背景 在开发图表功能时,由于历史原因,后端返回的图表数据如下: 是对象类型,键为日期,值为日期和当天日期的值。在H5端、微信小程序端运行结果正常,结果到了百度小程序突然发现,这个值的顺…