Java面向对象(内部类)(枚举)(泛型)

这篇具有很好参考价值的文章主要介绍了Java面向对象(内部类)(枚举)(泛型)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

内部类

内部类是五大成员之一(成员变量、方法、构造方法、代码块、内部类);

一个类定义在另一个类的内部,就叫做内部类;

当一个类的内部,包含一个完整的事物,且这个事务不必单独设计,就可以把这个事务设计为内部类;

Public class Car{
    
    //内部类
    Public class Engine{

    }

}

内部类的四种形式:

成员内部类; 静态内部类; 局部内部类;匿名内部类

成员内部类

定义在成员位置的类,叫做成员内部类;

public class Outner {
    private String name = "科比";
    private int age = 43;

    //访问内部类的成员变量及方法
    public static void main(String[] args) {
        //创建内部类的对象
        Inner inner = new Outner().new Inner();
        inner.test();
    }

    //成员内部类
    public class Inner{
        private String name = "詹姆斯";
        private int age = 38;
        public void test(){
            //访问内部类的成员变量
            System.out.println(name);
            System.out.println(age);
            //访问内部类的成员变量
            System.out.println(Outner.this.name);
            System.out.println(Outner.this.age);
        }


    }
}

创建内部类的对象:new 外部类().new 内部类();

在内部类中调用外部类的成员变量: 外部类.this.外部类的成员变量;

静态内部类

在内部类中用static修饰的内部类叫做静态内部类;

public class Outner {
    static String name = "科比";
    private int age = 43;
    public static void main(String[] args) {
        //创建内部类的对象
        new Outner.Inner().test();
    }

   static class Inner{
        public void test(){
            //访问外部类的静态方法,非静态方法访问不到;
            System.out.println(Outner.name);
            
//            System.out.println(Outner.this.age); 报错
       }
    }
}

静态内部类只能调用外部类的静态变量;

创建内部类对象:new 外部类.内部类();

局部内部类

局部内部类是定义在方法中的类,和局部变量一样,只能在方法中有效。所以局部内部类的局限性很强,一般在开发中是不会使用的。

public class Outer{
    public void test(){
        //局部内部类
        class Inner{
            public void show(){
                System.out.println("Inner...show");
            }
        }
        
        //局部内部类只能在方法中创建对象,并使用
        Inner in = new Inner();
        in.show();
    }
}

局部内部类只能在方法中创建对象,局限性比较强,所以开发中一般不会使用;

匿名内部类

匿名内部类是一种特殊的局部内部类,因为不需要声明名字,所以叫做匿名内部类;

new 父类/接口(参数值){
 
  @override
    重写父类或者接口的方法

}

匿名内部类时间上是一个没有名字的子类对象,或者接口实现类的无名对象

public class Dome01 {
    public static void main(String[] args) {
        //匿名内部类的实现
        new Animal(){//符合多态思想的:编译看左,运行看右思想;
            @Override
            public void cry() {
                System.out.println("狗叫旺旺旺");
            }
        }.cry();//匿名对象直接调用Animal的cry方法
        
    }
}

//创建一个动物的抽象类
abstract class Animal{
   public abstract void cry();
}

需要注意的是,匿名内部类在编写代码时没有名字,编译后系统会为自动为匿名内部类生产字节码,字节码的名称会以外部类$1.class的方法命名

Java面向对象(内部类)(枚举)(泛型),java基础,java,开发语言

匿名内部类的作用:简化了创建子类对象、实现类对象的书写格式。  

匿名内部类的应用场景

只有在调用方法时,当方法的参数是一个接口或抽象类时,为了简化书写代码,而直接传递匿名内部类给方法。

public class Dome01 {
    public static void main(String[] args) {
        //匿名内部类对象1
        new Swimming(){
            @Override
            public void swim() {
                System.out.println("狗游泳飞快");
            }
        }.swim();
        
        //匿名内部类对象2
        new Swimming(){
            @Override
            public void swim() {
                System.out.println("猫不会游泳");
            }
        }.swim();
    }

    public void go(Swimming s){//将接口Swimming作为形参
        System.out.println("开始比赛");
        s.swim();
        System.out.println("结束比赛");

    }

}
interface Swimming{//接口
    public void swim();
}

枚举

枚举是一种特殊的类,它的格式:

Public enum A{
    X,Y,Z

}

