内部类和泛型

内部类的概念

定义

所谓内部类就是一个类嵌套在另一个类的内部,称这个嵌套类是内部类。

class Outter{
	//内部类
	class Inner{
	
	}
}

存在的原因

内部类也是封装的一种体现。
心脏类和人这个类的关系就是内部类和外部类的关系;
汽车发动机和汽车类的关系就是内部类和外部类的关系。

内部类的分类

根据定义的位置和关键字,分为四种内部类:成员内部类(类比成员方法)静态内部类(类比静态方法)方法内部类匿名内部类

成员内部类

1、定义:直接定义在内中,不加static定义的内部类称为成员内部类。
在这里插入图片描述
2、内外部类可以访问彼此的私有域
成员内部类默认包含了外部类的对象,可直接调用外部类的成员属性或私有成员属性。
在这里插入图片描述
外部类必须通过内部类的对象来访问内部类的私有属性。
在这里插入图片描述
3、产生内部类的对象
情况1:在外部类的内部产生内部类的对象。
类名称 引用名称 = new 类名称()
在这里插入图片描述
情况2:在外部类的外部产生内部类的对象。
外部类名称.内部类名称 内部类引用 = new 外部类名称().new 内部类名称()
在这里插入图片描述
4、成员内部类默认包含了外部类的对象,可直接调用外部类的成员属性,但不能定义静态属性或方法
在这里插入图片描述
5、通过内部类来规避单继承局限
在这里插入图片描述

静态内部类

1、定义:直接定义在类的内部,使用static关键字修饰的类,称为静态内部类。
2、静态内部类不包含外部类的对象,因此在静态内部类中不能直接访问外部类的成员域,必须通过外部类的对象访问;可以直接访问外部类的静态域。
3、产生静态内部类的对象,
a、在外部类的外部产生
在这里插入图片描述
b、在外部类的外部产生静态内部类的对象
外部类名称.内部类名称 内部类引用 = new 外部类名称().内部类名称()
在这里插入图片描述
4、在静态内部类中既可以定义静态变量也可以定义成员变量,当成普通类看待。

方法内部类

1、只能定义在方法之中,不能有任何访问修饰符,这个类在方法调用结束之后就会自动销毁,类比方法中的局部变量。
规则1:方法类的内部不能有任何访问修饰符
在这里插入图片描述
规则2:方法内部类的声明周期只在方法调用过程中存在,当方法调用结束,方法内部类就会被销毁。方法内部类对方法外部完全隐藏。
在这里插入图片描述
在这里插入图片描述
规则3:若方法内部类使用方法中的形参,这个参数就必须是形式上的final(JDK8之前,方法内部类使用方法的形参,该参数必须显示定义为final参数)。也就是说在方法内部类中只能访问方法中的参数,不能修改其值;若在方法内部类中调用了方法的形参,在方法中也不能修改这个值。
在这里插入图片描述

匿名内部类

1、方法内部类的一种特殊情况,定义在方法之中,主要是在方法的参数上使用,这个类没有名字,一般默认继承一个类或实现一个接口。
在这里插入图片描述
2、匿名内部类作为方法的参数
在这里插入图片描述


补充:方法的可变参数

实现一个sum方法,能接收任意个整型变量,求这些变量的和。

在这里插入图片描述


泛型

在Java中Object是所有类的父类,可以接收所有类型,用户设置时可以设置任意类型,但是取出时可能需要强制类型转换,就会报错,但在编译阶段无法检测,会发生严重的线上问题。引入泛型,将问题暴露在编译阶段。
1、指的是在定义类和方法时,参数的类型暂定,只有在使用时才会明确类型。
语法:

class 类名称<T>{
}

在这里插入图片描述

2、泛型类的使用:当要产生泛型类的对象时,此时我们给出明确的类型。

在这里插入图片描述
使用时设置具体类型,相应的类型参数就会被替换为当前具体类型
在这里插入图片描述
当设置值或取值不是当前类型时,编译出错,将问题暴露在编译阶段。
在这里插入图片描述
3、一般来说,泛型的类型参数使用的大写字母:
E:普通元素含义,表示单个泛型元素;
K,V:搭配使用,表示键值对对象;
T:普通泛型类型代号参数;
S:也可指代泛型参数。
当泛型类中需要多个类型参数时,直接在<>内使用’,'分隔,使用不同的大写字母来代替。
在这里插入图片描述

泛型方法

1、定义
语法:访问修饰符 [static] <类型参数>方法名称(){}
在这里插入图片描述

2、泛型方法始终以自己的类型参数为准,与类中的类型参数无关。因此,若类中存在泛型方法,一般不要使用重复的大写字母。
3、泛型方法可以独立存在,泛型方法所在的类可以不是泛型类
在这里插入图片描述

泛型接口

1、定义
在这里插入图片描述
2、子类实现泛型接口
a、子类仍然是泛型类,仍然保留泛型接口的类型参数
在这里插入图片描述
b、若子类在实现泛型接口时,就明确具体类型
在这里插入图片描述

泛型数组

1、不能new 类型参数的数组,但是可以声明。
在这里插入图片描述
2、JVM中没有泛型数组,要使用泛型数组,统一使用Object数组。
在这里插入图片描述
3、两种写法的区别
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值