抽象类,内部类,匿名类

news2024/12/24 2:31:35

java学习第十天

抽象类

1.用abstract关键字来修饰一个类时,这个类就叫抽象类

访问修饰符 abstract 类名 {
}
2.用abstract关键字来修饰一个方法时,这个方法就是抽象方法访问修饰符abstract返回类型方法名(参数列表);//没有方法体
3.抽象类的价值更多作用是在于设计,是设计者设计好后,让子类继承并实现抽象类()

4.在框架和设计模式中使用较多

注意事项

1)抽象类不能被实例化
2)抽象类不一定要包含abstract方法。也就是说,抽象类可以没有abstract方法
3)一旦类包含了abstract方法,则这个类必须声明为abstract
4)abstract只能修饰类和方法,不能修饰属性和其它的。

5)抽象类可以有任意成员【抽象类本质还是类】,比如:非抽象方法、构造器、静态属性等等[举例]
6)抽象方法不能有主体,
abst ract void aaa();
7)如果一个类继承了抽象类,则它必须实现抽象类的所有抽象方法,
除非它自己也声明为abstract类。

接口

接口就是给出一些没有实现的方法,封装到一起,到某个类要使用的时候,在根据具体情况把这些方法写出来。语法:
interface 接口名 {/属性
//抽象方法)
class 类名 implements 接口 {

自己属性;
自己方法;
必须实现的接口的抽象方法
}
小结:接口是更加抽象的抽象的类,抽象类里的方法可以有方法体,接口里的所有方法都没有方法体【jdk7.0】。接口体现了程序设计的多态和高内聚低偶合的设计思想。
特别说明:Jdk8.0后接口类可以有静态方法,默认方法,也就是说接口中可以有方法的具体实现

注意

1接口不能被实例化
2)接口中所有的方法是 public方法,接口中抽象方法,

可以不用abstract修饰
void aaa();
实际上是abstract void aa();
3)一个普通类实现接口,就必须将该接口的所有方法都实现。

4)抽象类实现接口,可以不用实现接口的方法。

内部类

如果定义类在局部位置(方法中/代码块) :(1) 局部内部类 (2) 匿名内部类

定义在成员位置 (1) 成员内部类 (2) 静态内部类

class Outer{/外部类
class Inner{
//内部类
}
}
class Other{ M/外部其他类

注意

说明:局部内部类是定义在外部类的局部位置,比如方法中,并且有类名。1.可以直接访问外部类的所有成员,包含私有的
2.不能添加访问修饰符,因为它的地位就是一个局部变量。局部变量是不能使用修饰符的。但是可以使用final修饰,因为局部变量也可以使用final
3.作用域:仅仅在定义它的方法或代码块中。
4.局部内部类—访问---->外部类的成员[访问方式:直接访问]5.外部类—访问---->局部内部类的成员
访问方式:创建对象,再访问(注意:必须在作用域内)
记住:(1)局部内部类定义在方法中/代码块
(2)作用域在方法体或者代码块中
(3)本质仍然是一个类

6.外部其他类—不能访问----->局部内部类(因为局部内部类地位是一个局部变量)7.如果外部类和局部内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.this.成员)去访问【演示】
System.out.println("”外部类的n2=”+外部类名.this.n2);

案例

package inner_class;

public class outer04 {
    public outer04() {
        Inner inner = new Inner();
        inner.a = 10;
        Inner inner1 = new Inner();
        inner1.a = 20;
    }

   public class Inner {
        public int a = 55;

    }

    public static void main(String[] args) {
        outer04 outer04 = new outer04();
        Inner inner = outer04.new Inner();
        System.out.println(inner.a);
    }
}
匿名内部类

(1)本质是类(2)内部类(3)该类没有名字(4)同时还是一个对象
说明:匿名内部类是定义在外部类
的局部位置,比如方法中,并且没有类名1.匿名内部类的基本语法
new 类或接口 (参数列表) {
类体

}

2匿名内部类的语法比较奇特,请大家注意,因为匿名内部类既是一个类的定义,同时它本身也是一个对象,因此从语法上看,它既有定义类的特征,也有创建对象的特征,对前面代码分析可以看出这个特点,因此可以调用匿名内部类方法。

3.可以直接访问外部类的所有成员,包含私有的[案例演示]4、不能添加访问修饰符,因为它的地位就是一个局部变量。[过]
5.作用域:仅仅在定义它的方法或代码块中。[过]
6.匿名内部类—访问---->外部类成员[访问方式:直接访问]

7.外部其他类—不能访问----->匿名内部类(因为匿名内部类地位是一个局部变量)8.如果外部类和匿名内部类的成员重名时,匿名内部类访问的话,默认遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.this.成员)去访问

