看代码理解内部类,局部内部类和静态内部类

内部类代码:

public class InnerTest {
private static String name;
private int age;
public InnerTest(String name, int age){
this.name = name;
this.age = age;
}
public void getInstance() {
System.out.println("name:" + name.toString() + ",age:" + age);
}
class A {
private String sex;
public A(String sex) {
this.sex = sex;
} public void getInstance() {
System.out.println(sex.toString() + name.toString());
}
}
public static void main(String[] args){
InnerTest innerTest = new InnerTest("张三",25);
innerTest.getInstance();
InnerTest.A ia = innerTest.new A("男");//内部类的实例化对象格式
ia.getInstance();
}
}

局部内部类:

public class InnerTest {
private static String name;
private int age;
public InnerTest(String name, int age){
this.name = name;
this.age = age;
}
public void getInstance() {
System.out.println("name:" + name.toString() + ",age:" + age);
}
public static class A {
private String sex;
public A(String sex) {
this.sex = sex;
} public void getInstance() {
class B{
private String like;
public B(String like){
this.like = like ;
}
public String getLike(){
return this.like.toString() ;
}
}
System.out.println(sex.toString() + name.toString()+",Like:"+new B("篮球").getLike());
}
}
public static void main(String[] args){
InnerTest innerTest = new InnerTest("张三",25);
innerTest.getInstance();
InnerTest.A ia = new A("男");//内部类的实例化对象格式
ia.getInstance();
}
}

静态内部类:

public class InnerTest {
private static String name;
private int age;
public InnerTest(String name, int age){
this.name = name;
this.age = age;
}
public void getInstance() {
System.out.println("name:" + name.toString() + ",age:" + age);
}
public static class A {
private String sex;
public A(String sex) {
this.sex = sex;
} public void getInstance() {
System.out.println(sex.toString() + name.toString());
}
}
public static void main(String[] args){
InnerTest innerTest = new InnerTest("张三",25);
innerTest.getInstance();
InnerTest.A ia = new A("男");//静态内部类的实例化对象格式
ia.getInstance();
}
}

下面说一说内部类(Inner Class)和静态内部类(Static Nested Class)的区别:
定义在一个类内部的类叫内部类,包含内部类的类称为外部类。内部类可以声明public、protected、private等访问限制,可以声明 为abstract的供其他内部类或外部类继承与扩展,或者声明为static、final的,也可以实现特定的接口。外部类按常规的类访问方式使用内部 类,唯一的差别是外部类可以访问内部类的所有方法与属性,包括私有方法与属性

(1)创建实例

OutClass.InnerClass obj = outClassInstance.new InnerClass(); //注意是外部类实例.new,内部类

AAA.StaticInner in = new AAA.StaticInner();//注意是外部类本身,静态内部类

(2)内部类中的this

内 部类中的this与其他类一样是指的本身。创建内部类对象时,它会与创造它的外围对象有了某种联系,于是能访问外围类的所有成员,不需任何特殊条件,可理 解为内部类链接到外部类。 用外部类创建内部类对象时,此内部类对象会秘密的捕获一个指向外部类的引用,于是,可以通过这个引用来访问外围类的成员。

(3)外部类访问内部类

内部类类似外部类的属性,因此访问内部类对象时总是需要一个创建好的外部类对象。内部类对象通过‘外部类名.this.xxx’的形式访问外部类的属性与方法。如:
       System.out.println("Print in inner Outer.index=" + pouter.this.index);
       System.out.println("Print in inner Inner.index=" + this.index);

(4)内部类向上转型

内部类也可以和普通类一样拥有向上转型的特性。将内部类向上转型为基类型,尤其是接口时,内部类就有了用武之地。如果内部类是private的,只可以被它的外部类问,从而完全隐藏实现的细节。

(5)方法内的类

方法内创建的类(注意方法中也能定义类),不能加访问修饰符。另外,方法内部的类也不是在调用方法时才会创建的,它们一样也被事先编译了。

(6)静态内部类

定义静态内部类:在定义内部类的时候,可以在其前面加上一个权限修饰符static。此时这个内部类就变为了静态内部类。

通常称为嵌套类,当内部类是static时,意味着:

[1]要创建嵌套类的对象,并不需要其外围类的对象;

[2]不能从嵌套类的对象中访问非静态的外围类对象(不能够从静态内部类的对象中访问外部类的非静态成员);

嵌 套类与普通的内部类还有一个区别:普通内部类的字段与方法,只能放在类的外部层次上,所以普通的内部类不能有static数据和static字段, 也不能包含嵌套类。但是在嵌套类里可以包含所有这些东西。也就是说,在非静态内部类中不可以声明静态成员,只有将某个内部类修饰为静态类,然后才能够在这 个类中定义静态的成员变量与成员方法。

