分类
第一类:定义在外部类局部位置上,分为局部内部类( 有 类名)、匿名内部类(没有类名)。
第二类:定义在外部类的成员位置上,分为成员内部类(没有static修饰)、静态内部类(使用static修饰)。
一:局部内部类
public class TestDemo {
public static void main(String[] args) {
Person person = new Person();
person.method2();
}
}
class Person{//外部类
private String name = "张三";
private int age = 20;
private void method1(){
System.out.println("外部类中的method1方法");
}
public void method2(){
final class Student{//局部内部类可以加fianl关键字
private String name = "王五";
public void method3(){
method1();//可以访问外部类中的成员
}
}
/**
* 外部类访问局部内部类的方式:创建对象再访问
*/
Student student = new Student();
student.method3();
}
}
二 成员内部类
class People{//外部类
private String name = "张三";
private int age = 20;
private void hi(){
System.out.println("打招呼");
}
public class Student{//内部类
private String name = "李四";
private int age = 21;
public void say(){
System.out.println("name="+name+" age="+People.this.age);
}
}
public void method(){//外部类访问内部类
Student student = new Student();
student.say();
}
}
三 静态内部类
public class TestDemo {
public static void main(String[] args) {
People person = new People();
person.method();
}
}
class People{//外部类
private String name = "张三";
private int age = 20;
private void hi(){
System.out.println("打招呼");
}
public static class Student{//静态内部类
private String name = "李四";
private int age = 21;
public void say(){
System.out.println("name="+name+" age="+this.age);
}
}
public void method(){//外部类访问内部类
Student student = new Student();
student.say();
}
}
四 匿名类
本质上是一个没有名字的局部内部类,定义在方法中、代码块中等。 作用:方便创建子类对象,最终目的为了简化代码编写。
语法结构
new 类|抽象类名|或者接口名() {
重写方法;};
举例:
public class Test {
public static void main(String[] args) {
// Animal a = new Tiger();
// a.run();
new Animal(){
@Override
public void run() {
System.out.println("老虎跑的块~~~");
}
}.run();
}
}
//class Tiger extends Animal{
// @Override
// public void run() {
// System.out.println("老虎跑的块~~~");
// }
//}
abstract class Animal{
public abstract void run();
}
java8新特性的的应用
List<String> items = new ArrayList<>();
items.add("A");
items.add("B");
items.add("C");
items.add("D");
items.add("E");
//单独的 forEach 写法
Consumer consumer = new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
};
items.forEach(consumer);
System.out.println("forEach结合Lambda写法==========");
//输出 A,B,C,D,E
items.forEach(s -> {
System.out.println(s);
});