java 内部类(匿名类,匿名对象,静态内部类)详解及实例

内部类的介绍

定义在另外一个类中的类,叫内部类

成员内部类

1..new 创建成员内部类必须先创建外部类的实例,然后通过.new 创建内部类的对象

2..this 可以通过外部类的类名.this去访问外部类的所有属性和方法。

public class Test1 {

  String name = "asnd";

  public static void main(String[] args) {

    Test1 test1 = new Test1();
    Inner mInner = test1.new Inner();
    mInner.print();
  }

  void show() {
    System.out.println("show");
  }

  public class Inner {

    String name = "123";
    private void print(){
      show();
      System.out.println(name);//打印的是123
      System.out.println(Test1.this.name);//打印的是asnd
    }
  }
}

匿名内部类

没有名字的类,创建类的同时,也会创建一个对象。

只需要用到一次的类,就可以使用匿名内部类

  File file = new File("D:/cc.txt") {

      @Override
      public boolean delete() {
        System.out.println("是否删除y/n");
        Scanner input = new Scanner(System.in);
        String str = input.next();
        if (str.equals("y")) {
          return super.delete();
        }
        System.out.println("删除失败");
        return false;
      }
    };
    file.delete();

  }

匿名对象

该对象只需要访问一次.

new Thread() {

      @Override
      public void run() {
        System.out.println("线程开始!");
        try {
          Thread.sleep(2000);
          System.out.println("线程结束!");
        } catch (Exception e) {
          e.printStackTrace();
        }
        super.run();
      }

    }.start();

静态内部类

1.静态内部类只能访问外部类静态的方法和变量,不能访问非静态。

2.静态内部类可以不需要创建外部类的引用,而直接创建。

匿名内部类访问局部变量

内部类访问局部变量必须final,如果没有加,jdk1.8默认加上去了
当所使用的变量是在变的时候可以用下面的方法,也可以把下面的i在开始的时候定为静态的

for (int i = 0; i < 5; i++) {
      final int finali = i;
      new Thread() {
        public void run() {
          System.out.println(finali);
        };
      }.start();

    }

下面介绍一下内部类的实现技巧

public static void main(String[] args) {
    Lam mLam = new Lam();
    //第一种实现的方法
    mLam.to(new Ligh() {
      @Override
      public void shin() {
        System.out.println("on的第一种方法");
      }
    });
    //第二种实现方法
    class MyLam implements Ligh{

      @Override
      public void shin() {
        System.out.println("第二种");

      }}

    mLam.to(new MyLam());
  }
}

interface Ligh {
  void shin();
}

