内部类是指定义在另一个类内部的类(类中类)。Java中的内部类分为四种:成员内部类、局部内部类、匿名内部类和静态内部类。
内部类优势
1.内部类与外部类,可以方便访问各自的私有属性或方法
2.内部类也是一种封装,是对类的部分信息的封装
成员内部类:定义在另一个类的内部,并且不是静态的。它可以访问外部类的成员变量和方法,包括私有成员。
/**
* @author :javaRao
* @date :Created in 2023-07-06 14:11
* @description:成员内部类
*/
public class In2Demo {
public static void main(String[] args) {
Ostr2 o=new Ostr2(1,"张三");
Ostr2.Cin c=o.new Cin();
c.pr();
}
}
class Ostr2{
int id;
String name;
class Cin{
String type="数学";
int num=99;
public void pr(){
System.out.println(id+" "+type+" "+num);
}
}
public Ostr2(int id,String name){
this.id=id;
this.name=name;
}
}
静态内部类:定义在另一个类的内部,但被声明为静态的。静态内部类不持有对外部类对象的引用。(因为java先加载静态类)在class In4调用不了外部(class 04)的非静态属性,只能调用静态属性。
/**
* @author :javaRao
* @date :Created in 2023-07-06 14:43
* @description:静态内部类
*/
public class In4Demo {
public static void main(String[] args) {
// O4 o4=new O4();
// O4.In4 a=o4.new In4();
O4.In4 o=new O4.In4();
o.fun();
}
}
class O4{
public static String name="口红";
public static int pri=1200;
//static 内部类---材料
public static class In4{
public String addr="越南";
public void fun(){
System.out.println(addr);
System.out.println(pri);
}
}
}
局部内部类:定义在方法或作用域内部的类。局部内部类只在定义它的代码块中可见,外部类无法访问它。
* @author :javaRao
* @date :Created in 2023-07-06 15:07
* @description:方法内含有一个内部类:方法内部类把内部类的信息和调用,全部封装在方法中
*/
public class In5 {
public static void main(String[] args) {
O5 o5=new O5();
o5.dis(4);
new O5().dis(1);
}
}
class O5{
String name="商家a";
int num=5;//钱
//支付
public void dis(int te){
//内部类
class Inx{
public void fun(){
System.out.println(num);
System.out.println(te);
System.out.println(name);
}
}
//这里调用
new Inx().fun();
}
}
匿名内部类:没有显式的类名,直接通过new关键字创建并实例化。通常用于创建简单的事件处理器和回调函数。代码示例展示了如何使用匿名内部类来实现一个接口。在这个例子中,匿名内部类实现了MyIn
接口,并重写了play
和re
方法。匿名内部类的实例被立即创建,并调用了play
方法。
/**
* @author :javaRao
* @date :Created in 2023-07-06 15:21
* @description:匿名内部类
*/
public class In6 {
public static void main(String[] args) {
// 创建一个匿名内部类的实例,并实现MyIn接口
new MyIn() {
@Override
public void play() {
System.out.println("跳个楼吧");
}
@Override
public void re() {
System.out.println("再跳个楼");
}
}.play(); // 调用匿名内部类的play方法 如果将play()替换为re()则是调用匿名内部类的re方法输出再跳个楼吧。
}
}
// 定义MyIn接口
interface MyIn {
void play();
void re();
}