非静态内部类:1、非静态有名内部类。2、非静态匿名内部类。
静态内部类:1、静态有名内部类。2、静态匿名内部类。
非静态内部类:
public class Body{
class Heart { //非静态有名内部类,
void work() {
System.out.println("bulabula ...");
}
}
}
如何调用非静态有名内部类的方法?
非静态的方法都需要对象调用,内部类也不例外,但是每次内部类实例化对象时,都需要先实例化一个外部类对象。
实例化格式:
外部类类名 外部实例化对象名 = new 外部类类名();
内部类类名 内部实例化对象名 = 外部实例化对象名.new内部实例化对象名();
或者:
内部类类名 内部实例化对象名 = new 外部类类名().new内部实例化对象();
具体程序如下:
1、外部类非静态方法调用:
public void getheart(){
Heart heart = new Heart();(其实是与上述实例化对应,为this.new Heart();,默认有this,如果是静态中就没有this。包括静态方法和静态代码块。)
heart.work();
}
2、外部类静态方法调用:
public void getheart2(){
Heart heart2 = new Body().new Heart();
heart2.work();
}
静态方法调用内部类方法,必须先创建一个与外部类绑定的内部类对象,用这个对象去调用内部类方法。
静态内部类
static class Stomach {//静态内部类。
void work() {
System.out.println("bulabula ...");
}
静态方法的调用只能用外部类名或者外部实例化对象来调用。
1、外部类非静态方法调用:
public void getstomach(){
new Stomach().work;//直接使用内部类名去调用
}
2、外部类静态方法调用:
static void getstomach2() {
new Stomach().work();//同样也可以通过内部类名直接调用。
}
注意:如果外部类方法和内部类不在一个外部类下,那么在外部类方法调用静态内部类时需要指定说明是哪一个外部类。
方法如下:
外部类 外部类实例化对象 = new 外部类();
外部类实例化对象.外部类方法();
为什么静态方法可以这么调用?
静态的在类加载的时候处理:静态变量直接赋值 静态方法直接分配地址 静态代码块直接执行;——JVM对静态的操作比非晶态的靠前。所以在运行的时候,内存已经存在了一个外部类对象,所以不需要再实例化一个外部对象。
注意:
1、静态匿名内部类的命名方法:就是在匿名内部类前加上static即可!
static Body body1 =new Body() {
@Override
public void move() {
System.out.println("跳动......");
}
};
2、只有有名静态内部类才允许有静态属性、静态方法、静态代码块。
lambda
其表达式始于Java 8,它的出现简化了函数式接口匿名内部类的语法,其表达式语法如下:([参数1], [参数2], [参数3],… [参数n])->{代码块}
示例如下:
通过函数式接口计算a+b,方法非常的冗长。
但是通过Lambda表达式就非常简单。