内部类含义:

在Java中允许一个类的定义位于另一个类的内部,前者称为内部类,后者称为外部类。

Inner class 一般用在定义它的类或语句块之内,在外部引用它时必须给出完整的名称。

Inner class的名字不能与包含它的外部类的类名相同。

创建内部类对象:

外部类名.内部类名变量名= new外部类名() .new内部类名();

创建静态内部类对象:

外部类名.内部类名变量名= new外部类名.内部类名();

成员内部类:

(static成员内部类和非static成员内部类)

成员内部类作为类成员用法:

1.和外部类不同,Inner class还可以声明为private或protected。

2.可以调用外部类的结构。

3.Inner class可以声明为static的,但此时就不能再使用外层类的

非static的成员变量。

成员内部类作为类用法:

1.可以在内部定义属性、方法、构造器等结构。

2.可以声明为abstract类,因此可以被其它的内部类继承。

3.可以声明为final的。

4.编译以后生成OuterClass$InnerClass.class字节码文件。

注意事项:

1.非static的成员内部类中的成员不能声明为static的。

2.只有在外部类或static的成员内部类中才可声明static成员。

3.外部类访问成员内部类的成员,需要“内部类.成员” 或“内部类对象.成员”的方式。

4.成员内部类可以直接使用外部类的所有成员,包括私有的数据。

5.当想要在外部类的静态成员部分使用内部类时,可以考虑内部类声明为静态的。

局部内部类用法:

1.只能在声明它的方法或代码块中使用,而且是先声明后使用。

除此之外的任何地方都不能使用该类。

2.但是它的对象可以通过外部方法的返回值返回使用,

返回值类型只能是局部内部类的父类或父接口类型。

局部内部类特点:

1.内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,

但是前面冠以外部类的类名和$符号,以及数字编号。

2.只能在声明它的方法或代码块中使用,而且是先声明后使用。

除此之外的任何地方都不能使用该类。

3.局部内部类可以使用外部类的成员,包括私有的。

4.局部内部类可以使用外部方法的局部变量,但是必须是final的。

这是由局部内部类和局部变量的声明周期不同所致。

5.局部内部类和局部变量地位类似,不能使用public、protected、defunct、private。

6.局部内部类不能使用static修饰,因此也不能包含静态成员。

7.要使用内部类都分成两步:定义内部类、创建内部类对象。

匿名内部类的前提:

存在一个类或者接口,这里的类可以是具体类也可以是抽象类。

匿名内部类对象格式:new 类名或者接口名() {重写方法;}

本质:是一个继承了类或者实现了接口的子类匿名对象

匿名内部类对象的使用:调用单个方法

匿名内部类特点:

1.匿名内部类必须继承父类或实现接口

2.匿名内部类只能有一个对象

3.匿名内部类对象只能使用多态形式引用

匿名内部类注意:

1.匿名内部类不能定义任何静态成员、方法和类,只能创建匿名内部类的一个实例。

2.一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。

 public class AnonymousInner {

   public static void main(String[] args) {

    Outer.Inner inner =  new Outer().new Inner();

    //可以把两步骤合成一步

     //匿名内部类
      new Outer(); //匿名对象

     //定义一个匿名类对象
    new InnerObj() {
        //实现接口的方法
        public void test() {
          System.out.println("anonymous inner");
        }
     };

    //针对普通类,创建匿名内部类对象
     new InnerObject(10) {
       public void testObj() {
         System.out.println("testObj");
       }
     };

     //匿名内部类对象的使用
     new InnerObject(10) {
       public void testObj() {
         System.out.println("testObj");
       }
     }.testObj();

     //如果调用两次
     new InnerObject(10) {
       @Override
       public void testObj() {
         System.out.println("testObj");
       }
     }.testObj();

     InnerObject obj = new InnerObject(10) {
       @Override
       public void testObj() {
         System.out.println("testObj");
       }

       public void myOwn() {
         System.out.println("my own");
       }
     };
     obj.doWork();
     obj.testObj();

     //匿名内部类的弊端
     new InnerObject(10) {
       @Override
       public void testObj() {
         System.out.println("testObj");
       }

       public void myOwn() {
         System.out.println("my own");
       }
     }.myOwn();

   }

 }

 class Outer {
   class Inner {
     int i;
   }
 }

 interface InnerObj {
   void test();
 }
 class InnerObject{
   int i;
   public InnerObject(int i) {
     this.i = i;
   }
   public void testObj() {
     System.out.println("testObj");
   }

   public void doWork() {
     System.out.println("dowork");
   }
 }
 class Obj extends InnerObject{
   public Obj(int i) {
     super(i);
   }
   public void testObj() {
     System.out.println("test test");
   }
 }
 public class SyntaxDemo {
   public static void main(String[] args) {
     //测试外部类访问内部类成员
     OuterClass outerClass = new OuterClass();
     outerClass.testInnerAccess();
     OuterClass.StaticInner staticInner = new OuterClass.StaticInner();
   }
 }

 class OuterClass {
   private int i;
   private static double k;
   public void testInnerAccess() {
     //创建内部类对昂
     InnerClass innerClass = new InnerClass();
     System.out.println(innerClass.j);
   }

   public static void testAccessFromStaicInner() {
     int m = 100;
     System.out.println("testAccessFromStaicInner");
   }
   //通过给成员位置内部类加private权限修饰符,让内部类只能被外部类访问到

   private class InnerClass {
     int j = 100;
     //定义一个方法来测试一下
     public void testOuterPrivate() {
       System.out.println(i);
     }
   }

        //被static权限修饰符所修饰
   static class StaticInner {
      //静态上下文不能访问非静态的成员变量和成员方法
     // private  int j = i;

     public void testAccess() {
       //静态上下文不能访问非静态的成员变量和成员方法

       //访问外部类的静态成员
       System.out.println(k);

       //访问外部类中的静态方法
       testAccessFromStaicInner();
     }
   }
 }

