读书读着读着感觉实在难吸收,从第五章反射部分的内容开始书和视频结合着学习,故以下部分内容源于尚硅谷及java1234。
一.接口
1.既有父类又继承了接口,当父类与接口有同名变量时,分别调用的方法如下:
接口中定义的变量省略了public static final,为常量,故在子类中无法修改ball对象。
2.java8中接口的新特性
接口中可以实现default 方法,即子类可以选择不重写该方法,为代码后期的更新提供了便捷。 其调用必须通过实现类的对象才可以调用。
接口中定义的static方法,子类实现类都无法调用(直接显示undifined),只有接口自己可以调用。
若接口与父类中出现了同名同参数的方法,在没有重写的情况下,子类将调用父类的方法。
如果实现类同时实现了多个接口且这多个接口中有同名的default(默认)方法,要重写该方法,不重写的话会报错接口冲突。
二.内部类
1.实例化内部类:静态类:在调用内部类的构造方法时同时需要外部的调用。
非静态类,先有外部类的对象。
如此例中dog是person的静态内部类,bird是person的非静态内部类。
2. 成员的内部类中调用外部类的结构。
3.匿名内部类:
简单说,就是没有名称的内部类,当一个接口只有一个抽象方法,我们不想要通过子类来实现,比较麻烦,可以使用匿名内部类。
下面的例子中,传统的实现方式是,新建一个dog类继承抽象类animal并在其中重写animal类的eat方法,然后再main函数中新建dog类的对象,调用重写后的eat方法显示狗吃肉。而使用匿名类的两种方法相当于创建了抽象类的对象,并在其中直接重写抽象方法,然后直接调用eat方法。
另外,在匿名类外部的局部便令,如果匿名内部类想要访问,无法修改,因为其默认为final。
上面是抽象类的匿名内部类使用,下面为接口:(接口的对象,作为方法参数进行传递)
三.lambda表达式
lambda表达式是一个可传递的代码块,可以在以后执行一次或多次。用来替代匿名内部类。本质是一个函数。
eg(java1234)
下面的例子里面,使用lambda表达式代替匿名内部类,在括号中实现了抽象方法,此后直接通过接口的对象调用重写后的方法。
一些精简的语法:①参数类型可以省略
②只有一个参数的时候,小括号()可省略
③只有一条语句的时候大括号{}可以省略。
④如果那一条语句是return……,则要省略return。
在lambda表达式中有时需要调用其它方法,语法为 对象::方法名
接口的实现是通过构造方法实现的,那么语法为类名::new。
另外,与匿名内部类类似,lambda表达式所捕获的外部变量同样默认为final,在lambda表达式内不能对其修改。