欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 美景 > Java基础:内部类

Java基础:内部类

2026/5/12 21:52:47 来源:https://blog.csdn.net/qq_63981644/article/details/143791083  浏览:    关键词:Java基础:内部类

欢迎来到“雪碧聊技术”CSDN博客!

在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将不断探索Java的深邃世界,分享最新的技术动态、实战经验以及项目心得。

让我们一同在Java的广阔天地中遨游,携手提升技术能力,共创美好未来!感谢您的关注与支持,期待在“雪碧聊技术”与您共同成长!

目录

一、什么是内部类

1、内部类的定义

2、内部类的应用场景

3、内部类有哪几种?

①成员内部类

②静态内部类

③局部内部类

④匿名内部类(重点掌握)

二、成员内部类

1、定义

2、创建对象的格式

举例:

3、成员内部类中,访问其他成员的特点

4、例题

5、总结

三、静态内部类

1、定义

2、创建对象的格式

举例:

3、静态内部类中,访问其他成员的特点

4、总结

四、局部内部类(看看就好)

五、匿名内部类(重点学习,也是后续学习的基础)

1、认识匿名内部类

①匿名内部类的特点

②匿名内部类的作用

③总结

2、常见的使用形式

①通常作为一个对象参数传递给方法

举例1:老师、学生游泳比赛

举例2:使用实现Runnable接口的方式,创建一个线程

3、应用场景

①调用别人提供的方法实现需求时,这个方法正好可以让我们传递一个匿名内部类对象。(重要)

②使用comparator接口的匿名内部类实现对数组进行排序(重要)​编辑


一、什么是内部类