其中XYZ叫做枚举项,它属于枚举的一个对象。想要获得枚举对象只需要用枚举名调用;

  • 枚举类的第一行只能罗列一些名称,这些名称都是常量,并且每个常量记住的都是枚举类的一个对象。
  • 枚举类的构造器都是私有的(写不写都只能是私有的),因此,枚举类对外不能创建对象。
  • 枚举都是最终类,不可以被继承。
  • 枚举类中,从第二行开始,可以定义类的其他各种成员。 编译器为枚举类新增了几个方法,并且枚举类都是继承:java.lang.Enum类的,从enum类也会继承到一些方法。
public class Test{
    public static void main(String[] args){
        //获取枚举A类的,枚举项
        A a1 = A.X;
        A a2 = A.Y;
        A a3 = A.Z;
    }
}

通过反编译的形式来验证(需要用到反编译的命令,这里不能直接将字节码拖进idea反编译)

Java面向对象(内部类)(枚举)(泛型),java基础,java,开发语言

枚举类A是用class定义的,说明枚举确实是一个类,而且X,Y,Z都是A类的对象;而且每一个枚举项都是被public static final修饰,所以可以类名调用,而且不能更改。

枚举类的应用场景

枚举一般表示一组信息,然后作为参数进行传输。  

我们来看一个案例。比如我们现在有这么一个应用,用户进入应用时,需要让用户选择是女生、还是男生,然后系统会根据用户选择的是男生,还是女生推荐不同的信息给用户观看。

Java面向对象(内部类)(枚举)(泛型),java基础,java,开发语言

 

public class Dome01 {
    public static void main(String[] args) {
        get(GENDER.BOY);
        get(GENDER.GIRL);
    }
    public static void get(GENDER gender){
        if (gender == GENDER.BOY){
            System.out.println("男生观看");
        }else {
            System.out.println("女生观看");
        }
    }

}
enum GENDER{
    BOY,GIRL
}

最终再总结一下枚举的应用场景:枚举一般表示几个固定的值,然后作为参数进行传输

枚举设计单例设计模式

单例设计模型也可以使用枚举进行设计,

public class dome01 {
    public static void main(String[] args) {
        Singleton instance1 = Singleton.INSTANCE;
        Singleton instance2 = Singleton.INSTANCE;
        System.out.println(instance2 == instance1);//判断两个对象的地址值,确定只能创建一个对象
    }
}
enum Singleton{
    INSTANCE;
    public void method(){
        System.out.println("我是一个单例");
    }

}

泛型

认识泛型

所谓泛型就是在定义类、接口、方法的时候同时声明一个或者多个类型变量<E>,称为泛型类,泛型接口,泛型方法。

Java面向对象(内部类)(枚举)(泛型),java基础,java,开发语言

  • 泛型的好处:在编译阶段可以避免出现一些非法的数据。

  • 泛型的本质:把具体的数据类型传递给类型变量。

自定义泛型
//这里的<T,W>其实指的就是类型变量,可以是一个,也可以是多个。
public class 类名<T,W>{
    
}
 ArrayList的底层实现
//定义一个泛型类,用来表示一个容器
//容器中存储的数据,它的类型用<E>先代替用着,等调用者来确认<E>的具体类型。
public class MyArrayList<E>{
    private Object[] array = new Object[10];
    //定一个索引,方便对数组进行操作
    private int index;
    
    //添加元素
    public void add(E e){
        array[index]=e;
        index++;
    }
    
    //获取元素
    public E get(int index){
        return (E)array[index];
    }
}

测试类,来测试自定义的泛型类MyArrayList是否能够正常使用文章来源地址https://www.toymoban.com/news/detail-649579.html

public class Test{
    public static void main(String[] args){
        //1.确定MyArrayList集合中,元素类型为String类型
        MyArrayList<String> list = new MyArrayList<>();
        //此时添加元素时,只能添加String类型
        list.add("张三");
        list.add("李四");
        
         //2.确定MyArrayList集合中,元素类型为Integer类型
        MyArrayList<Integer> list1 = new MyArrayList<>();
        //此时添加元素时,只能添加String类型
        list.add(100);
        list.add(200);
        
    }
}

