java之静态内部类/非静态类内部类的创建

内部类解读


一、内部类写法

1.非静态内部类创建方式之一

package test;
public class TestClass  {
    public class Inner{
       void fun(){
            System.out.println(1);
        }
    }
}
package test;
import test.TestClass.Inner;  // 请注意这里,一定一定要导入内部类文件,不然(1)会报错
public class Implements {
    public static void main(String[] args) {
        TestClass test = new TestClass();
        Inner inner = test.new Inner();    (1)
        inner.fun();
    }
}
//结果
1

2.非静态内部类创建方式之二

package test;

public class Implements {
    public static void main(String[] args) {
        TestClass test = new TestClass();  (1)//(1)(2)可用  TestClass.Inner inner = new TestClass().new Inner();代替
        TestClass.Inner inner = test.new Inner();   (2)
        //注意这里Inner并不是静态类,用“外部类名.内部类 ” 是为了将它们看成一个整体
        inner.fun();
    }
}
//结果
1

3. 静态内部类创建方式

package test;
public class TestClass  {
    public static class Inner{
       void fun(){
            System.out.println(1);
        }
    }
}
public class Implements {
    public static void main(String[] args) {
        TestClass.Inner inner = new TestClass.Inner();
        inner.fun();
    }
}
//结果
1

区别

一个类文件中,只能有一个公共的(public)外部类,但可以有多个(public、default、private)内部类,多个(default)外部类,private不能用来修饰外部类!

如图·:当试图申明多个public外部类时保错,外部类也不能用private来修饰
在这里插入图片描述


(1)静态内部类只能访问外部类的静态方法,静态属性,静态方法,如图,当静态内部类试图访问非静态变量和非静态方法时编译器报错了:

(2)而普通的内部类可以访问外部类的任何属性和方法(静态、非静态、私有、公共、默认)
在这里插入图片描述


(3)只有静态内部类,才能在类中申明静态方法,普通内部类申明静态方法会报错。

(4)外部类不能直接访问所有内部类的成员和方法,但可以通过创建内部类对象的方式进行访问。

(5)外部类和内部类拥有同名的变量和方法时,内部类有需要进行访问外部的同名变量或方法,可以通过外部类.this.方法名/变量名进行访问。
在这里插入图片描述

拓展

除了静态内部了、普通内部类外,还有一个局部内部类,匿名内部类其实相当于它儿子,只是把类名这些都省略了。它在实际开发中用的很少,它是在方法中定义的类,既然是方法里头的东西,那么它就不能定义静态类,静态变量或静态方法了,如图,编译器直接报错
在这里插入图片描述
它的申明不能用public和private、procted修饰,可以用final和abstract修饰,另外,它也能正常访问外部类的变量,但在访问局部变量时网上有很多人说它只能访问final类型的局部变量,于是我做了如下实验:
在这里插入图片描述
结果
在这里插入图片描述
运行后,发现还是可以正常访问,而且我还用了jdk1.7和1.8做了测试,发现都可以,jdk1.7之前的因为没有就没测试了。
在这里插入图片描述
但是若果是访问方法的参数的话,jdk1.8不会报错,但1.7报错了,如图是jdk1.8的。
在这里插入图片描述
猜测是JVM问题,于是反编译了class文件:
在这里插入图片描述
从图中,可以看到,JVM为k加了final类型进行修饰但 j变量没有。所以,,,我也很方。。。。不知哪位道友可解?

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

legendaryhaha

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值