class Lam {
  public void to(Ligh ligh) {
    ligh.shin();
    System.out.println("on");
  }
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

时间: 2016-12-24

Java单例模式实现静态内部类方法示例

Singleton是众多设计模式中最容易理解的一种,也是众多设计模式中较为重要的一种设计模式.接下来我们看看具体介绍. Singleton模式实现的重点在于将构造函数私有化(private),并通过提供静态公有函数(public synchronized static xxx getInstance)来获取定义在类中的静态私有成员(private static xxx instance),通过一个简单的判断静态实例是否为空来控制这个类只能够new一次,即控制了一个类只能有单个实例,一般的实现如下

Java编程中静态内部类与同步类的写法示例

java静态内部类 将某个内部类定义为静态类,跟将其他类定义为静态类的方法基本相同,引用规则也基本一致.不过其细节方面仍然有很大的不同.具体来说,主要有如下几个地方要引起各位程序开发人员的注意.     (一)一般情况下,如果一个内部类不是被定义成静态内部类,那么在定义成员变量或者成员方法的时候,是不能够被定义成静态成员变量与静态成员方法的.也就是说,在非静态内部类中不可以声明静态成员.     (二)一般非静态外部类可以随意访问其外部类的成员变量以及方法(包括声明为private的方法),但是

Java中的静态内部类详解及代码示例

1. 什么是静态内部类 在Java中有静态代码块.静态变量.静态方法,当然也有静态类,但Java中的静态类只能是Java的内部类,也称为静态嵌套类.静态内部类的定义如下: public class OuterClass { static class StaticInnerClass { ... } } 在介绍静态内部类之前,首先要弄清楚静态内部类与Java其它内部类的区别. 2. 内部类 什么是内部类?将一个类的定义放在另一个类的内部,就是内部类.Java的内部类主要分为成员内部类.局部内部类.

深入浅析Java中Static Class及静态内部类和非静态内部类的不同

java中的类可以是static吗?答案是可以.在java中我们可以有静态实例变量.静态方法.静态块.类也可以是静态的. java允许我们在一个类里面定义静态类.比如内部类(nested class).把nested class封闭起来的类叫外部类.在java中,我们不能用static修饰顶级类(top level class).只有内部类可以为static.      静态内部类和非静态内部类之间到底有什么不同呢?下面是两者间主要的不同. (1)内部静态类不需要有指向外部类的引用.但非静态内部

浅析java中static的用法

static的作用: 1.将对象层级提升为类层级 (即将对象可以调用的,提升为对象和类均可调用的成员):            //推荐使用类来调用   ClassNme.静态成员 (包括变量.方法.成员对象) 2.static修饰的成员,在类加载时即准备完成,而不需要创建对象:   //类加载只做一次: 类名 的时候会类加载; new 对象时会类加载 3.静态成员方法只能访问静态成员,不能访问非静态成员(因为调用该方法时可能还没有创建对象):    而非静态成员方法既能访问非静态成员,又能访问

浅析java 的 static 关键字用法

本篇浅析java中static的用法,主要五个方面:静态成员变量,静态方法,静态块,静态内部类,静态导包. 首先还是一张表格说一下静态对象和非静态对象的区别: 静态对象 非静态对象 归属 类共同具有 类的各个实例独立拥有 内存分配 内存空间上固定的 附属类分配 分配空间顺序 优先分配静态对象空间 优先分配静态对象空间,初始化也一样 1 静态变量,静态方法,静态块 静态对象,静态方法都是在原对象和方法上加上static关键字修饰,表示类可以直接调用这些,而不需要实例化后再调用.具有的好处是: 1-

浅谈Java中static和非static的区别

关于static和非static变量的区别 1. static 修饰的变量称为类变量或全局变量或成员变量,在类被加载的时候成员变量即被初始化,与类关联,只要类存在,static变量就存在.非static修饰的成员变量是在对象new出来的时候划分存储空间,是与具体的对象绑定的,该成员变量仅为当前对象所拥有的. 2. static修饰的变量在加载的时候先于main方法加载在内存中的数据共享区-------方法区,而非static的变量在加载的时候,是要创建变量才加载在堆内存中的. 3. 一个stat

浅析java中stringBuilder的用法

String对象是不可改变的.每次使用 System.String类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间.在需要对字符串执行重复修改的情况下,与创建新的 String对象相关的系统开销可能会非常昂贵.如果要修改字符串而不创建新的对象,则可以使用System.Text.StringBuilder类.例如,当在一个循环中将许多字符串连接在一起时,使用 StringBuilder类可以提升性能. 通过用一个重载的构造函数方法初始化变量,可以创建 Strin

深入浅析springboot中static和templates区别

静态页面的return默认是跳转到/static/目录下,当在pom.xml中引入了thymeleaf组件,动态跳转会覆盖默认的静态跳转,默认就会跳转到/templates/下,注意看两者return代码也有区别,动态没有html后缀. 1.1 在static下新建hello1.html 运行程序,浏览器输入http://localhost:8080/hello1.html so,可以在根目录下访问hello1.html,static目录类似于传统Java web中的webroot或webcon

详解JAVA中static的作用

1.深度总结 引用一位网友的话,说的非常好,如果别人问你static的作用:如果你说静态修饰 类的属性 和 类的方法 别人认为你是合格的:如果是说 可以构成 静态代码块,那别人认为你还可以: 如果你说可以构成 静态内部类, 那别人认为你不错:如果你说了静态导包,那别人认为你很OK: 那我们就先在这几方面一一对static进行总结:然后说一些模糊的地方,以及一些面试中容易问道的地方: 1)static方法 static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方

浅析java中String类型中“==”与“equal”的区别

一.前言 1.1.首先很多人都知道,String中用"=="比较的是地址,用equals比较的是内容,很多人对此用的是记忆法,通过记忆来加强此的引用,但是其真正的原理其实并不难,当我们真正明白其为什么的时候,用起来也会更加灵活,更加有底气(形容得不太好,朋友别见怪): 二相关知识的准备 类型常量池 运行时常量池 字符串常量池 我们今天讨论的主题是当然是字符串常量池: 为什么在这要把另外两个常量池拿出说一下呢,首先小生我在网上或者cnds上看到很多人在争论字符串常量池是存在与方法区还是堆

Java中static作用详解

static表示"全局"或者"静态"的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static修饰的成员变量和成员方法独立于该类的任何对象.也就是说,它不依赖类特定的实例,被类的所有实例共享. 只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们.因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象. 用public修饰的static成员变量和成员方法本质是

JAVA中static方法的用法实例详解

本文实例讲述了JAVA中static方法的用法.分享给大家供大家参考,具体如下: static表示"全局"或者"静态"的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static修饰的成员变量和成员方法独立于该类的任何对象.也就是说,它不依赖类特定的实例,被类的所有实例共享.只要这个类被加载,Java虚拟机就能根据类名在运行时数据区或者方法区内找到他们.因此,static对象可以在它的任何对象创建之前访