为什么要用到内部类:

在java开发学习中我们经常会碰到内部类。内部类又有很多的优势:首先举一个简单的例子,如果你想实现一个接口,但是这个接口中的一个方法和你构想的这个类中的一个方法名称参数相同,你应该怎么办?这时候,你可以建一个内部类实现这个接口。由于内部类对外部类的所有内容都是可访问的,所以这样做可以完成所有你直接实现这个接口的功能。不过你可能要质疑,更改一下方法的不就行了吗?的确,以此作为设计内部类的理由,实在没有说服力。真正的原因是这样的,java中的内部类和接口加在一起,从而java 通过内部类加上接口,可以很好的实现多继承的效果。

内部类的分类和使用

1、成员内部类: 即作为外部类的一个成员存在,与外部类的属性、方法并列。注意:成员内部类中不能定义静态变量,但可以访问外部类的所有成员。值得注意的是成员内部类编译成功后会生成的两个不同的类(.class)
成员内部类的优点
1)、内部类作为外部类的成员,可以访问外部类的私有成员或属性。(即使将外部类声明为PRIVATE,但是对于处于其内部的内部类还是可见的。)
2)、用内部类定义在外部类中不可访问的属性。这样就在外部类中实现了比外部类的private还要小的访问权限。
package one;public class Outer{private static int outer_i = 1;private int k=20;public static void outer1(){//...
    }//成员内部类class Inner{int j=100;//内部类中外部类的实例变量可以共存int inner_i=1;void inner1(){System.out.println(outer_i);//外部类的变量如果和内部类的变量没有同名的,则可以直接用变量名访问外部类的变量System.out.println(j);//在内部类中访问内部类自己的变量直接用变量名System.out.println(this.j);//也可以在内部类中用"this.变量名"来访问内部类变量//访问外部类中与内部类同名的实例变量可用"外部类名.this.变量名"。System.out.println(k);//外部类的变量如果和内部类的变量没有同名的,则可以直接用变量名访问外部类的变量
           outer1();}}//外部类的非静态方法访问成员内部类public void outer2(){Inner inner = new Inner();inner.inner1();}//外部类的静态方法访问成员内部类,与在外部类外部访问成员内部类一样public static void outer3(){Outer out = new Outer();//step1 建立外部类对象Inner inner=out.new Inner();//step2 根据外部类对象建立内部类对象inner.inner1();//step3 访问内部类的方法
    }public static void main(String[] args){outer3();}
}

2、局部内部类: 即在方法中定义的内部类,与局部变量类似,在局部内部类前不加修饰符public或private,其范围为定义它的代码块。

public class Outer {public void say(){System.out.println("关门说真话!");}
}

public class Test {public void ting(){class MiMi extends Outer{//定义一个局部的内部类,继承Outer方法//……
        }new MiMi().say();//调用局部内部类中继承的say方法
        System.out.println("别人都不知道");}public static void main(String[] args) {new Test().ting();}
}

3、静态内部类: 静态内部类定义在类中,任何方法外,用static定义。注意:静态内部类中可以定义静态或者非静态的成员

package three;public class StaticTest {  private static String name="abc";private String sex="男";static class Person{private String age = "18";//内部私有成员public String heigth = "180";//内部类公有成员public void display(){//System.out.println(sex);//报错,不能直接访问外部类的非静态成员System.out.println(name);//只能直接访问外部类的静态成员System.out.println(age);//访问本内部类成员。
        }  }public void testone(){Person person = new Person();person.display();//System.out.println(heigth);//报错,是因为不可以直接访问内部类私有成员//System.out.println(age);//报错,是因为不可以直接访问内部类公有成员System.out.println(person.age);//可以访问内部类的私有成员System.out.println(person.heigth);//可以访问内部类的公有成员
    } public void testtwo(){StaticTest st = new StaticTest();System.out.println(name);System.out.println(sex);//System.out.println(age);//不可以直接访问内部类的成员//System.out.println(heigth);//不可以直接访问内部类的成员
    }public static void main(String[] args) { //调用StaticTestStaticTest staticTest = new StaticTest();  staticTest.testone(); staticTest.testtwo();}
}  

4、匿名内部类: 匿名内部类是在抽象类和接口的基础之上发展起来的。匿名内部类如果继承自接口,必须实现指定接口的方法,且无参数 。匿名内部类如果继承自类,参数必须按父类的构造函数的参数传递
匿名内部类的特点:
1),一个类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的事先或是覆盖。
2),只是为了获得一个对象实例,不需要知道其实际类型。
3),类名没有意义,也就是不需要使用到。
package three;abstract class parent {public abstract void like();
}public class Demo {public static void main(String[] args) {parent pt = new parent(){public void like(){System.out.println("吃饭睡觉打豆豆。。。");}};pt.like();}
}

匿名类与内部的联系与区别:

 
按所在位置可以分为两大类:
1、在类的方法中
特点:
a、可以访问宿主类的所有元素 ;
b、保存宿主类对象的引用,创建对象时必须有宿主类对象;
c、 不能有静态数据;
继续划分:
A、本地内部类;
B、匿名内部类
两者的区别在于本地内部类有构造方法,而匿名内部类只能实例初始化;
2、在类或接口作用域中;
A、普通内部类
B、静态内部类

内部类总结:

