内部类和lambda表达式

目录

1、内部类

1.1、内部类概念

 1.1.1 内部类特点

 1.2、匿名内部类

 1.3、局部内部类(方法内部类)

 1.4、静态内部类

 1.5、为什么使用内部类?

2、lambda表达式

2.1 lambda的表达式语法

2.2 lambda表达式精简语句


1、内部类

1.1、内部类概念

        就是在一个类中定义一个类,就是内部类。

 1.1.1 内部类特点

        (1)内部类可以直接访问外部类的成员,包括私有

        (2)外部类要访问内部类的成员,必须创建对象

        口诀:内用外,随意访问;外用内,需要内部类对象。

public class InnerClassFormat {

    /**
     * 内部类 定义格式
     */
    private int age = 10;

    public void showTime() {
        //外部类使用内部类属性,需要new
        InnerClass inner = new InnerClass();
        inner.show();
        // 调用内部类的私有属性
        System.out.println(inner.name);

    }
    class InnerClass {
        private String name = "小明";

        //访问 外部类的私有属性
        public void show() {
            System.out.println(age);
        }
    }
}

 1.2、匿名内部类

        本质:是继承了该类(子类)或者实现了该接口的(实现类)匿名对象;

        使用匿名内部类,是可以直接不需要写实现类。

public class NoneNameClass {
    public static void main(String[] args) {
        /**
         * 定义匿名内部类
         */
        NoneNameFace face = new NoneNameFace() {
            @Override
            public void show() {
                System.out.println("接口,匿名内部类");
            }
        };
        face.show();

        //抽象类
        NoneAbstractClass noc = new NoneAbstractClass() {
            @Override
            public void getAbstract() {
                System.out.println("抽象类,匿名内部类");
            }
        };
        noc.getAbstract();

    }
}

1.3、局部内部类(方法内部类)

        在方法里面定义的内部类,就是 局部内部类(方法内部类)。

        局部内部类 只能够在方法里面访问,不能够在外界(方法外)访问,需要在方法内创建对象,并使用该类可以直接访问外部类的成员,也可以访问方法内的局部变量。

public class LocalityClassFormat {
    /**
     * 局部内部类
     */
    public void getLocality() {
        class LocalityClass {
            public void localMethod() {
                System.out.println("我是局部内部类!");
            }
        }
        // 外部类调用方式
        LocalityClass locality = new LocalityClass();
        locality.localMethod();
    }
}

1.4、静态内部类

        有static关键字修饰的内部类为静态内部类;

        静态内部类访问外部类的静态成员变量或方法必须是静态的。

public class StaticClassFormat {
    /**
     * 静态内部类
     */
    private static int a = 10;

    public static void out() {
        // 静态内部类只能调用外部类的静态属性、方法
        System.out.println("外部类静态方法");
    }

    public static class StaticClass {
        public void staticMethod() {
            System.out.println(a);
            out();
            System.out.println("静态内部类!");
        }
    }
}

----------------------------------------------------------------------------------------
  public static void main(String[] args) {
        // 静态内部调用方式
        StaticClassFormat.StaticClass stc = new StaticClassFormat.StaticClass();
        stc.staticMethod();
    }

1.5、为什么使用内部类?

(1)可以实现多重继承

(2)内部类可以对同一个包中的其他类隐藏起来,非内部类是不允许有private和protected权限的

内部类定义规则

class Test001{
        //内部类不允许定义静态变量(除静态内部类)
        //1、这样编译器会在编译的时候将这种语句变成常量值
        static final int A = 10;
        //2、 这样不可以,虽然也为static final 但是说到底还是变量对象,所以不可以这样
        static final String str = new String("");
        //3、与上相同
        static Test01 test01 = new Test01();
    }

2、lambda表达式

     2.1 lambda的表达式语法

(参数列表) ->{ 方法体 }

说明:()用来描述参数列表;

{ } : 用来描述方法体;

-> :lambda运算符,可以叫做箭头符号

(int a,int b)->{return a+b};

public class Main {
    public static void main(String[] args) {

        System.out.println("==== lambda表达式 ====");
        NotAll notAll = () -> {
            System.out.println("\n无参数无返回值");
        };
        notAll.show();

        OneNotReturn oneNotReturn = (int a) -> {
            System.out.println("\n单个参数无返回值 a=" + a);
        };
        oneNotReturn.show(12);

        TwoNotReturn twoNotReturn = (int a, int b) -> {
            System.out.println("\n两个参数无返回值 a + b = " + (a + b));
        };
        twoNotReturn.show(12, 13);

        YesReturnNot yesReturnNot = () -> {
            return 5;
        };
        System.out.println("\n有返回值无参数:" + yesReturnNot.show());

        YesReturnYes yesReturnYes = (int a) -> {
            return a;
        };
        System.out.println("\n有返回值有参数的:" + yesReturnYes.show(7));

        MultiParameter multiParameter = (int a, int b) -> {
            return a + b;
        };
        System.out.println("\n多参数有返回值:" + multiParameter.show(1, 3));
    }
}

2.2 lambda表达式精简语句

/**
 * lambda表达式精简语句
 */
public class Grammar {
    public static void main(String[] args) {
        // 1、参数类型可以省略
        OneNotReturn oneNotReturn1 =
                (a) -> {
                    System.out.println("单个参数无返回值 a=" + a);
                };
        oneNotReturn1.show(1);

        // 2、如果参数只有一个,()可以省略
        OneNotReturn oneNotReturn2 =
                a -> {
                    System.out.println("单个参数无返回值 a=" + a);
                };
        oneNotReturn2.show(2);

        // 3、如果方法只有一条语句,{} 可省略
        OneNotReturn oneNotReturn3 =
                a ->
                        System.out.println("单个参数无返回值 a=" + a); //(4)
        //多条语句 执行顺序 ()
        System.out.println(1); // (1)
        System.out.println(2); // (2)
        System.out.println(4); // (3)
        oneNotReturn3.show(3);

        /** 4、如果方法中唯一的语句是 return 返回语句,
         * 那省略大括号的同时return 也要省略
         * 两个参数的括号是不能省略的
         */
        MultiParameter multiParameter = (a, b) -> a + b;
        System.out.println("多参数有返回值:" + multiParameter.show(1, 4));
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值