目录
分类
内部类分为实例内部类类似于实例变量,局部内部类类似于局部变量,静态内部类类似于静态变量,匿名内部类是没有类名的属于局部内部类。在以后用得最多的是匿名内部类,因此最主要讲解匿名内部类。
实例变量(全局变量),局部变量,静态变量的解释:https://blog.csdn.net/csdn_yaohailong/article/details/101375754
内部类例子如下:
public class Test{
public static void main(String[] args) {
}
}
class Test01{
//在该类的内部所以叫做内部类
//由于前面有static,所以称为“静态内部类”
static class Inner1{
}
//在类内部所以叫做内部类
//由于前面没有static,所以叫做实例(全局)内部类
class Inner02{
}
//在类内部所以叫做内部类
//在这个方法体里面生效所以叫做局部内部类
public void dosome(){
class Inner03 {
}
}
public void doother(){
//如果要使用一个类中的内部类,必须先把外面的类new出来,然后new内部类。
//在doother中无法使用Inner03类,因为Inner03类的作用域是dosome方法
new Test01().new Inner02();
new Test01().new Inner03();//这个语句编译报错。
}
}
什么是匿名内部类
1.什么是内部类?
内部类:在类的内部又定义了一个新的类。
2.使用内部类编写的代码,可读性很差,能不用就不用。而匿名内部类,可读性差,而且因为没有类名,无法重复使用。
3.匿名内部类是局部内部类的一种,什么是匿名内部类呢?因为这个类没有名字而得名。学习匿名内部类最主要是让大家阅读别人代码的时候能够理解,并不代表以后建议大家这样写。
因为匿名内部类有两大缺点:可读性差,没有类名无法重复使用。(建议喜欢装b的人使用)
//匿名内部类是一种用来装逼的东西,使代码看起来更加高端。然而就是一个废物。
public class Test{
public static void main(String[] args) {
MyMath m = new MyMath();
//这样写代码,表示这个类名是有的,类名是computeiml
//m.sum(new computeiml(),12,1);
// 使用匿名内部类,表示这个computeimp这个类没有名字。
//这里表面上看上去好像是接口可以直接可以new了,实际上接口是不可以new的
//new compute()后面的{}代表了对接口的实现只是没有了类名。
//不建议使用匿名内部类,因为一个类没有名字无法重复使用,而且代码太乱可读性太差
//但是有些人非要这样写,因为代码看上去很高端。
m.sum(new compute() {
@Override
public int sum(int a, int b) {
return a + b;
}
},12,1);
}
}
//负责计算的接口
interface compute{
int sum(int a, int b);
}
/*
class computeiml implements compute{
@Override
public int sum(int a, int b) {
return a +b;
}
}
*/
class MyMath{
public void sum(compute c,int x,int y){
int re = c.sum(x,y);
System.out.println(re);
}
}