【Java基础知识】内部类详解
来源:互联网 发布:冋花顺炒股软件 编辑:程序博客网 时间:2024/06/05 14:09
1.定义:
将一个类的定义放在另一个类的定义内部,与之对应包含内部类的类被称为外部类
2.内部类的作用:
(1)内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类;
(2)内部类的方法可以直接访问外部类的所有数据,包括私有的数据;
(3)内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便;
(4)每个内部类都能独立的继承一个(接口)实现,无论外部类是否已经继承了个(接口)实现,对于内部类没有影响;
(5)内部类不能被覆盖,但可通过继承实现。
3.普通内部类(成员内部类)
(1)使用方法:
* 内部类定义在外部类的内部,相当于外部类的一个成员变量的位置,内部类可以使用任意访问控制符,如 public 、 protected 、 private 等;
*内部类中定义的方法可以直接访问外部类中的数据,而不受访问控制符的影响
*定义了成员内部类后,必须使用外部类对象来创建内部类对象,而不能直接去 new 一个内部类对象,
即:内部类 对象名 = 外部类对象.new 内部类( );
例:
Outer o = new Outer(); //创建外部类对象Inner io = o.new Inner(); //创建内部类对象
*编译上面的程序后,会发现产生了两个 .class ⽂文件;外部类对应的class文件是:外部类名 .class ,内部类对应的class文件是:外部类名$内部类名.class
(2)注意:
*外部类是不能直接使用内部类的成员和方法,可先创建内部类的对象,然后通过内部类的对象来访问其成员变量和方法。
*如果外部类和内部类具有相同的成员变量或方法,内部类默认访问自己的成员变量量或方法,如果要访问外部类的成员变量量,可以使用 this 关键字。
例:
public class Employee { private String name = "Redis"; class Mannger { private String name = "Netty"; public void getName(){ String name = "Lee"; System.out.println("局部变量:" + name); System.out.println("内部类变量:" + this.name); System.out.println("外部类变量:" + Employee1.this.name); } } public static void main(String[] args) { Employee e = new Employee(); Mannger m = e.new Mannger(); m.getName(); }}
运行结果:
局部变量:Lee内部类变量:Netty外部类变量:Redis
4.静态内部类
(1)定义:由static关键字修饰的内部类。
(2)特点:
*静态内部类不能直接访问外部类的非静态成员,但可以通过new 外部类().成员 的方式访问
*如果外部类的静态成员与内部类的成员名称相同,可通过“类名.静态成员”访问外部类的静态成员;若不同,则可通过“成员名”直接调.用外部类的静态成员
*创建静态内部类的对象时,不需要外部类的对象,可以直接创建
即:内部类 对象名= new 内部类();
例:
public class Employee2 { private static String name = "Redis"; static class Mannger { private String name = "Netty"; public String getName(){ return this.name; } } public static void main(String[] args) { Mannger m = new Mannger(); System.out.println(m.getName()); }}
运行结果:
Netty
5.方法内部类
(1)定义:
内部类定义在外部类的方法中,方法内部类只在该方法的内部可见,即只在该方法内可以使用。
(2)局限:
由于方法内部类不能在外部类的方法以外的地方使用,因此方法内部类不能使用访问控制符和 static 修饰符。
例:
public class Parcel { public String destination() { String label = "top"; class Destination { public void readLabel() { System.out.println("方法内部类!"); } } new Destination().readLabel(); return label; } public static void main(String[] args) { Parcel p = new Parcel(); System.out.println(p.destination()); }}
运行结果:
方法内部类!top
6.匿名内部类
(1)定义:
只创建内部类的一个对象,没有名称。
(2) 注意:
*使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。
*匿名内部类中是不能定义构造函数的。
*匿名内部类中不能存在任何的静态成员变量和静态方法。
*匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。
*匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。
例:
public class Bird { public Goose getName(int n){ return new Goose (){ int number = 6 + n; public int getNumber(){ return number; } }; } public static void main(String[] args) { Bird bird = new Bird(); Goose goose = bird.getName(3); System.out.println(goose.getNumber()); }}interface Goose { int getNumber();}//输出结果: 9
本人才疏学浅,若有错误,请指出~
谢谢!
- 【Java基础知识】内部类详解
- java基础知识-内部类
- java基础知识-内部类
- 【Java基础知识】内部类
- Java基础知识—内部类
- java内部类详解
- Java内部类详解
- 详解 java 内部类
- java内部类详解
- java内部类详解
- java 内部类详解
- 【java】内部类详解
- java内部类详解
- java 内部类详解
- java内部类详解
- java内部类详解
- Java内部类详解
- java 内部类详解
- 浅谈 A*算法
- 增加搜索引擎对网站的权重 网站体系架构是第一位
- java项目学习方法(1)
- Change HDU
- DB2-SQLSTATE 消息大全---[IBM官方]
- 【Java基础知识】内部类详解
- 设置状态栏高亮解决
- 活到81岁你会干嘛?选择为 iOS 开发软件的她厉害了!
- HDU 1698 Just a Hook 线段树区间更新求和
- Frogger
- poj1050-To the Max(最大子段和)
- Android中Gradle实用指南
- Ubuntu14登录不进去循环登录的解决办法
- 差分约束板子