另外,在创建静态内部类时不需要将静态内部类的实例绑定在外部类的实例上。普通非静态内部类的 对象是依附在外部类对象之中的,要在一个外部类中定义一个静态的内部类,不需要利用关键字new来创建内部类的实例。静态类和方法只属于类本身,并不属于 该类的对象,更不属于其他外部类的对象。

(7)内部类标识符

每个类会产生一个.class文件,文件名即为类名。同样,内部类也会产生这么一个.class文件,但是它的名称却不是内部类的类名,而是有着严格的限制:外围类的名字,加上$,再加上内部类名字。

(8)为何要用内部类?

1.   内部类一般只为其外部类使用;

2.   内部类提供了某种进入外部类的窗户;

3.   也是最吸引人的原因,每个内部类都能独立地继承一个接口,而无论外部类是否已经继承了某个接口。因此,内部类使多重继承的解决方案变得更加完整。

java内部类和静态内部类的更多相关文章

  1. java内部类:成员内部类,静态内部类方法内部类,匿名内部类(A)

    package cn.kecheng; /** * 在java中,一个文件可以定义多个类,文件名必须和public 类型的类的类名保持一致.这两个类是平行关系. * 在java中,一个类也可以定义在一 ...

  2. Java 内部类、静态内部类、匿名内部类

    java提高篇(八)----详解内部类 概念 可以将一个类的定义放在另一个类的定义内部,这就是内部类. 为什么要使用内部类?在<Think in java>中有这样一句话:使用内部类最吸引 ...

  3. java内部类和静态内部类的区别

    1 相同点 使用的时候,import的时候,除了包名,还要带外部类. 2 不同点 2.1 对象创建的方式不同 静态内部类创建对象的时候,独立于外部类及其对象,就好像它是一个独立的类,可以和外部类一样使 ...

  4. java内部类与静态内部类对比

    内部类 静态内部类 有一个隐式引用,指向实例化这个对象的外部类对象 没有这个附加指针 不支持静态字段(language15) 支持哦 不支持静态方法 (language15) 支持哦 接口中的内部类自 ...

  5. java 内部类和静态内部类的区别

    private class InnerClass {        // 只有在静态内部类中才能够声明或定义静态成员        // private static String tt = &quo ...

  6. java 内部类 *** 最爱那水货

    注: 转载于http://blog.csdn.net/jiangxinyu/article/details/8177326 Java语言允许在类中再定义类,这种在其它类内部定义的类就叫内部类.内部类又 ...

  7. java内部类 和外部类的区别

    java 内部类和静态内部类的区别  详细连接https://www.cnblogs.com/aademeng/articles/6192954.html 下面说一说内部类(Inner Class)和 ...

  8. Java内部类小程序(成员内部类,静态内部类,匿名内部类)

    /** * 测试java内部类(成员内部类,静态内部类,匿名内部类) * 局部内部类不常用,就不写了. * @package :java05 * @author shaobn * @Describe ...

  9. “全栈2019”Java第七十四章:内部类与静态内部类相互嵌套

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

随机推荐

  1. import threading线程进程

    cpu在执行一个子线程的时候遇到sleep就会利用这段停顿时间去执行另一个子线程.两个子线程谁先跳出sleep就执行谁. import threadingimport time start = tim ...

  2. Amazon AWS EC2存储

  3. UMP系统架构

  4. 根据table返回来的数据,动态展示组织名称

    <template> <div class="app-container calendar-list-container"> <el-card cla ...

  5. 【Uva 10003】Cutting Sticks

    [Link]: [Description] 给你一根长度为l的棍子; 然后有n个切割点; 要求在每个切割点都要切割一下; 这样,最后就能形成n+1根小棍子了; 问你怎样切割,消耗的体力最小; 认为,消 ...

  6. JS 作用域、原型链

    看到一道好题,并附答案 function Foo() { getName = function () { console.log('1'); }; return this; } Foo.getName ...

  7. windows下VisualSVN Server搭建

    转自:https://www.cnblogs.com/shuilangyizu/p/10365604.html 使用 VisualSVN Server来实现主要的 SVN功能则要比使用原始的 SVN和 ...

  8. 洛谷P4550 【收集邮票】

    题目链接: 神仙题QAQ 题目分析: 概率期望题是不可能会的,一辈子都不可能会的QAQ 这个题也太仙了 首先明确一下题意里面我感觉没太说清楚的地方,这里是抽到第\(i\)次要\(i\)元钱,不是抽到第 ...

  9. 微信小程序 button 按钮所有默认的样式

    小程序默认样式 // 默认样式 button { position:relative; display:block; margin-left:auto; margin-right:auto; padd ...

  10. Spring MVC(五)--控制器通过注解@RequestParam接受参数

    上一篇中提到,当前后端命名规则不一致时,需要通过注解@RequestParam接受参数,这个注解是作用在参数上.下面通过实例说明,场景如下: 在页面输入两个参数,控制器通过注解接受,并将接受到的数据渲 ...