非静态内部类
在类中直接定义的内部类,其作用可以参考成员变量
①非静态内部类在非静态方法中被调用
public class Body {
int age = 12;
class Heart{//非静态内部类
void work() {
System.out.println("doing......");
}
public void getHeart() {
System.out.println(this.age);//调用成员变量
Heart heart = this.new Heart();//创建内部类对象
}
}
public class AnBody{
public void listen(){
Body body = new Body();
Heart heart = body.new Heart();
}
}
因为此非静态方法在外部类中,所以在此可用this或不写(默认有this),在其他类的非静态方法中调用,则必须创建外部类对象。
②非静态内部类在静态方法中被调用
public class Body {
int age = 12;
class Heart{//非静态内部类
void work() {
System.out.println("doing......");
}
public static void getHeart() {
System.out.println(new Body().age);//调用成员变量
Heart heart = new Body().new Heart();//创建内部类对象
}
}
在静态方法中调用非静态内部类时,必须通过实例化外部类对象来调用。
在方法中定义的非静态内部类,可以通过直接实例化内部类对象使用
public class Body {
public static void main(String [] args){
class Test{
}
Test test=new Test();//在方法中定义的非静态内部类,可以通过直接实例化内部类对象使用
}
}
静态内部类
①静态内部类在方法中被调用(静态内部类只能直接定义在类中)
public class Body {
static int age = 12;
static class Heart{//静态内部类
void work() {
System.out.println("doing......");
}
public void getHeart() {
System.out.println(age);//调用成员变量
Heart heart = new Body.Heart();//创建内部类对象
}
}
public class AnBody{
public void listen(){
Heart heart = new Body.Heart();
}
}
因为此方法在外部类中,所以在此可用外部类名点或不写,在其他类的方法中调用,则必须指明外部类名。
②只有有名静态内部类中才允许有静态成员(静态属性、静态代码块和静态方法)
如上图,左侧是不被允许的,只有有名静态内部类中才允许有静态成员
补充
关于static
①static(静态):在定义成员变量,方法,内部类时的一个修饰词
②Jvm中:静态的在类加载的时候处理:静态变量直接赋值、静态方法直接分配地址、静态代码块直接执行。
③与非静态的不同:非静态的只能在创建对象时执行操作,故对于静态内存分配及执行先于非静态
④一个类中局部作用范围不能由static修饰
Lambda
①Java支持Lambda 表达式始于Java 8,它的出现简化了函数式接口匿名内部类的语法:其表达式语法:([参数1], [参数2], [参数3],… [参数n])->{代码块}
interface Iway{
int add(int a,int b);
}//一个接口Iway
class Test {
public static void main(String[] args) {
/*Iway imp=new Iway() {
public int add(int a,int b) {
return a+b;
}
};//匿名内部类实现接口*/
Iway imp =(int a,int b)- >{
return a+b;
};
}
}
②如果方法有返回值且只有一行代码,则Lambda表达式语法可以是这种形式:([参数1], [参数2], [参数3],… [参数n])->单行语句
interface Iway{
int add(int a,int b);
}//一个接口Iway
class Test {
public static void main(String[] args) {
/*Iway imp =(int a,int b)- >{
return a+b;
};*/
Iway imp =( a, b)- >return a+b;//简化后的Lambda表达式
}
}
③如果方法没有返回值且只有一行代码,则Lambda表达式语法可以是这种形式:([参数1], [参数2], [参数3],… [参数n])->单行语句
interface Iway{
void add(int a,int b);
}//一个接口Iway
class Test {
public static void main(String[] args) {
/*Iway imp =(int a,int b)- >{
System.out.println(a+b);
};*/
Iway imp =( a, b)- >System.out.println(a+b);//简化后的Lambda表达式
}
}