java核心技术-内部类
程序员文章站
2023-11-23 22:26:28
高级类特性 (类的成员之一:内部类) 内的成员之一:内部类(属性、方法、构造器、代码块) 可以有四种权限访问修饰符 注意:外部类 只有两种 public 和 default 定义 : 可以将一个类的定义放在另一个类定义的内部,这就是内部类 thinking in Java 用法:如果一个类 仅跟本类 ......
高级类特性-(类的成员之一:内部类)
内的成员之一:内部类(属性、方法、构造器、代码块) 可以有四种权限访问修饰符
注意:外部类 只有两种 public 和 default
定义 : 可以将一个类的定义放在另一个类定义的内部,这就是内部类 -thinking in java
用法:如果一个类 仅跟本类关系密切的话 对于其他类希望隐藏 就可以使用内部类 例arraylist中的 itr
一.成员内部类
成员内部类也是最普通的内部类,它是外围类的一个成员。
在成员内部类中要注意两点,第一:成员内部类中不能存在任何static的变量和方法;第二:成员内部类是依附于外围类的,所以只有先创建了外围类才能够创建内部类。
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对象信息。这些类文件的命名有严格的规则:外围类的名字,加上$,再加上内部类的名字。
如果内部类是匿名的,编译器会简单地产生一个数字作为其标识符。