到了这里,关于Java面向对象(内部类)(枚举)(泛型)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [Java基础]面向对象

           目录 1、对象和类 2、类之间的关系 3、引用 4、对象的创建和使用 5、构造函数/构造方法 6、内存解析        在这篇文章中,我们将学习面向对象的思想,并学习如何使用面向对象思想编程。在学习面向对象编程之前,我们先了解一下编程语言的发展:机器语言,汇

    2024年02月08日
    浏览(34)
  • Java基础 --- 面向对象

    面向:拿、找 对象:能干活的东西 面向对象编程:拿东西过来坐对应的事情 类(设计图):是对象共同特征的描述; 对象:是真实存在的具体东西 在Java中,必须先设计类,才能获得对象。 如何定义类 如何得到类的对象 如何使用对象 访问属性:对象名.成员变量 访问行为

    2024年03月17日
    浏览(36)
  • java学习路程之篇三、进阶知识、面向对象高级、接口新特性、代码块、内部类、Lambda表达式、窗体、组件、事件

    概述 生成值类型响应式数据 通过 .value 值修改 生成对象和数组类型的响应式对象选用 reactive 方式比较好 html JavaScript 概述 reactive 方法根据传入的对象,创建返回一个深度响应式对象。响应式对象看起来和传入的对象一样。但是,响应式对象属性值改动,不管层级有多深,都

    2024年02月16日
    浏览(26)
  • 【java】面向对象的编程基础

    true false 这里输入set和get可以自动将函数补全,传参初始化在构造属性之后 cc ccccc coleak 这里说明先构造属性,再执行代码块,再初始化 静态代码块 4 4 我是静态变量初始化 我是静态代码块 我是成员变量初始化 我是普通代码块 我是构造方法 快速构造,点击生成,构造函数,

    2023年04月16日
    浏览(32)
  • Java基础练习十(面向对象)

    以下名词中哪些是对象? 猫 狗 Tom Jerry 人 帅哥 美女 迪丽热巴 胡歌 Phone iPhone 14 Pro Max 《Java面向对象》 1. 编写一个Student类,包含name、gender、age、id、score属性,分别为String、String、int、int、double类型。类中声明一个say方法,返回String类型,方法返回信息中包含所有属性值。

    2024年02月12日
    浏览(25)
  • Java基础 --- 面向对象综合训练

    格斗游戏,每个游戏角色的姓名,血量,都不相同,在选定人物的时候(new对象的时候),这些信息就应该被确定下来。 补充: 正题: 定义数组存储3个商品对象。 商品的属性:商品的id,名字,价格,库存。 常见三个商品对象,并把商品对象存入到数组当中。 定义数组循

    2024年03月19日
    浏览(32)
  • 〔005〕Java 基础之面向对象

    对象: 是一种特殊的数据结构 对象: 使用类 new 出来的,有了类就可以创建对象,例 Random r = new Random() ,其中 r 就是一个对象 格式: public class 类名 { 变量和一些类方法 } 面向对象编程,更加符合人类的思维习惯,编程也会更直观 其实万物皆对象,如果想操作学生数据,就

    2024年02月05日
    浏览(29)
  • Java基础之基础语法与面向对象

    小知识 Java由Sun公司于1995年推出,2009年Sun公司被Oracle公司收购,取得Java的版权 Java之父:James Gosling(詹姆斯·高斯林)   专业术语 JDK:java development kit(java开发工具包) JRE:java runtime environment(java运行环境) JVM: java virual machine(java虚拟机:跨平台的核心)   java实现跨平

    2024年02月08日
    浏览(30)
  • Java面向对象程序设计实验报告(实验二 面向对象基础练习)

     ✨ 作者: 命运之光  ✨  专栏:Java面向对象程序设计实验报告 目录 ✨一、需求设计 ✨二、概要设计 ✨三、详细设计 ✨四、调试结果 ✨五、测试结果 ✨附录:源程序代码(带注释) 测试类demo2 Address类 Employee类 实验二 面向对象基础练习 实验环境: Eclipse+JDK 实验目的:

    2024年02月06日
    浏览(60)
  • Java基础(七)面向对象编程(高级)

    回顾类中的实例变量(即非static的成员变量) 创建两个Circle对象: Circle类中的变量radius是一个实例变量(instance variable),它属于类的每一个对象,c1中的radius变化不会影响c2的radius,反之亦然。 如果想让一个成员变量被类的所有实例所共享,就用static修饰即可,称为类变量(

    2023年04月16日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包