案例
package inner_class;

public class outer04 {
    private int n1 = 10;
    public void method() {
        new IA() {
            @Override
            public void cry() {
                System.out.println("猫在叫唤");
            }
        };
    }

    public static void main(String[] args) {
        IA ia = new IA() {
            @Override
            public void cry() {
                System.out.println("老虎在叫唤");
            }
        };
        //ia.cry();
        //System.out.println("ia的运行类型"+ ia.getClass());
       /* Father father = new Father("lisi"){

        };
        System.out.println("运行类型"+ father.getClass());
        Father father1 = new Father("张三");
        System.out.println("运行类型"+ father1.getClass());*/

        /*Father father2 = new Father("wangwu"){
            @Override
            public void test() {
                System.out.println("匿名内部类重写了father的test方法");
            }
        };
        father2.test();*/

        //抽象类的匿名内部类 必须实现abstract方法
        Animal animal = new Animal(){
            @Override
            void eat() {
                System.out.println("动物要吃东西");
            }
        };
        animal.eat();
    }
}

/*class Cat implements IA {
    @Override
    public void cry() {
        System.out.println("猫在叫唤");
    }
}*/

//接口
interface IA {
    public void cry();
}

class Father {
    public Father(String name) {
        System.out.println("接受到name= " + name);
    }
    public void test(){

    }
}

//抽象类
abstract class Animal {
    abstract void eat();
}
将匿名内部类当做实参
package inner_class;
public class outer04 {
    //将匿名内部类作为参数
    public static void main(String[] args) {
        //传统方法
        //Picture picture = new Picture();
        //f1(picture);
        //或者
        //f1(new Picture());

        //将匿名内部类作为实参传入函数
        f1(new IL() {
            @Override
            public void show() {
                System.out.println("一幅画!");
            }
        }
        );
    }
    public static void f1(IL il){
        il.show();
    }
}

interface IL {
    public abstract void show();
}

class Picture implements IL {
    @Override
    public void show() {
        System.out.println("这是一幅画");
    }
}
匿名内部类练习

