1、内部类详解
定义:
一个类的内部又完整的嵌套了另一个类结构。被嵌套的类称为内部类,嵌套它的类称之为外部类。
特点:
可以直接访问私有属性,可以提现类与类之间的包含关系
注意:
内部类是重点,也是学习难点,源代码有大量的内部类
语法:
class Outer{ //外部类 class Inner{ //内部类 } } class Other{ //外部其他类 }
public class ClassStructure { //其它外部类 public static void main(String[] args) { Outer outer = new Outer(); } } class Inner { //内部类 private String name; //属性 private int age; public Inner(String name, int age) { //构造器 this.name = name; this.age = age; System.out.println("姓名: " + this.name + ", 年龄: " + this.age); } } class Outer { //外部类 private void run() { //方法 System.out.println("方法。。。。"); } { //代码块 System.out.println("代码块。。。。"); } Inner inner = new Inner("张三", 18); }
2、内部类分类
1)定义在外部类局部位置上
局部内部类(有类名)
匿名内部类(没有类名)
2)定义在外部类成员位置上
成员内部类(没用static修饰)
静态内部类(使用static修饰)
3、局部内部类的使用
局部内部类是定义在外部类的局部位置,例:方法带有类名
1、可以直接访问外部类的所有成员,包含私有
2、不能添加访问修饰符,它是一个局部变量。局部变量不能使用修饰符,可以使用final修饰
3、作用域:方法或代码块中
4、局部内部类访问外部类成员直接访问
5、外部类访问内部类成员,创建新的对象,再访问(作用域内)
6、外部其它类不能访问局部内部类
7、外部类和内部类成员重名,遵循就近原则,或者使用外部类名.this.类名
public class ClassStructure { //其它外部类 public static void main(String[] args) { Outer outer = new Outer(); outer.run(); } } class Outer { //外部类 private String name = "李四"; private void eat(){ System.out.println("苹果好吃"); } public void run() { //方法 /* 局部内部类是定义在外部类的局部位置,一般在方法内 不能添加访问修饰符,可以使用final 作用域:方法或代码块中 */ final class Inner2{ //局部内部类,其实还是一个类 //可以直接访问外部类的所有成员 private void running(){ //外部类和内部类成员重名,遵循就近原则,或者使用外部类名.this.类名 String name = "王五"; name = Outer.this.name; System.out.println(name); eat(); } } Inner2 inner2 = new Inner2(); inner2.running(); } }
4、匿名内部类的使用
1、本质是类
2、没有类名
3、内部类
4、是一个对象
注意:
匿名内部类是一个类的定义,它也是一个对象,既有定义类特征,也有创建对象的特征。
语法:
new 类或接口(参数列表){ 类体 }
interface Sports{ void run(); } public class ClassStructure { //其它外部类 public static void main(String[] args) { //当做实参直接传递使用 person(new Sports() { @Override public void run() { System.out.println("喜欢跑步。。。。。。。。"); } }); } //静态方法,形参接口类型 public static void person(Sports sports){ sports.run(); } }