Java类成员之内部类的更多相关文章

  1. Java 类成员的初始化顺序

    Java 类成员的初始化顺序 前言:开发中碰到一个Java文件中有很多的成员变量,包括静态和非静态的,还有很多的初始化方法,很好奇这些成员的初始化顺序,在这里作个研究.   1  无继承情况下的Jav ...

  2. java类成员变量与代码块初始化

    首先根据下面的这个一段代码:引入关于java初始化顺序的问题public class InitationTest extends Person { public InitationTest() { S ...

  3. 【转】Java类成员变量默认初始化规则

    一个变量作为类成员使用的时候,如果没有被初始化,java会为其分配默认值: -------------------------------------------------------------- ...

  4. Java类成员访问控制权限

    类成员访问控制权限 在JAVA中有四种访问控制权限,分别为:private, default, protected, public 1.Private 如果一个成员方法或变量名前使用了private, ...

  5. Java类成员访问级别

    类可以是public或default(或包级别).在本教程中主要介绍 public,private,protected 这几个访问级别修辞符的使用.类成员的访问级别确定程序的哪个区域可以访问它. 以下 ...

  6. java类成员的默认可访问性是什么?你猜

    先看下面TestModel: import org.apache.commons.collections4.BidiMap; import org.apache.commons.collections ...

  7. java学习面向对象之内部类

    什么是面向对象内部类呢?所谓的内部类,即从字面意义上来理解的话,就是把类放到类当中. 那么内部类都有什么特点呢? 1.内部类可以访问包裹他的类的成员. 2.如果包裹他的类想访问被其包裹的类的话就得实例 ...

  8. Java核心技术点之内部类

    1. 为什么要使用内部类     内部类就是定义在一个类内部的类,那么为什么要使用内部类呢?主要原因有以下几点:第一,内部类中定义的方法能访问到它所在外部类的私有属性及方法:第二,外部类无法实现对同一 ...

  9. Java类成员(成员变量和方法)的覆盖与隐藏归纳

    以前就知道重写override和重载overload的区别,平时也是逮着用就是了,Eclipse报错再说. 最近看一本书里面出现了重写.替换.覆盖.置换.隐藏.重载,简直乱得不行,归纳整理一下. 从全 ...

随机推荐

  1. H3C 帧中继虚电路

  2. web.xml和@WebServlet

    web.xml <servlet> <servlet-name>DZDYServlet</servlet-name> <servlet-class>包名 ...

  3. [Atom 编辑器 ] Packages

    Atom包      https://atom.io/packages 常用包整理: atom-chinese-menu   中文插件 atom-ternjs   对 es5,es6的语法支持 ato ...

  4. java 合并流(SequenceInputStream)

    需要两个源文件,还有输出的目标文件 SequenceInputStream: 将两个文件的内容合并成一个文件 该类提供的方法: SequenceInputStream(InputStream s1, ...

  5. async和await的执行顺序问题

    说明 : 要了解执行顺序,所需要的知识是了解浏览器js运行机制,以及微任务和宏任务的先后顺序.如果你明白了宏任务.微任务,请往下看: async function async1 () { consol ...

  6. linux预备知识

    我们正在接近去看一些实际的模块代码. 但是首先, 我们需要看一些需要出现在你的模块 源码文件中的东西. 内核是一个独特的环境, 它将它的要求强加于要和它接口的代码上. 大部分内核代码包含了许多数量的头 ...

  7. WPF 使用 SharpDx 异步渲染

    本文告诉大家如何通过 SharpDx 进行异步渲染,但是因为在 WPF 是需要使用 D3DImage 画出来,所以渲染只是画出图片,最后的显示还是需要 WPF 在他自己的主线程渲染 本文是一个系列,希 ...

  8. javascript中的深拷贝与浅拷贝

    javascript中的深拷贝与浅拷贝 基础概念 在了解深拷贝与浅拷贝的时候需要先了解一些基础知识 核心知识点之 堆与栈 栈(stack)为自动分配的内存空间,它由系统自动释放: 堆(heap)则是动 ...

  9. html2canvas生成图片报错处理办法

    详见大佬博客链接: link.(https://www.jianshu.com/p/22bd5b98e38a) 需要注意的是要生成的网页中带的网络图片地址(如放在阿里云服务器图库的图片)经常有跨域报错 ...

  10. Linux 内核提交和控制一个 urb

    当驱动有数据发送到 USB 设备(如同在驱动的 write 函数中发生的), 一个 urb 必须被 分配来传送数据到设备. urb = usb_alloc_urb(0, GFP_KERNEL); if ...