Java中的内部类
2016-04-13 20:05
459 查看
1、内部类的分类:
a、成员内部类:
a.1、成员内部类与外部类在编译时,会生成两个class文件,其中内部类
的文件名为:外部类名$内部类名.class
a.2、成员内部类可以使用所有的修饰权限。
b、静态内部类:
b.1、静态内部类中可以定义静态或者非静态成员。
b.2、静态的含义就是该内部类可以像其他静态成员一样,在该外部类没有
实例化的对象时,通过类名.的方式实例化内部类。
c、方法内部类
c.1、方法内部类只能定义在该方法内部,且只能在方法内部实例化,在方法 外部实例化则不可以。
c.2、方法内部类对象不能使用该内部类所在方法的非final修饰的局部变量。
d、匿名内部类
d.1、只用到一个实例。
d.2、类定义后马上就要用到。
d.3、类非常非常的小(官方建议,匿名内部类的代码不超过4行)
d.4、给类命名并不会导致你的代码更容易理解。
拓展:
d.5、接口式:通过new+space+接口的方式创建匿名内部类,相当于创建了一个类实现了这个接口,而且,能且仅能实现1个接口。
d.6、参数式:通过匿名的方式直接实例化一个类,并且当作参数传递给某个方法,这个方法的局部变量就可以直接引用刚才创建好的匿名内部类的对象。
代码实例:
public class Car {
private SportsCar sportsCar = null;
public SportsCar getSportsCar(){
if (sportsCar == null) {
sportsCar = new SportsCar();
}
return sportsCar;
}
//成员内部类
class SportsCar{
}
//静态内部类
static class Bus{
}
//方法内部类
public void walk(final String lyric){
class Singing{
public Singing() {
System.out.println(lyric);
}
}
Singing singing = new Singing();
}
//匿名内部类
public void run(){
System.out.println("速度为; 50");
}
}
public class CoreJavaDay10_3 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//1、成员内部类的实例化
Car.SportsCar car = new Car().new SportsCar();
Car car2 = new Car();
SportsCar sportsCar = car2.getSportsCar();
//2、静态内部类的实例化
Car.Bus car3 = new Car.Bus();
//3、方法内部类的实例化,不能在这里实现,
// 因为方法内部类只能在对应的方法中实例化
car2.walk("123");
//4、匿名内部类
new Car(){
public void run(){
System.out.println("速度为: 100");
}
}.run();
2、内部类的应用场景:
a、内部类,仍然是一个独立的类,在编译之后,是$符号,连接左边的外部类与右边的内部类。
b、内部类不能用普通的方式访问,内部类是外部类的一个成员,因此内部类可以自由的访问外部类的成员变量,无论是不是private修饰的。
c、内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员。
a、成员内部类:
a.1、成员内部类与外部类在编译时,会生成两个class文件,其中内部类
的文件名为:外部类名$内部类名.class
a.2、成员内部类可以使用所有的修饰权限。
b、静态内部类:
b.1、静态内部类中可以定义静态或者非静态成员。
b.2、静态的含义就是该内部类可以像其他静态成员一样,在该外部类没有
实例化的对象时,通过类名.的方式实例化内部类。
c、方法内部类
c.1、方法内部类只能定义在该方法内部,且只能在方法内部实例化,在方法 外部实例化则不可以。
c.2、方法内部类对象不能使用该内部类所在方法的非final修饰的局部变量。
d、匿名内部类
d.1、只用到一个实例。
d.2、类定义后马上就要用到。
d.3、类非常非常的小(官方建议,匿名内部类的代码不超过4行)
d.4、给类命名并不会导致你的代码更容易理解。
拓展:
d.5、接口式:通过new+space+接口的方式创建匿名内部类,相当于创建了一个类实现了这个接口,而且,能且仅能实现1个接口。
d.6、参数式:通过匿名的方式直接实例化一个类,并且当作参数传递给某个方法,这个方法的局部变量就可以直接引用刚才创建好的匿名内部类的对象。
代码实例:
public class Car {
private SportsCar sportsCar = null;
public SportsCar getSportsCar(){
if (sportsCar == null) {
sportsCar = new SportsCar();
}
return sportsCar;
}
//成员内部类
class SportsCar{
}
//静态内部类
static class Bus{
}
//方法内部类
public void walk(final String lyric){
class Singing{
public Singing() {
System.out.println(lyric);
}
}
Singing singing = new Singing();
}
//匿名内部类
public void run(){
System.out.println("速度为; 50");
}
}
public class CoreJavaDay10_3 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//1、成员内部类的实例化
Car.SportsCar car = new Car().new SportsCar();
Car car2 = new Car();
SportsCar sportsCar = car2.getSportsCar();
//2、静态内部类的实例化
Car.Bus car3 = new Car.Bus();
//3、方法内部类的实例化,不能在这里实现,
// 因为方法内部类只能在对应的方法中实例化
car2.walk("123");
//4、匿名内部类
new Car(){
public void run(){
System.out.println("速度为: 100");
}
}.run();
2、内部类的应用场景:
a、内部类,仍然是一个独立的类,在编译之后,是$符号,连接左边的外部类与右边的内部类。
b、内部类不能用普通的方式访问,内部类是外部类的一个成员,因此内部类可以自由的访问外部类的成员变量,无论是不是private修饰的。
c、内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员。
相关文章推荐
- Java静态变量的初始化(static块的本质)
- eclipse设置的断点上有斜线
- 程序猿二三事之工具使用-Eclipse常用快捷键
- struts2中result跳转jsp时路径问题
- Java 压缩zip格式文件
- java的锁机制
- 我所了解的java单例模式
- SpringMVC三大设计原则
- Java虚拟机(JVM)体系结构概述及各种性能参数优化总结
- org.springframework.web.servlet.DispatcherServlet
- java开发之反射
- Java设计模式(二) Decorator(装饰)模式及Java I/O引申
- Myeclipse2014 安装反编译插件
- Java Web项目中Maven管理jar包,如何用命令添加ja包!
- Spring事务之事务控制方式
- Java中的排序方法(冒泡排序 和 选择排序)
- Intellij idea 和myeclipse的最常用快捷键
- Java中的数组
- SpringMvc 上传excel(注解和非注解两种方式)
- Java 基本语法