1、内部类的定义

        如果一个类,定义在另一个类的内部,这个类就叫内部类。

        内部类是类的五大成分之一。(成员变量、方法、构造器、代码块、内部类

2、内部类的应用场景

        当一个类的内部,包含了一个完整的事物,且这个事物没有必要单独设计时,就可以把这个事物设计成内部类。

        举例:汽车里面,包含了一个完整的发动机,此时这个发动机类,就是汽车类的内部类。

3、内部类有哪几种?

①成员内部类

②静态内部类

③局部内部类

④匿名内部类(重点掌握)

二、成员内部类

1、定义

        就是类中的一个普通成员,类似我们之前学过的普通的成员变量、成员方法。

2、创建对象的格式

举例:

public class Test1 {public static void main(String[] args) {Outer.Inner i1 = new Outer().new Inner();i1.show();}
}//外部类
class Outer{//成员内部类:无static修饰,属于外部类的对象持有的class Inner{private String name;//构造器public Inner(){System.out.println("Inner() name = "+ name);}//内部类的成员方法public void show(){System.out.println("show");}//get/setpublic String getName() {return name;}public void setName(String name) {this.name = name;}}
}

运行结果:

3、成员内部类中,访问其他成员的特点

        ①成员内部类中,可以直接访问外部类的静态成员、实例成员

        ②成员内部类的实例方法中,可以直接拿到当前寄生的外部类对象:外部类名.this

举例:

4、例题

public class Test2 {public static void main(String[] args) {People.Heart heart = new People().new Heart();heart.show();}
}class People{private int heartBeat = 100;//成员内部类public class Heart{private int heartBeat = 80;public void show(){int heartBeat = 200;//在此依次输出200,80,100System.out.println(heartBeat);//200System.out.println(this.heartBeat);//80System.out.println(People.this.heartBeat);//100}}
}

运行结果:

5、总结

三、静态内部类

1、定义

        有static修饰的内部类,属于内部类自己持有。

        举例:

2、创建对象的格式

举例:

public class Test3 {public static void main(String[] args) {Outer.Inner inner = new Outer.Inner();inner.show();}
}class Outer{static class Inner{public void show(){System.out.println("内部类的show()方法");}}
}

运行结果:

3、静态内部类中,访问其他成员的特点

        ①静态内部类中,可以直接访问外部类的静态成员

        ②静态内部类中,不可以直接访问外部类的实例成员

4、总结

四、局部内部类(看看就好)

五、匿名内部类(重点学习,也是后续学习的基础)

1、认识匿名内部类

        简单来说:匿名内部类,本质是一个子类,并且会立即创建出一个子类对象。

        ①匿名内部类,是一种特殊的局部内部类。

        ②所谓匿名:指的是程序员不需要为这个类声明名字,默认有个隐藏的名字。

        举例:

        注意:不要看见new就以为是在创建对象,上面是内部类的写法。

①匿名内部类的特点

        匿名内部类本质就是一个子类,并会立即创建出一个子类对象。

        举例:

        

        我们可以把上面这个内部类,理解成一个Animal类的子类对象,比如猫类对象、狗类对象。

        观察源码:

②匿名内部类的作用

        用于更方便地创建一个子类对象。

③总结

2、常见的使用形式

①通常作为一个对象参数传递给方法

举例1:老师、学生游泳比赛

public class Test4 {public static void main(String[] args) {//获取一个实现了Swim接口的类的对象Swim s1 = new Swim() {public void swimming() {System.out.println("学生游得快~");}};start(s1);//获取一个实现了Swim接口的类的对象Swim s2 = new Swim() {public void swimming() {System.out.println("老师游得快~");}};start(s2);}//该方法要求传入一个实现了Swim接口的类的对象(属于多态写法)public static void start(Swim s){System.out.println("开始...");s.swimming();System.out.println("结束...");}}interface Swim{void swimming();
}

运行结果:

开始...
学生游得快~
结束...
开始...
老师游得快~
结束...

举例2:使用实现Runnable接口的方式,创建一个线程

public class test3 {public static void main(String[] args) {//掌握:匿名内部类写法new Thread(new Runnable() {public void run() {for (int i = 0; i < 5; i++) {System.out.println("子线程输出:"+i);}}}).start();//主线程任务for (int i = 0; i < 5; i++) {System.out.println("主线程输出:"+i);}}
}

运行结果:

子线程输出:0
主线程输出:0
子线程输出:1
主线程输出:1
子线程输出:2
子线程输出:3
主线程输出:2
子线程输出:4
主线程输出:3
主线程输出:4

3、应用场景

①调用别人提供的方法实现需求时,这个方法正好可以让我们传递一个匿名内部类对象。(重要)

②使用comparator接口的匿名内部类实现对数组进行排序(重要)

举例:

public class Test5 {public static void main(String[] args) {Student[] students = new Student[6];students[0] = new Student("张三", 18, 174, '男');students[1] = new Student("三丰",15, 179, '男');students[2] = new Student("张无忌",28, 194, '男');students[3] = new Student("殷素素",35, 184, '女');students[4] = new Student("李四",40, 177, '男');students[5] = new Student("王五",18, 154, '男');//对上述数组进行排序(根据age年龄排序)Arrays.sort(students, new Comparator<Student>() {public int compare(Student o1, Student o2) {/*if(o1.getAge() > o2.getAge()){return 1;}else if(o1.getAge() < o2.getAge()){return -1;}return 0;*/return o1.getAge() - o2.getAge();}});//输出排序后的数组for(Student s: students){System.out.println(s.toString());}}
}class Student{private String name;//姓名private int age;//年龄private double height;//身高private char sex;//性别//构造器public Student(String name, int age, double height, char sex) {this.name = name;this.age = age;this.height = height;this.sex = sex;}//get、setpublic String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public double getHeight() {return height;}public void setHeight(double height) {this.height = height;}public char getSex() {return sex;}public void setSex(char sex) {this.sex = sex;}//toStringpublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", height=" + height +", sex=" + sex +'}';}
}

 

以上就是内部类的全部内容,特别要注意其中“匿名内部类”的相关知识,比较重要也很常用。

如果想了解更多的Java知识,请关注本博主~~

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词