栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

week02

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

week02

week02_Exercise_02 简答题: 第一题:内部类

1、总结一下局部内部类的成员特点。

答:和内部成员一样,没有静态声明。

没有静态成员变量,静态成员方法,以及静态代码块、但是可以定义字面值常量赋值的全局常量

第二题:局部内部类

2、总结一下局部内部类的访问特点。(要分外围类成员方法中和静态方法中的局部内部类两种情况)

答:外围类成员方法中局部内部类对象,由于会持有外围类的对象的引用作为成员变量,所以可以直接访问外围类

而外围类静态成员方法中局部内部类对象,不持有任何外围对象,所以需要先创建外围类的对象再访问成员

第三题:局部内部类访问

3、在局部内部类当中访问作用域内部的局部变量,可以修改它的取值吗?

答:不可以修改,是常量

第四题:匿名内部类

4、匿名内部类的语法得到的是什么?(对象还是类?什么对象?)

答:对象,而且是语法结构中"类名/接口名"的子类对象

第五题:匿名内部类结构

5、匿名内部类语法中的大括号是什么结构?这个大括号中能定义什么?

答:是匿名子类的类体,可以定义成员变量,成员方法,但没有构造器,也没有代码块以及静态声明

第六题:Lambda的语法

6、Lambda的语法得到的是什么?(对象还是类?什么对象?)

答:是功能接口的子类对象

第七题:Lambda的语法结构

答:是功能接口中,必须要子类实现的抽象方法的重写方法体。方法体中定义的是局部变量

第八题:功能接口

8、什么是功能接口?

答:功能接口要求接口中有且仅有一个必须要实现的抽象方法

可以使用注解"@FunctionalInterface"标记它。

1、功能接口中只能有一个方法吗?

答:不是,Java8之后接口中允许定义默认方法和静态方法,这两种方法不需要子类实现

2、功能接口中只能有一个抽象方法吗?

不是,实际上来说:某些抽象方法不需要子类实现Java中每个类都继承父类Object那么如果一个抽象方法,可以用Object类的方法作为实现,那么该抽象方法,就不需要子类实现。

比如接口中的以下抽象方法:

boolean equals(Object o); int hashCode();

编程题: 成员内部类语法练习

成员内部类对象依赖于它的外围类对象

package day10;


public class InnerClazzDemo {
    public static void main(String[] args) {
        Dog dog = new Dog(10, "Tom", "黄色");
        dog.showDog();
    }
}

class Dog {
    private int age;
    private String name;
    private DogBody db;

    // 成员内部类
    private class DogBody {
        private String color;

        private DogBody(String color) {
            this.color = color;
        }

        private DogBody() {
        }
    }

    public void showDog() {
        System.out.println("狗的年龄是:" + this.age + "岁t名字是:" + this.name + "t颜色是:" + this.db.color);
    }

    public Dog(int age, String name, String color) {
        this.age = age;
        this.name = name;
        this.db = new DogBody(color);
    }

    // 为了保证正常给DogBody对象初始化,私有化无参构造或者干脆不提供
    private Dog() {
    }
}

运行结果图:

用内部类来实现接口
 定义一个接口Compute,用来完成计算器的功能,比如最简单的加减乘除功能。
 请用以下两种方式测试:
   1,编写实现类进行测试
   2,用局部内部类进行测试
   3,使用匿名内部类进行测试
package day10;


@SuppressWarnings({"all"})
public class InterfaceInnerDemo {
    public static void main(String[] args) {
        System.out.println("-----创建实现类对象的方式-------");
        ICalcImpl iCalc = new ICalcImpl();
        System.out.println(iCalc.add(10, 20));
        System.out.println(iCalc.subtract(10, 20));
        System.out.println(iCalc.multiply(10, 20));
        System.out.println(iCalc.divide(10, 20));
        System.out.println("------创建实现类对象的方式------");
        
        System.out.println("----------局部内部类的方式-----------");
        class Inner implements ICalc {
            @Override
            public int add(int a, int b) {
                return a + b;
            }

            @Override
            public int subtract(int a, int b) {
                return a - b;
            }

            @Override
            public int multiply(int a, int b) {
                return a * b;
            }

            @Override
            public int divide(int a, int b) {
                return a / b;
            }
        }
        Inner inner = new Inner();
        System.out.println(inner.add(10, 20));
        System.out.println(inner.subtract(10, 20));
        System.out.println(inner.multiply(10, 20));
        System.out.println(inner.divide(10, 20));
        System.out.println("----------局部内部类的方式-----------");

        System.out.println("-------匿名内部类的方式----------");
        ICalc ic = new ICalc() {
            @Override
            public int add(int a, int b) {
                return a + b;
            }

            @Override
            public int subtract(int a, int b) {
                return a - b;
            }

            @Override
            public int multiply(int a, int b) {
                return a * b;
            }

            @Override
            public int divide(int a, int b) {
                return a / b;
            }
        };
        System.out.println(inner.add(10, 20));
        System.out.println(inner.subtract(10, 20));
        System.out.println(inner.multiply(10, 20));
        System.out.println(inner.divide(10, 20));
    }

