欢迎来到“雪碧聊技术”CSDN博客!
在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将不断探索Java的深邃世界,分享最新的技术动态、实战经验以及项目心得。
让我们一同在Java的广阔天地中遨游,携手提升技术能力,共创美好未来!感谢您的关注与支持,期待在“雪碧聊技术”与您共同成长!
目录
①调用别人提供的方法实现需求时,这个方法正好可以让我们传递一个匿名内部类对象。(重要)
②使用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/set
public 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,100
System.out.println(heartBeat);//200
System.out.println(this.heartBeat);//80
System.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、set
public 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;
}
//toString
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", height=" + height +
", sex=" + sex +
'}';
}
}
以上就是内部类的全部内容,特别要注意其中“匿名内部类”的相关知识,比较重要也很常用。
如果想了解更多的Java知识,请关注本博主~~
标签:Java,内部,void,基础,匿名,new,public,name From: https://blog.csdn.net/qq_63981644/article/details/143791083