java 内部类

一.java内部类:

java内部类分为:

成员内部类、静态嵌套类、方法内部类、匿名内部类 。

内部类的共性:

(1)、内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号 。
(2)、内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的 。
(3)、内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量 。
 
二.内部类语法:

1.成员内部类:

 package com.main;

 /**
*
* @author PC
*
*/
public class Test { /**
*
*/
public Test() {
// TODO Auto-generated constructor stub
} /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub // 成员内部类
A a = new A();
a.getName(); //没有get方法,就用此方法创建内部类
// A.A1 a0=a.new A1();
// a0.getName(); // 通过get获取内部类对象
A.A1 a1=a.get();
a1.getName();
}
} class A {
final String name = "张三";
// 个人推荐使用get()来获取成员内部类,尤其是该内部类的构造函数无参数时
public A1 get() {
return new A1();
} public class A1 {
public void getName() {
System.out.println("A1:"+name);
}
} public void getName() {
System.out.println("A:"+name);
}
}

2.静态嵌套类:

 package com.main;

 /**
*
* @author PC
*
*/
public class Test { /**
*
*/
public Test() {
// TODO Auto-generated constructor stub
} /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub //E.E1 e1=new E.E1();
//e1.getName(); E.E1.getName1(); } } class E{
static String name = "张三";
static class E1{
public void getName(){
System.out.println(name);
}
public static void getName1(){
System.out.println(name);
}
}
}

3.方法内部类:

 package com.main;

 /**
*
* @author PC
*
*/
public class Test { /**
*
*/
public Test() {
// TODO Auto-generated constructor stub
} /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub // 方法中内部类
B b=new B();
b.getName();
}
} class B {
final String name = "张三"; public void getName() {
System.out.println("out:" + name);
class B1 {
public void getName() {
System.out.println("in:" + name);
}
}
B1 b1 = new B1();
b1.getName();
}
}

4.匿名类:

A:继承式:

 package com.main;

 /**
*
* @author PC
*
*/
public class Test { /**
*
*/
public Test() {
// TODO Auto-generated constructor stub
} /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub //匿名内部类
C c=new C(){
public void getName(){
System.out.println("c"+name);
}
};
c.getName(); }
} class C{
String name = "张三";
public void getName(){
System.out.println(name);
}
}

B:接口式:

 package com.main;

 /**
*
* @author PC
*
*/
public class Test { /**
*
*/
public Test() {
// TODO Auto-generated constructor stub
} /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub D d=new D(){
public void getName(){
System.out.println(name);
}
};
d.getName();
}
} interface D{
String name = "张三";
public void getName();
}

三.外部类变量为什么要使用final:

因为生命周期的原因。方法中的局部变量,方法结束后这个变量就要释放掉,final保证这个变量始终指向一个对象。

首先,内部类和外部类其实是处于同一个级别,内部类不会因为定义在方法中就会随着方法的执行完毕而跟随者被销毁。问题就来了,如果外部类的方法中的变量不定义final,那么当外部类方法执行完毕的时候,这个局部变量肯定也就被GC了,然而内部类的某个方法还没有执行完,这个时候他所引用的外部变量已经找不到了。如果定义为final,java会将这个变量复制一份作为成员变量内置于内部类中,这样的话,由于final所修饰的值始终无法改变,所以这个变量所指向的内存区域就不会变。