    // @FunctionalInterface
    interface ICalc {
        int add(int a, int b);

        int subtract(int a, int b);

        int multiply(int a, int b);

        int divide(int a, int b);
    }

    // 写实现类,然后创建对象
    static class ICalcImpl implements ICalc {
        @Override
        public int add(int a, int b) {
            return a + b;
        }

        @Override
        public int subtract(int a, int b) {
            return a - b;
        }

        @Override
        public int multiply(int a, int b) {
            return a * b;
        }

        @Override
        public int divide(int a, int b) {
            return a / b;
        }
    }
}

运行结果如图:

Lambda表达式的练习

lambda表达式的书写,除了注意格式外,最重要的是关注类型推断

  • 提供以下6个功能接口,请用lambda表达式分别创建对象,调用test()方法
  • 自由发挥lambda表达式的书写
//无返回值无参数的功能接口
@FunctionalInterface
interface INoReturnNoParam {
    void test();
}

//无返回值有一个参数的功能接口
@FunctionalInterface
interface INoReturnOneParam {
    void test(int a);
}

//无返回值两个参数的功能接口
@FunctionalInterface
interface INoReturnTwoParam {
    void test(int a, int b);
}

//有返回值无参数的功能接口
@FunctionalInterface
interface IHasReturnNoParam {
    int test();
}

//有返回值一个参数的功能接口
@FunctionalInterface
interface IHasReturnOneParam {
    int method(int a);
}

//有返回值两个参数的功能接口
@FunctionalInterface
interface IHasReturnTwoParam {
    int test(int a, int b);
}
package day10;


public class LambdaBasicDemo {
    public static void main(String[] args) {
        INoReturnNoParam irl = () -> {
            System.out.println("无返回值无参数的功能接口");
        };
        irl.test();

        ((INoReturnOneParam) a -> {
            System.out.println("无返回值有一个参数的功能接口,其参数是:" + a);
        }).test(10);

        INoReturnTwoParam ir2 = (a, b) -> System.out.println("无返回值两个参数的功能接口,两个参数是a:" + a + " b: " + b);

        ir2.test(10, 20);
        IHasReturnNoParam ir3 = () -> {
            int a = 10;
            int b = 20;
            return a + b;
        };
        System.out.println("有返回值无参数的功能接口,其返回值是:" + ir3.test());

        IHasReturnOneParam ir4 = a -> ++a;
        System.out.println("有返回值一个参数的功能接口,其返回值是" + ir4.test(10));

        IHasReturnTwoParam ir5 = (a, b) -> a + b;
        System.out.println("有返回值两个参数的功能接口,其返回值是:" + ir5.test(1, 2));
    }
}

//无返回值无参数的功能接口
@FunctionalInterface
interface INoReturnNoParam {
    void test();
}

//无返回值有一个参数的功能接口
@FunctionalInterface
interface INoReturnOneParam {
    void test(int a);
}

//无返回值两个参数的功能接口
@FunctionalInterface
interface INoReturnTwoParam {
    void test(int a, int b);
}

//有返回值无参数的功能接口
@FunctionalInterface
interface IHasReturnNoParam {
    int test();
}

//有返回值一个参数的功能接口
@FunctionalInterface
interface IHasReturnOneParam {
    int test(int a);

}

//有返回值两个参数的功能接口
@FunctionalInterface
interface IHasReturnTwoParam {
    int test(int a, int b);
}

运行结果图:

alInterface
interface INoReturnTwoParam {
void test(int a, int b);
}

//有返回值无参数的功能接口
@FunctionalInterface
interface IHasReturnNoParam {
int test();
}

//有返回值一个参数的功能接口
@FunctionalInterface
interface IHasReturnOneParam {
int test(int a);

}

//有返回值两个参数的功能接口
@FunctionalInterface
interface IHasReturnTwoParam {
int test(int a, int b);
}

运行结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/9c2e83822d5a488b940ae6fcee5b5acc.png#pic_center)


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/925098.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号