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

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("匿名内部类在开发中的应用");
    }
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Dockerfile详解

Dockerfile是什么 Dockerfile就是一个纯文本,里面记录了一系列的构建指令,如选择基础镜像、拷贝文件、运行脚本等等,RUN, COPY, ADD指令都会生成一个 Layer,而 Docker 顺序执行这个文件里的所有步骤,最后就会创建出一…

分布式系统概念和设计——分布式事务

分布式系统概念和设计 分布式事务 访问多个服务器管理的对象的事务称为分布式事务。 当一个分布式事务结束时,事务的原子特性要求所有参与事务的服务器必须全部提交或全部放弃。 实现: 其中一个服务器承担了协调者的角色,保证在所有的服务器…

“微商城”项目(5登录和注册)

1.我的信息 在pages\User.vue文件中编写HTML结构代码&#xff0c;示例代码如下。 <template><div class"member"><div class"header-con"><router-link :to"{ name: login }" class"mui-navigate-right">&l…

Spring Cloud Alibaba - Sentinel(一)

目录 一、Sentinel介绍 1、什么是Sentinel 2、Sentinel好处 3、Sentinel下载和安装 二、搭建Sentinel项目 1、创建项目cloudalibaba-sentinel-service8401 三、Sentinel流控规则 1、流控规则基本介绍 2、新增流控 2.1、QPS直接失败案例 2.2、线程数直接失败案例 3、…

容器(第一篇)docker安装、基础操作命令

docker是什么&#xff1f; docker是一个go语言开发的应用容器引擎。 docker的作用&#xff1f; ①运行容器里的应用&#xff1b; ②docker是用来管理容器和镜像的一种工具。 容器 与 虚拟机 的区别&#xff1f; 容器 虚拟机所有容器共享宿主机…

【论文阅读】Neuralangelo:高保真神经表面重建

【论文阅读】Neuralangelo&#xff1a;高保真神经表面重建 Abstract1. Introduction2. Related work3. Approach3.1.预备工作3.2.数值梯度计算3.3.渐进细节层次3.4.优化 4. Experiments4.1. DTU Benchmark4.2. Tanks and Temples4.3.细节水平4.4.消融 5. Conclusion paper proj…

深度学习基础知识-tf.keras实例:衣物图像多分类分类器

参考书籍&#xff1a;《Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, 2nd Edition (Aurelien Geron [Gron, Aurlien])》 本次使用的数据集是tf.keras.datasets.fashion_mnist&#xff0c;里面包含6w张图&#xff0c;涵盖10个分类。 import tensorflo…

Jmeter性能测试 (入门)

Jmeter是一款优秀的开源测试工具&#xff0c; 是每个资深测试工程师&#xff0c;必须掌握的测试工具&#xff0c;熟练使用Jmeter能大大提高工作效率。 熟练使用Jmeter后&#xff0c; 能用Jmeter搞定的事情&#xff0c;你就不会使用LoadRunner了。 本文将通过一个实际的测试例…

IPV6地址基础

IPv6是英文“Internet Protocol Version 6”&#xff08;互联网协议第6版&#xff09;的缩写&#xff0c;是互联网工程任务组&#xff08;IETF&#xff09;设计的用于替代IPv4的下一代IP协议。其地址数量号称可以为全世界的每一粒沙子编上一个地址 1. ipv6地址表示方法 IPv6的…

MQTT与EMQ

文章目录 1 MQTT协议与EMQ中间件1.1 物联网消息协议MQTT1.1.1 什么是MQTT1.1.2 MQTT相关概念1.1.3 消息服务质量QoS——信息的可靠投递1.1.3.1 QoS0——消息服务质量为0&#xff0c;消息发送至多一次1.1.3.2 QoS1——消息发送至少一次1.1.3.3 QoS2——消息发送仅一次1.1.3.4 不…

Oracle中的数据导出(4)

目录 法一&#xff1a;使用SQL plus命令脚本 法二&#xff1a;使用PLSQL Developer工具 前几篇文章描述了如何将Oracle中的数据导出到库外&#xff0c;但是导出的数据结果都是文本文档&#xff0c;这样页面查看不和谐&#xff0c;编辑又略显麻烦。因此这篇文章将描述如何将Or…

Pb协议的接口测试

【摘要】 Protocol Buffers 是谷歌开源的序列化与反序列化框架。它与语言无关、平台无关、具有可扩展的机制。用于序列化结构化数据&#xff0c;此工具对标 XML &#xff0c;支持自动编码&#xff0c;解码。比 XML 性能好&#xff0c;且数据易于解析。更多有关工具的介绍可参考…

氟化物选择吸附树脂Tulsimer ®CH-87 ,锂电行业废水行业矿井水除氟专用树脂

氟化物选择吸附树脂 Tulsimer CH-87 是一款去除水溶液中氟离子的专用的凝胶型选择性离子交换树脂。它是具有氟化物选择性官能团的交联聚苯乙烯共聚物架构的树脂。 去除氟离子的能力可以达到 1ppm 以下的水平。中性至碱性的PH范围内有较好的工作效率&#xff0c;并且很容易再生…

Vue.js 中的过渡动画是什么?如何使用过渡动画?

Vue.js 中的过渡动画是什么&#xff1f;如何使用过渡动画&#xff1f; 在 Vue.js 中&#xff0c;过渡动画是一种在元素插入、更新或删除时自动应用的动画效果&#xff0c;可以为应用程序增加一些动态和生动的效果。本文将介绍 Vue.js 中过渡动画的概念、优势以及如何使用过渡动…

Nginx正则表达式、location、rewrite

目录 一、常用的Nginx正则表达式 二&#xff1a;localtion 1、location 分类 2、 location 常用的匹配规则 3、location 优先级 4、 location 示例 5、优先级总结 6、实际网站使用中&#xff0c;至少有三个匹配规则定义 &#xff08;1&#xff09;第一个必选规则 &…

chatgpt赋能python:将一行数变成列——Python简单实现

将一行数变成列——Python简单实现 在数据处理时&#xff0c;我们常常会遇到将一行的数据转换成列的情况&#xff0c;例如将多个数据在Excel表格中拆分为不同的列。这时候&#xff0c;Python可以帮助我们快速实现这个功能。 什么是Python&#xff1f; Python是一种高级&…

N-propargyloxycarbonyl-L-lysine,1215204-46-8,是一种基于赖氨酸的非天然氨基酸 (UAA)

产品描述&#xff1a; N-ε-propargyloxycarbonyl-L-lysine (H-L-Lys(Poc)-OH) 是一种基于赖氨酸的非天然氨基酸 (UAA)。 广泛用于多种生物体中荧光探针的生物偶联。 N- ε- Propargyloxycarbonyl-L-lysine (H-L-Lys (Poc) - OH) is a non natural amino acid (UAA) based on …

IDEA 终端命令行设置

一、说明 在使用 IDEA 进行程序开发时&#xff0c;需要使用到终端 Terminal 的功能&#xff0c;便于能够快速使用 shell 命令&#xff0c;进行各种相关的操作。 这些操作可以包括代码的版本控制、程序的打包部署等等 比如&#xff0c;前后端的集成开发环境&#xff08;IDEA、We…

.gitignore忽略文件不生效

前言 .gitignore忽略文件时git仓库很重要的一个配置&#xff0c;在创建仓库时就会有模板选择和忽略文件。 .gitignore忽略文件意思是在上传到代码仓库时&#xff0c;控制把哪些代码文件不上传到代码仓库。 在实际开发中其实写的代码是没有多大的&#xff0c;主要的是插件本地…

基于牛顿拉夫逊的配电网潮流计算研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…