1.有一个铃声接口Bell,里面有个ring方法。
2.有一个手机类Cellphone,具有闹钟功能
alarmclock,参数是Bell类型(
3.测试手机类的闹钟功能,通过匿名内部类(对
象)作为参数,打印:懒猪起床了
4。再传入另一个匿名内部类(对象),打印:
小伙伴上课了

package inner_class;

public class outer04 {
    public static void main(String[] args) {
        // 3.测试手机类的闹钟功能,通过匿名内部类(对
//         象)作为参数,打印:懒猪起床了
        Cellphone cellphone = new Cellphone();
        cellphone.alrmclock(new Bell(){
            @Override
            public void ring() {
                System.out.println("懒猪起床了");
            }
        });
//        4。再传入另一个匿名内部类(对象),打印:
//        小伙伴上课了
        new Cellphone().alrmclock(new Bell(){
            @Override
            public void ring() {
                System.out.println("小伙伴,上课了");
            }
        });
    }

}

/*
1.有一个铃声接口Bell,里面有个ring方法。
        2.有一个手机类Cellphone,具有闹钟功能
        alarmclock,参数是Bell类型(
        3.测试手机类的闹钟功能,通过匿名内部类(对
        象)作为参数,打印:懒猪起床了
        4。再传入另一个匿名内部类(对象),打印:
        小伙伴上课了*/

//1.有一个铃声接口Bell,里面有个ring方法。
interface Bell {
    public abstract  void ring();
}

//2.有一个手机类Cellphone,具有闹钟功能
//        alarmclock,参数是Bell类型

class Cellphone {


    public void alrmclock(Bell bell){
        bell.ring();
    }
}

编译结果在这里插入图片描述

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

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

相关文章

ROS学习第十四节——参数服务器控制小乌龟

1.使用命令修改参数服务器 单独使用命令启动小乌龟节点,不是用lanuch文件,不启动键盘控制节点 rosrun turtlesim turtlesim_node 使用命令打印参数服务器参数列表 rosparam list 修改小乌龟节点的背景色 rosparam set /turtlesim/background_b 自定…

网络安全:一次艰难的 WAF 绕过

0x00:前言 做之前没想过有这么难 0x01:后缀绕过 首先看一下 waf 咋工作的,当数据包匹配到 waf 规则后,数据包就会被丢弃掉,就像这样 waf 是拦截后缀的,首先 fuzz 一波换行 失败 多个等于号 失败 单双引号…

入门Pytorch时的一些报错

Anaconda是一个很好的可以管理python环境的工具,推荐大家结合pycharm使用。 我入门时是参照up我的土堆的Pytorch教程来安装学习的,其中也遇到了一些问题。 1. torch.cuda.is_available结果显示False import torch torch.cuda.is_available 用anacon…

4月17号软件资讯更新合集.....

CrateDB 5.3.0 发布,分布式 SQL 数据库 CrateDB 是一个分布式的 SQL 数据库,使得实时存储和分析大量的机器数据变得简单。CrateDB 提供了通常与 NoSQL 数据库相关的可扩展性和灵活性,最小的 CrateDB 集群可以轻松地每秒摄取数万条记录。这些…

通过Python的PIL库给图片添加文本水印

文章目录 前言一、PIL是什么?二、安装PIL三、查看PIL版本四、使用PIL库给图片添加文本水印1.引入库2.打开图片文件3.新建一个Draw对象4.设置水印文字、字体、大小5.设置水印颜色5.1通过名称设置颜色5.2通过RGB值设置颜色5.3通过RGBA值设置颜色5.4通过十六进制设置颜…

Word控件Spire.Doc 【脚注】字体(3):将Doc转换为PDF时如何使用卸载的字体

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下,轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具,专注于创建、编辑、转…

HttpServletRequest的介绍和方法以及代码实战

目录 HttpServletRequest HttpServletRequest 介绍 HttpServletRequest 常用方法 代码实战 HTML部分 Java部分 web.xml配置 请求转发 为什么需要请求转发 请求转发说明 请求转发原理示意图 代码实战 HTML部分 CheckServlet部分 ManageServlet 部分 xml部分 请求…

【Linux】进程的概念

文章目录 📖 前言1. 冯诺依曼体系结构1.1 内存存在的意义:1.2 程序加载到内存的意义:1.3 程序的预加载: 2. 认识进程2.1 如何理解管理:2.2 什么叫是进程:(初步理解) 3. 简单认识操作…

读SQL进阶教程笔记13_SQL中的分组和层级

1. 数据分组 1.1. SQL的语句中具有分组功能的是GROUP BY和PARTITION BY 1.1.1. 两者都有数学的理论基础 1.1.2. 都可以根据指定的列为表分组 1.1.3. 区别仅仅在于,GROUP BY在分组之后会把每个分组聚合成一行数据 1.1.4. GROUP BY的作用是将一个个元素划分成若干…

CentOS7误删自带python2或yum异常导致yum命令不可用的解决方法

yum命令不可用的解决方法 异常场景1原因验证解决方案让Python2与Python3共存 异常场景2原因解决方案卸载、删除残留文件下载系统版本对应的yum包 异常场景1 在执行yum命令时,系统无法找到 Python 解释器,因此无法运行 yum 命令,具体异常如下…

详解语义分割deeplabv3+模型的工业应用流程

来源:投稿 作者:某一个名字 编辑:学姐 导语 在工业视觉应用中,目标检测算法常用于特征的粗定位,而语义分割则在特征的精定位方面有着突出的表现。使用较多的语义分割模型主要有FCN、deeplab系列、unet等,根…

ASEMI代理ADI亚德诺AD8210YRZ-REEL7车规级芯片

编辑-Z AD8210YRZ-REEL7芯片参数: 型号:AD8210YRZ-REEL7 偏移电压(RTI):1.0mV 超温(RTI):1.8 mV 差分输入阻抗:2 kΩ 共模输入阻抗:5 MΩ 共模输入电压…

数据离奇丢失案件的侦破与思考

01 离奇的数据丢失案件 最近生产环境出了一起数据离奇丢失的案件,调查过程很曲折,几度进入死胡同。下面跟大家分享整个事件的来龙去脉。 1.1 数据丢失案件 8月初,用户批量导入了一批(300)委托人数据,导入…

完美解决丨SyntaxError: invalid syntax

样例 1.1. 不同编辑器 VSCode:点击查看PyCharm:点击查看 1.2. 不同版本 1.2.1. python2 与 python3 的差异 Python2 的 print 语句如下: python print Hello, World! Python3 的 print 语句如下: python print(Hello, World!) P…

超实用的 Linux 高级命令,程序员一定要懂

前言 在运维的坑里摸爬滚打好几年了,我还记得我刚开始的时候,我只会使用一些简单的命令,写脚本的时候,也是要多简单有多简单,所以有时候写出来的脚本又长又臭。 像一些高级点的命令,比如说 Xargs 命令、管…

前端登陆表单_内容非空验证_rules属性与validate方法

更多校验规则查看&#xff1a;ElementUI官网-form-attributes 表单内容 <!--3、通过rules属性传入约定的验证规则v-bind:model"dataForm"绑定data中的dataForm数据v-bind:rules"rules"绑定data中的rules属性&#xff0c;里面定义了要校验的属性及规则re…

网络安全之DVWA通关教程

网络安全之DVWA通关教程 一、DVWA简介二、DVWA安装2.1 安装PHPStudy2.2 安装DVWA 三、DVWA使用3.1 Brute Force&#xff08;暴力破解&#xff09;3.1.1 Low级别3.1.2 Medium级别3.1.3 High级别 3.2 Command Injection&#xff08;命令注入&#xff09;3.2.1 Low级别3.2.2 Middl…

三极管基本知识

1、三极管是常用的半导体器件&#xff0c;也称为双极型品体管、品体三极管&#xff0c;由P/N结组成&#xff0c;它分为NPN(简称P三极管)和PNP&#xff08;简称N三极管&#xff09;&#xff0c;P三极管用多一点。常用的有插件类和贴片类两大封装。具体封装类型有SOT-23-3,TO-92,…

QS排名十年对比:美国大学最稳,中国大学进步最快

QS世界大学排名发布距今已有20年历史&#xff0c;迄今为止&#xff0c;全球已有超过90个国家和地区共1500多所大学进入QS世界排名。QS排名评估中所使用的5项评估标准基本保持不变。 QS使用5个关键指标来进行排名&#xff0c;包括学术声誉、雇主声誉、篇均论文引用、H指数和国际…

【Node.JS】初入前端,学习node.js基本操作

文章目录 一、Node.js 创建服务端应用二、npm 使用介绍三、Node.js 回调函数四、Node.js 事件驱动程序五、Node.js 事件监听器六、特殊的error事件七、Node.js Buffer&#xff08;缓冲区&#xff09;八、输入输出流 Stream九、Node.js 模块系统十、 Node.js 路由十一、GET/POST…