20220728学习内容 静态内部类和局部内部类

一  静态内部类:

基础语法:
public class A1 {
public static class B1 {} // 静态内部类
}

静态内部类的特点:
和其他类一样,它只是定义在外部类中的另一个完整的类结构
        可以继承自己的想要继承的父类,实现自己想要实现的父接口们,和外部类的父类和父接口无 关
        可以在静态内部类中声明属性、方法、构造器等结构,包括静态成员
        可以使用abstract 修饰,因此它也可以被其他类继承
        可以使用final 修饰,表示不能被继承
        编译后有自己的独立的字节码文件,只不过在内部类名前面冠以外部类名和$ 符号。
和外部类不同的是,它可以允许四种权限修饰符: public protected ,缺省, private
        外部类只允许public 或缺省的
可以在静态内部类中使用外部类的 静态成员
        在静态内部类中不能使用外部类的非静态成员哦
在外部类的外面不需要通过外部类的对象就可以创建静态内部类的对象
如果在内部类中有变量与外部类的静态成员变量同名,可以使用 外部类名 ." 进行区别
静态内部类中,可以有静态数据、静态方法或者又一个静态内部类
class B1 {
static class C1 {// 在静态内部类中才可以定义静态成员
private static int age = 123;
private String pwd="123456";// 同时允许定义非静态成员
static {
System.out.println("c1 static...");
}
public static void pp() {
System.out.println("c1 static pp...");
}
public void ff(){// 同时允许定义非静态成员
}
static class D1{}
class E1{}
}
}

 如何使用静态内部类

public class A1 {
public static void main ( String [] args ) {
B1 . C1 cc = new B1 . C1 (); // 不需要构建外部类对象,就可以直接创建静态内部类对
象,但是是否可见取决于范围限定词
B1 . C1 . pp (); // 可以直接访问静态内部类中的静态成员,但是是否可见取决于范围限定
cc . ff ();
}
}

静态内部类中,也可以有非静态数据、非静态方法或者又一个非静态内部类

静态内部类中,不能访问外部类的非静态成员,这是由 Java 语法中【静态方法不能直接访问非静态
成员】所限定
class B1 {
private static String name1 = "yan1";
private double salary = 123.456;
static class C1 {
private static int age = 123;
private String pwd = "abc";
public static void pp() {
System.out.println(age);// 静态方法只能访问静态成员
// System.out.println(this.age); 在靜態方法中不允許使用 this 或者
super
// System.out.println(pwd); 语法报错
System.out.println(name1);// 静态内部类中可以直接访问外部类中的静
态成员
dd();
// System.out.println(salary); 语法报错,因为静态方法只能访问静态成
}
public void fff() {
System.out.println(this.age);
System.out.println(pwd);// 当前类中的非静态成员
System.out.println(name1);// 不允许使用 B1.this 或者 this. 进行访
, 不允许使用 B1.this 是因为构建 C1 类对象时没有要求必须构建外部类对象
// System.out.println(salary); 报错的原因是构建构建 C1 类对象时没有
要求必须构建外部类对象
dd();
// ee();z 直接访问 ee 方法报错,构建构建 C1 类对象时没有要求必须构建外部类
对象
}
}
private void ee() {
}
private static void dd() {
}
}

二  局部内部类 :

可以将内部类定义在一个方法或者一个代码块内
public class A1 {
private int age = 123 ;
public static void main ( String [] args ) {
A1 aa = new A1 ();
}
public void pp () {
Date birth = new Date ();
// B1 bb=new B1(); 语法错误,要求局部内部类必须先定义后使用
class B1 { // 局部内部类,只能在所在的 {} 范围中使用 , 具备内部类的范围限定词和临
时变量一致 , 只能添加 final 或者 abstract
public void ff () {
System . out . println ( age );
A1 . this . age = 555 ; // 可以直接访问外部类中的成员
System . out . println ( birth );
// 语法报错,在局部内部类中使用外部的临时变量,则外部临时变量必须是
final 的,只是 final 可以省略
// birth = new Date(); 针对引用类型修改地址是不允许,但是可以修改属性
System . out . println ( "B1...ff()" );
}
}
B1 bb = new B1 ();
}
}

 局部内部类的特点:

和外部类一样,它只是定义在外部类的某个方法中的另一个完整的类结构
        可以继承自己的想要继承的父类,实现自己想要实现的父接口们,和外部类的父类和父接口无 关
        可以在局部内部类中声明属性、方法、构造器等结构,但不包括静态成员,除非是从父类继承 的或静态常量
        可以使用abstract 修饰,因此它也可以被同一个方法的在它后面的其他内部类继承
        可以使用final 修饰,表示不能被继承
        编译后有自己的独立的字节码文件,只不过在内部类名前面冠以外部类名、$ 符号、编号。
和成员内部类不同的是,它前面不能有权限修饰符等
局部内部类如同局部变量一样,有作用域
局部内部类中是否能访问外部类的静态还是非静态的成员,取决于所在的方法
局部内部类中还可以使用所在方法的局部常量,即用 final 声明的局部变量
J        DK1.8之后,如果某个局部变量在局部内部类中被使用了,自动加 final
注意:局部内部类需要先定义后使用,不能是先使用后定义
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值