活动地址:CSDN21天学习挑战赛
目录
内部类
1,概述
1、Java中允许将一个类A声明在另一个类B中,则类A是内部类,类B为外部类
2、内部类的分类:成员内部类(静态、非静态) vs 局部内部类(方法内、代码块内、构造器内)
2,成员内部类
1、作为外部类的成员:
a、调用外部类的结构
b、可以被static修饰
c、可以被4种不同的权限修饰
2、作为一个类:
a、类内可以定义属性、方法、构造器等
b、可以被final修饰
c、可以被abstract修饰
3,举例
class Person{ String name = "小明"; int age; public void eat() { System.out.println("人吃饭"); } //静态成员内部类 static class Dog{ String name; int age; public void show() { System.out.println("dog"); } } //非静态成员内部类 class Bird{ String name = "杜鹃"; public Bird() { } public void sing() { System.out.println("唱歌"); Person.this.eat();//调用外部类的非静态属性 System.out.println(age); } public void display(String name) { System.out.println(name);//方法的形参 System.out.println(this.name);//内部类的属性 System.out.println(Person.this.name);//外部类的属性 } } public void method() { //局部内部类 class AA{ } } { //局部内部类 class BB{ } } public Person() { //局部内部类 class CC{ } }
测试类
public class Test { public static void main(String[] args) { //创建Dog实例(静态成员内部类): Person.Dog dog = new Person.Dog(); dog.show();//dog //创建Bird实例(非静态成员内部类): // Person.Bird bird = new Person.Bird(); Person p = new Person(); Person.Bird bird = p.new Bird(); bird.sing();//唱歌 人吃饭 0 System.out.println(); bird.display("麻雀");//麻雀 杜鹃 小明 } }
输出结果
dog 唱歌 人吃饭 0 麻雀 杜鹃 小明
4,补充
在局部内部类的方法中(比如:show)
如果调用局部内部类所声明的方法(比如:method)中的局部变量(比如num)的话
要求此局部变量声明为final的
public class Test { public void method() { //局部变量 int num = 10; class AA{ public void show() { // num = 20; System.out.println(num); } } } }
JDK 7及之前版本:要求此局部变量显式声明为final
JDK 8及之后版本可以省略final声明
**
JAVA 8新特性
1、接口中定义的静态方法只能通过接口来调用
2、通过实现类的对象可以调用接口中的默认方法
3、如果子类(或实现类)继承的父类和实现的接口中声明了同名同参数的方法,在子类没有重写的情况下,默认调用的是父类中同名同参数的方法
4、如果实现类实现了多个接口,多个接口中定义了同名同参数的默认方法
那么在实现类没有重写此方法的情况下,编译不通过 --- 接口冲突
提醒:在发布作品前请把不用的内容删掉(活动地址请保留)