1.内部类作为外部类的一个特殊的成员来看待,因此它有类成员的封闭等级:private ,protected,默认(friendly),public 它有类成员的修饰符:   static,final,abstract
2.非静态内部类nested inner class,内部类隐含有一个外部类的指针this,因此,它可以访问外部类的一切资源(当然包括private)外部类访问内部类的成员,先要取得内部类的对象,并且取决于内部类成员的封装等级。非静态内部类不能包含任何static成员.
3.静态内部类:static inner class,不再包含外部类的this指针,并且在外部类装载时初始化. 静态内部类只能访问外部类static成员. 外部类访问静态内部类的成员:static成员:类名.成员;非static成员:对象.成员
4.对于方法中的内部类或块中内部类只能访问块中或方法中的final变量。

转载于:https://www.cnblogs.com/xiao-chuan/p/6014752.html

Java内部类的定义和使用相关推荐

  1. java内部类的定义原则

    /* 内部类的访问规则: 1,内部类可以直接访问外部类中的成员,包括私有.     之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式 外部类名.this 2,外部类要访问内 ...

  2. java内部类的定义_java定义内部类

    package test.jdk; public class InnerTest { private String instAtt = "实例变量"; private static ...

  3. 看到如此详细的Java内部类,我泪目了

    Java内部类 介绍 定义 成员内部类 语法格式 使用说明 代码示例 局部内部类 语法格式 使用说明 代码示例 匿名内部类 语法格式 使用说明 代码示例 静态内部类 语法格式 使用说明 代码示例 介绍 ...

  4. 如何新建java内部类_java内部类-1(内部类的定义)

    小胖从官网出发,研究下为什么我们需要些内部类,内部类的区别和联系. 思考三个问题: (1)为什么需要内部类?静态内部类和非静态内部类有什么区别: (2)为什么内部类可以无条件访问外部类成员: (3)为 ...

  5. Java内部类手机专卖店_Java(20)内部类

    内部类 一个定义在另一个类里面的类称为内部类.内部类可以分为四种形式:成员内部类, 成员内部类 内部调用外部的属性和方法 成员内部类可以无条件访问外部类的所有成员属性和方法. 其他类(例子中的RunC ...

  6. java内部类 缺点_Java中的内部类及其优势

    Java中提供了定义内部类的选择,这一机制使得代码的书写更为方便和优雅(功能上相关的代码被紧密的组织在了一起). 需要注意的是,内部类和传统的组合(即将一个类的实体定义为另一个类的成员)是完全不同的, ...

  7. Java 内部类及其原理

    Java中实现内部类 内部类相信大家都用过很多次了,就不说它是怎么用的了. 内部类 1.成员内部类 需要注意的是, 当成员内部类拥有和外部类同名的成员变量或这方法时, 默认情况下访问的是内部类的成员, ...

  8. java内部类gc_Java内部类持有外部类的引用详细分析与解决方案

    在Java中内部类的定义与使用一般为成员内部类与匿名内部类,他们的对象都会隐式持有外部类对象的引用,影响外部类对象的回收. GC只会回收没有被引用或者根集不可到达的对象(取决于GC算法),内部类在生命 ...

  9. Java 内部类分析

    一.简介 因为现在是Android开发实习生.发现在发展过程中越来越多,但他们知道什么时候该使用真实的情况,但没有获得,例如,使用内部类,因此,学习和自己的总结后发现,通过互联网的信息,家分享,如有不 ...

最新文章

  1. 做时间序列预测没必要深度学习!GBDT性能超DNN
  2. RS485 串口调试如何操作
  3. Python100入门题 | 第001题
  4. 活体检测方法概述与总结
  5. 曹大带我学 Go(5)—— 哪里来的 goexit
  6. 台式电脑怎么看计算机型号,怎么查看台式机的型号
  7. matlab将程序变量写入标题,如何该这段MATLAB程序(把一个常量改成变量)
  8. 自动驾驶——目标检测(Camera传感器)的学习笔记
  9. 在使用DelphiXE3和SQLite3进行程序开发时,解决最后一个字符乱码的问题
  10. 约瑟夫环-单向循环链表
  11. 均值(Mean)和均值标准误差(S.E. Mean)
  12. Vrep基础部分(二)
  13. 微信小程序--获取当前时间
  14. 冤家路窄?——软件开源与软件专利保护
  15. 自定制vs插件--LearnVSXNow!-#4 创建一个带有工具窗的Package
  16. 网络与信息安全领域泰斗
  17. AI赋能在线教育 , 大数据驱动下 , 精准营销如何布局?
  18. 强盗问题动态规划详解
  19. 前端知识之angular组件库之NG-ZORRO-ANTD结构窥探(三)pipe ,polify,service
  20. 信息系统项目管理师Part16-物联网

热门文章

  1. linux服务器用哪个面板好,Linux服务器管理面板哪家比较好用?
  2. python众数问题给定含有n个元素的多重集合s_分治法求众数 给定含有n个元素的多重集合S 联合开发网 - pudn.com...
  3. php 去除 html 属性,用PHP 去掉所有html标签里的部分属性
  4. python 微信支付接口 详解_Python支付接口汇总大全(包含微信、支付宝等,长期更新、欢迎补充)...
  5. curl命令java_上curl java 模拟http请求
  6. suse linux 查看cpu,Suse Linux zmd 耗用100% CPU
  7. Java PushbackReader ready()方法与示例
  8. php的延时sleep函数
  9. eclipse和Tomcat绑定
  10. php having,having方法