- 内部类:
1、什么是内部类?
内部类:在类的内部又定义了一个新的类,被称为内部类。
2、内部类的分类:
静态内部类:类似于静态变量;
实例内部类:类似于实例变量;
局部内部类:类似子局部变量。
3、使用内部类编写的代码,可读性很差。能不用尽量不用。
4、匿名内部类是局部内部类的一种。
因为这个类没有名字而得名,一种匿名内部类。 - 静态内部类的访问方式
1、静态内部类里有非静态方法的调用方式以及
静态内部类里有静态方法的调用方式
public class DemoTest {
public static void main(String[] args) {
//Inner1
/*静态内部类里有非静态方法的调用方式*/
Demo.Inner1 d1 = new Demo.Inner1();
d1.print1();
/*静态内部类里有静态方法的调用方式*/
Demo.Inner1.print11();
}
}
public class Demo {
/*该类在类的内部,所以称为内部类。
由于前面有static,所以称为"静态内部类"*/
static class Inner1{
public void print1(){
System.out.println("Inner1");
}
public static void print11(){
System.out.println("static Inner1");
}
}
}
2、实例内部类的调用方法
public class DemoTest {
public static void main(String[] args) {
//Inner2
Demo d2 = new Demo();
Demo.Inner2 inner2 = d2.new Inner2();
inner2.print2();
}
}
public class Demo {
/*该类在类的内部,所以称为内部类。
没有static叫做实例内部类。*/
class Inner2{
public void print2(){
System.out.println("Inner2");
}
}
}
3、局部内部类的调用方法
public class DemoTest {
public static void main(String[] args) {
//Inner3
new Demo().doSome();
}
}
public class Demo {
public void doSome(){
/*局部变量*/
int i = 1;
/*该类在类的内部,所以称为内部类。
局部内部类*/
class Inner3{
public void print3(){
System.out.println("Inner3");
}
}
new Inner3().print3();// 通过内部类的实例化对象调用方法
}
}
- 匿名内部类
1、不使用匿名内部类
代码示例:
public interface Compute {
int sum(int a, int b);
}
public class Demo implements Compute{
@Override
public int sum(int a, int b) {
int c = a + b;
return c;
}
}
public class DemoTest{
public static void main(String[] args) {
DemoTest demoTest = new DemoTest();
demoTest.mySum(new Demo(),1,2);
}
public void mySum(Compute c, int x, int y){
int value = c.sum(x,y);
System.out.println(value);
}
}
2、使用匿名内部类后
代码示例:
public interface Compute {
int sum(int a, int b);
}
public class DemoTest{
public static void main(String[] args) {
DemoTest demoTest = new DemoTest();
/*demoTest.mySum(new Demo(),1,2);*/
demoTest.mySum(new Compute(){
public int sum(int a, int b) {
int c = a + b;
return c;
}
},1,2);
}
public void mySum(Compute c, int x, int y){
int value = c.sum(x,y);
System.out.println(value);
}
}
- 不建议使用匿名内部类。
1、因为一个类没有名字,没有办法重复使用。
2、另外代码太乱,可读性太差。
3、使用匿名内部类,表示这个Demo这个类没名字了。
4、这里表面看上去好像是接口可以直接new了,实际上并不是接口可以new了。
5、后面的{ }代表了对接口的实现。