欢迎来到“雪碧聊技术”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知识,请关注本博主~~

