1 成员内部类创建对象 外部类.内部类
对象名=new 外部类对象.new内部类对象
Outer.Inner i=new Quter().new Inner();
内部类可以访问外部类私有
外部类访问内部类 需要创建对象
外部类名.内部类名 对象名=new 外部类对象.new内部类对象
私有内部类 不能通过上述方法创建对象,在自己所在的内部类中创建对象
静态内部类 创建对象 外部类名.内部类名 对象名=new 外部类名.内部类名();
package com.yang.innerClass;
public class Car {
String brand="外部类小马";
class Engin{
String brand="内部类中马";
public void run(){
String brand="局部老马";
System.out.println(brand+this.brand+Car.this.brand);
}
}
}
package com.yang.innerClass;
public class MTest {
public static void main(String[] args) {
Car.Engin c=new Car().new Engin();
c.run();
}
}
2 局部内部类(该类在类的成员方法中)
只能在内部类所在的方法中,创建对象并访问
该内部类可以访问外部类成员,也可以访问方法的局部变量
匿名内部类
new 接口名 或者类名(){
重写方法
}.方法
package com.yang.innerclass;
public class MTest {
public static void main(String[] args) {
new Inner(){
public void study(){
System.out.println("好好学习");
}
public void show(){
System.out.println("show......");
}
}.show();
}
}
想用两个方法 Inner i=new Inner(){实现}; i.方法;
package com.yang.innerclass;
public interface Inner {
public abstract void study();
public void show();
}
Lambda表达式 函数式编程思想 (自己想做什么)
1 必须是接口
2 抽象方法数量必须是一个,只能是一;
三要素 形式参数 箭头 代码块
(形式参数) -> {代码块}
package com.yang.Lambda;
public class TestLambda {
public static void main(String[] args) {
useShowHandler(()-> System.out.println("Labmbda使用方法"));
}
public static void useShowHandler(ShowHandler showHandler){
showHandler.show();
}
}
interface ShowHandler{
void show();
}
package com.yang.Lambda;
public class TestLambda1 {
public static void main(String[] args) {
printMessage((String mes)->{
System.out.println("匿名内部类"+mes);
});
}
public static void printMessage(StringHander stringHander){
stringHander.printMessage("王");
}
}
interface StringHander{
void printMessage(String mes);
}
Lambda无参带有返回值
package com.yang.innerReturn;
import java.util.Random;
public class MTest {
public static void main(String[] args) {
getNum(()->{
Random random=new Random();
int i=random.nextInt(10)+1;
return i;
});
}
public static void getNum(InnerHander innerHander){
System.out.println(innerHander.getNum());
}
}
package com.yang.innerReturn;
public interface InnerHander {
int getNum();
}
Lambda 有参数有返回值 和上面的例子类似就不写了
Lambda省略模式 参数可以省略,如果参数有多个不能只省略一个,参数只有一个可以省略小括号,大括号中只有一条语句 大括号可以省略 renturn 可以省略,分号可以省略
package com.yang.innerReturn1;
import com.yang.innerReturn.InnerHander;
import java.util.Random;
public class MTest {
public static void main(String[] args) {
getNum(()-> new Random().nextInt(10)+1
);
}
public static void getNum(InnerHander innerHander){
System.out.println(innerHander.getNum());
}
}
Lambda表达式和匿名内部类