java核心技术-内部类

高级类特性-(类的成员之一:内部类)
内的成员之一:内部类(属性、方法、构造器、代码块) 能够有四种权限访问修饰符java

注意:外部类 只有两种 public 和 defaultsql

定义 : 能够将一个类的定义放在另外一个类定义的内部,这就是内部类 -thinking in Java后端

用法:若是一个类 仅跟本类关系密切的话 对于其余类但愿隐藏 就可使用内部类 例ArrayList中的 Itr架构

一.成员内部类并发

成员内部类也是最普通的内部类,它是外围类的一个成员。分布式

在成员内部类中要注意两点,第一:成员内部类中不能存在任何static的变量和方法;第二:成员内部类是依附于外围类的,因此只有先建立了外围类才可以建立内部类。ide

public class TestInnerClass {
public static void main(String[] args) {
//建立非静态内部类的对象
Person p = new Person();
Person.Computer pc = p.new Computer();
pc.setName("IBM");
//System.out.println(pc.getName());
}
}
class Person {
private String name = "张三";
private int age;高并发

public Person() {
    super();
}

public Person(String name, int age) {
    super();
    this.name = name;
    this.age = age;
}

public class Computer{
    private String name = "lenovo";

    public String getName() {
        return name;
    }

    public void setName(String name) {
        System.out.println("setName 方法局部变量name: " + name);
        System.out.println("Computer 的属性name:" + this.name);
        System.out.println("外部内Person 属性的name:" + Person.this.name);
        this.name = name;
    }

}

}
二.局部内部类性能

有这样一种内部类,它是嵌套在方法和做用于内的,对于这个类的使用主要是应用与解决比较复杂的问题,想建立一个类来辅助咱们的解决方案,到那时又不但愿这个类是公共可用的,因此就产生了局部内部类,局部内部类和成员内部类同样被编译,只是它的做用域发生了改变,它只能在该方法和属性中被使用,出了该方法和属性就会失效。(作Java后端 用法极少见 本人三年开发 从没见过有人用过)学习

public class TestInnerClass2 {

//局部内部类:以下方式使用很是的少
private void show(){

    class Inner{

    }
}

//若是一个类仅适用于当前方法时,能够声明以下方式
public static Comparator getComparator(){

    class MyComparator implements Comparator{

        @Override
        public int compare(Object o1, Object o2) {
            return 0;
        }

    }
    return new MyComparator();
}

public static void main(String[] args) {
    Comparator comparator = TestInnerClass2.getComparator();
}

}
三.匿名内部类

注意:

1.匿名内部类是没有访问修饰符的
2.想使用外部的一个变量 该变量要用final修饰 -java8开始不须要
public class TestInnerClass2 {

public static Comparator getComparator1(){

    Comparator com = new Comparator(){ //匿名内部类实现的Comparator接口,new的是匿名内部类的构造器

        @Override
        public int compare(Object o1, Object o2) {
            // TODO Auto-generated method stub
            return 0;
        }

    };

    return com;
}

public static void main(String[] args) {
    Comparator comparator = TestInnerClass2.getComparator1();
    /*  comparator.compare(o1, o2);*/
}

}
四.静态内部类

在java提升篇-----关键字static中提到Static能够修饰成员变量、方法、代码块,其余它还能够修饰内部类,使用static修饰的内部类咱们称之为静态内部类,不过咱们更喜欢称之为嵌套内部类。静态内部类与非静态内部类之间存在一个最大的区别,它是属于类自己,而不是某个对象。

public class TestInnerClass {
public static void main(String[] args) {
//建立静态内部类的实例
Person.Mobile pm = new Person.Mobile();
pm.show();

}

}

class Person {

//静态内部类
static class Mobile{
    public void show(){
        System.out.println("这是静态内部类的方法");
    }
}

}
五.内部类标识符

因为每一个类都会产生一个.class文件,其中包含了如何建立该类型的对象的所有信息。您可能猜到了,内部类也必须生成一个.class文件以包含它们的Class对象信息。这些类文件的命名有严格的规则:外围类的名字,加上$,再加上内部类的名字。若是内部类是匿名的,编译器会简单地产生一个数字做为其标识符。 欢迎工做一到五年的Java工程师朋友们加入Java群: 891219277群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用本身每一分每一秒的时间来学习提高本身,不要再用"没有时间“来掩饰本身思想上的懒惰!趁年轻,使劲拼,给将来的本身一个交代!

相关文章
相关标签/搜索