(static修饰的成员属于整个类,而不属于单个对象)

定义:将一个类放到另一个类的内部定义,这个在内部定义的类就叫做内部类(也有的成嵌套类),包含内部类的类被称为外部类(也有的称宿主类)。

1。非静态内部类

没有使用static修饰的内部类就是非静态内部类。

注意:a。java不允许在非静态内部类中定义静态成员

b。当调用非静态内部类中的实例方法时,必须有一个非静态成员内部类实例,非静态内部类实例必须寄生在外部实例内

c。如果外部类成员变量与内部类成员变量与内部类里的方法的局部变量同名,可通过this,外部类类名.this 作为限定来加以区分

public class Test {

    private String prop = "外部类的实例变量";

    public class InClass{
private String prop = "内部类中的实例变量";
public void info(){
String prop = "局部变量";
System.out.println("外部类的实例变量值:"+Test.this.prop);
System.out.println("内部类的实例变量值:" + this.prop);
System.out.println("局部变量:" + prop);
}
}
public void test(){
InClass ic = new InClass();
ic.info();
}
public static void main(String[] args){
/*
* Test ts = new Test();
* ts.test();
* 上下的代码作用一样
*/
new Test().test();
}
}

使用非静态内部类:

在外部类以外的地方定义内部类的语法格式: OuterClass.InnerClass  VarName

在外部类以外的地方创建非静态内部类实例的语法: OuterInstace .new  InnerConstructor()

class Out{
class In
{
public In(String msg){
System.out.println(msg);
}
}
}
public class CreateInnerInstance {
public static void main(String[] args){
//OuterClass.InnerClass varName = new OutInstance.new InnearConstructor();
Out.In in = new Out().new In("测试信息");
/*Out.In in;
*Out out = new Out();
*in2 = out.new In("测试信息");      */
    }
}

2.静态内部类

静态内部类是用static修饰的内部类,也称类内部类。

a。静态内部类不能访问外部类的实例成员,只能访问外部类的类成员(同为static 修饰)。

c。外部类依然不能访问静态内部类中的成员,但可以使用静态内部类的类名作为调用者来访问静态内部类中的类成员,也可以使用静态内部类对象作为调用者来访问静态内部类中的实例变量。

public class StaticInnerClassTest {
private int prop = 5 ;
private static int prop1 = 6 ;
static class InClass{
public void accessOuterProp(){         private static int prop = 5;                                                                  
        private int prop1 = 6;
         //System.out.println(prop);   //这句代码会出错,静态内部类无法访问外部类的非静态成员            System.out.println(prop1);
}
}
public void accessInnerPro(){
  //通过静态内部类的类名访问静态内部类中的类成员   System.out.println(InClass.prop);
  //通过静态内部类对象作为调用者来访问静态内部类中的实例变量
  SYstem.out.println(new InClass().prop1);
}
}

在外部类以外使用使用静态内部类:(和使用非静态比较,相类似)
语法:   new OuterClass.InnerConstructor()

class Out{
static class In
{
public In(){
System.out.println("静态内部类的构造器");
}
}
}
public class CreateStaticInnerInstance {
public static void main(String[] args){
Out.In in = new Out.In();
}
}

3.匿名内部类
如果把一个内部类放到方法中定义,则这个内部类就是一个局部内部类,局部内部类仅在该方法里有效。

定义匿名内部类的格式:

new 实现接口 | 父类构造器(实参列表)
{
类体部分
}

可以看出,匿名内部类必须继承一个父类或者实现一个接口。

interface Product{
public Double getPrice();
public String getName();
}
public class AnonymTest { public void ce(Product p){
System.out.println("购买了一个" + p.getName() + ",花掉了" + p.getPrice());
}
public static void main(String[] args){
AnonymTest at = new AnonymTest();
at.ce(new Product() {
@Override
public Double getPrice() {
return 0.5;
}
@Override
public String getName() {
return "辣条";
}
});
}
}

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. 编写高质量JS代码的68个有效方法(十一)

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  2. 斐波那契堆(一)之 图文解析 和 C语言的实现

    概要 本章介绍斐波那契堆.和以往一样,本文会先对斐波那契堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现:实现的语言虽不同,但是原理如出一辙,选择其中之一进行了 ...

  3. [OpenCV] Image Processing - Fuzzy Set

    使用模糊技术进行 (灰度变换Grayscale Transform) 和 (空间滤波Spatial Filtering) 模糊集合为处理不严密信息提供了一种形式. 首先,需要将输入量折算为隶属度,这个 ...

  4. iOS-UITextField-通知

    二.处理文本框与键盘之间的关系(当键盘弹出遮挡到文本框的时候进行调整) 原理: 首先要明白: 1,键盘隐藏的时候,键盘上边界紧贴屏幕最低端,键盘在屏幕正下方. 2:键盘弹起的时候,键盘下边界跟屏幕下边 ...

  5. Java泛型数组

    文章来自http://blog.csdn.net/orzlzro/article/details/7017435 Java 不支持泛型数组.也就是说, List<String>[] ls ...

  6. 鼠标经过(hover)事件的延时处理

    关于鼠标hover事件及延时 鼠标经过事件为web页面上最常见的事件之一.简单的hover可以用CSS :hover伪类实现,复杂点的用js. 一般情况下,我们是不对鼠标hover事件进行延时处理.但 ...

  7. Direct3D11学习:(六)渲染管线

    转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 这篇文章主要讲解渲染管线(rendering pipeline)的理论知识. 渲染管线是指:在给定一个3D场景的 ...

  8. Java集合框架源码剖析:LinkedHashSet 和 LinkedHashMap

    Java LinkedHashMap和HashMap有什么区别和联系?为什么LinkedHashMap会有着更快的迭代速度?LinkedHashSet跟LinkedHashMap有着怎样的内在联系?本 ...

  9. ios基础之入门(一)

    最近找到了一个可以接触ios开发的职位,可以系统的学习和练习了.先从最基本的开始: 一.获取控件的两种方式 1)第一种,也是经常使用的一种,通过IBOutlet方式.直接按住control键,将控件和 ...

  10. mysql创建每月执行一次的event

    DELIMITER $$ CREATE /*[DEFINER = { user | CURRENT_USER }]*/ EVENT `dev_sp2p6`.`e_test1` ON SCHEDULEE ...