java java 内部类的更多相关文章

  1. Java学习--内部类(一)

    Java学习--内部类(一) 一. 内部类的定义和特点 class Outer{ privite int num = 5; class Inner{ public void Display(){ Sy ...

  2. Java的内部类

    Java的内部类 首先我们来了解一下什么是内部类? 内部类是指在一个外部类的内部再定义一个类.内部类可以是静态static的,也可用public,default,protected和private修饰 ...

  3. java使用内部类的好处及其初始化

    java使用内部类的原因 每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响          java内部类初始化 ForeCatal ...

  4. JAVA基础——内部类详解

    JAVA内部类详解 在我的另一篇java三大特性的封装中讲到java内部类的简单概要,这里将详细深入了解java内部类的使用和应用. 我们知道内部类可分为以下几种: 成员内部类 静态内部类 方法内部类 ...

  5. JAVA面向对象-----内部类的概述

    JAVA面向对象-–内部类的概述s 将类定义在另一个类的内部则成为内部类.其实就是类定义的位置发生了变化. 在一个类中,定义在类中的叫成员变量,定义在函数中的叫成员函数,那么根据类定义的位置也可以分为 ...

  6. Java的内部类真的那么难以理解?

    01 前言 昨天晚上,我把车停好以后就回家了.回家后才发现手机落在车里面了,但外面太冷,冷到骨头都能感受到寒意——实在是不想返回一趟去取了(小区的安保还不错,不用担心被砸车玻璃),于是打定主意过几个小 ...

  7. 第30节:Java基础-内部类

    内部类 // 外部类 class Demo{ private int num = 3; // 定义内部类 class Int{ void show(){ System.out.println(&quo ...

  8. 【Java】 内部类

    [Java]内部类 可以将一个类的定义放在另一个类的定义内部,这就是内部类. 使用内部类的的原因主要有三点: 内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据. 内部类可以对同一个包中的 ...

  9. java中内部类的积累

    放在一个类的内部的类我们就叫内部类. 二. 作用 1.内部类可以很好的实现隐藏 一般的非内部类,是不允许有 private 与protected权限的,但内部类可以 2.内部类拥有外围类的所有元素的访 ...

  10. Java 基础 内部类

    Java 基础 内部类 内部类(嵌套类) nested class 目的为外围类enclosing class提供服务. 四种: 静态成员类 static member class 非静态成员类 no ...

随机推荐

  1. git之切换分支出现的问题

    当在其他分支,如test分支开发的时候,新增了文件夹等目录结构.开发完成后,切换会master分支. 如果出现“Deletion of directory '***' failed. Should I ...

  2. Azure VMSS ---- PowerShell创建标准镜像的VMSS集群

    VMSS的创建可以采用Portal.Powershell.Azure CLI或者Template. 但目前Portal创建有很多限制,本文将介绍如何用PowerShell来创建VMSS的集群. 具体的 ...

  3. struts2获得需要的文件或者访问路径

    在struts2中,上传文件的时候遇到一个很好用但是失效的方法,找到如下替代.并且测试了一下request可以得到的相关路径. 得到request对象: HttpServletRequest requ ...

  4. install命令和cp命令的区别

    基本上,在Makefile里会用到install,其他地方会用cp命令. 它们完成同样的任务——拷贝文件,它们之间的区别主要如下: 1.最重要的一点,如果目标文件存在,cp会先清空文件后往里写入新文件 ...

  5. Spring 学习一 @Autowired

    @Autowired Spring 2.5 引入了 @Autowired ,它可以对类成员变量.方法及构造函数进行标注,完成自动装配的工作. 通过 @Autowired的使用来消除 set ,get方 ...

  6. 开发环境入门 linux基础 (部分) 复制 用户和组操作 权限更改

    复制 用户和组操作 权限更改 CP 复制命令 cp 源文件 目标文件 a) –r(recursive,递归的):递归地复制目录.当复制一个目录时,复制该目录中所有的内容,其中包括子目录的全部内容. b ...

  7. 2015.11.3 RichBox改变若干文本颜色

    for(int i=1;i<rtb.Lines.Length;i++) { if(rtb.Lines[i] == rtb.Lines[i - 1]) { int bg = rtb.GetFirs ...

  8. java selenium webdriver第二讲 页面元素定位

    自动化测试实施过程中,测试程序中常用的页面操作有三个步骤 1.定位网页上的页面元素,并存储到一个变量中 2.对变量中存储的页面元素进行操作,单击,下拉或者输入文字等 3.设定页面元素的操作值,比如,选 ...

  9. 问题:Oracle to_date;结果:oracle常用的时间格式转换

    oracle常用的时间格式转换 1:取得当前日期是本月的第几周 SQL> select to_char(sysdate,'YYYYMMDD W HH24:MI:SS') from dual; T ...

  10. kernel下制作动态logo

    kernel下制作动态logo 在uboot中实现logo的好处是反映速度快. 在kernel中实现logo的好处是,不管是android还是什么其他平台,logo显示无需考虑上层平台. 参照三星平台 ...