- 浏览: 22194 次
- 性别:
- 来自: 成都
最新评论
Java中的内部类共分为四种:
静态内部类static inner class (also called nested class)
成员内部类member inner class
局部内部类local inner class
匿名内部类anonymous inner class
作用
1.内部类可以很好的实现隐藏
一般的非内部类,是不允许有 private 与protected权限的,但内部类可以
2.内部类拥有外围类的所有元素的访问权限
3.可是实现多重继承
4.可以避免修改接口而实现同一个类中两种同名方法的调用。
下面看些例子
静态内部类Static Inner Class
类定义时加上static关键字。
不能和外部类有相同的名字。
被编译成一个完全独立的.class文件,名称为OuterClass$InnerClass.class的形式。
只可以访问外部类的静态成员和静态方法,包括了私有的静态成员和方法。
生成静态内部类对象的方式为:
OuterClass.InnerClass inner = new OuterClass.InnerClass();
成员内部类Member Inner Class
成员内部类就像一个实例变量。
它可以访问它的外部类的所有成员变量和方法,不管是静态的还是非静态的都可以。
在外部类里面创建成员内部类的实例:
this.new Innerclass();
在外部类之外创建内部类的实例:
(new Outerclass()).new Innerclass();
在内部类里访问外部类的成员:
Outerclass.this.member
局部内部类Local Inner Class
局部内部类定义在方法中,比方法的范围还小。是内部类中最少用到的一种类型。
像局部变量一样,不能被public, protected, private和static修饰。
只能访问方法中定义的final类型的局部变量。
局部内部类在方法中定义,所以只能在方法中使用,即只能在方法当中生成局部内部类的实例并且调用其方法。
匿名内部类Anonymous Inner Class
匿名内部类就是没有名字的局部内部类,不使用关键字class, extends, implements, 没有构造方法。
匿名内部类隐式地继承了一个父类或者实现了一个接口。
匿名内部类使用得比较多,通常是作为一个方法参数。
实现隐藏
实现多重继承
避免修改接口而实现同一个类中两种同名方法的调用
大家假想一下如果,你的类要继承一个类,还要实现一个接口,可是你发觉你继承的类和接口里面有两个同名的方法怎么办?你怎么区分它们??这就需要我们的内部类了。看下面的代码
接口
package insidecategory;
public interface Incrementable
{
void increment();
}
类 MyIncrement
package insidecategory;
public class MyIncrement {
public void increment()
{
System.out.println("Other increment()");
}
static void f(MyIncrement f)
{
f.increment();
}
}
大家看上面加黑的部分,两个方法都是一样的。在看下面这个类要继承这两个类
如果不用内部类
package insidecategory;
public class Callee2 extends MyIncrement implements Incrementable
{
public void increment()
{
//代码
}
}
想问一下大家increment()这个方法是属于覆盖MyIncrement这里的方法呢?还是Incrementable这里的方法。我怎么能调到MyIncrement这里的方法?显然这是不好区分的。而我们如果用内部类就很好解决这一问题了。看下面代码
package insidecategory;
public class Callee2 extends MyIncrement
{
private int i=0;
private void incr()
{
i++;
System.out.println(i);
}
private class Closure implements Incrementable
{
public void increment()
{
incr();
}
}
Incrementable getCallbackReference()
{
return new Closure();
}
}
我们可以用内部类来实现接口,这样就不会与外围类的方法冲突了
静态内部类static inner class (also called nested class)
成员内部类member inner class
局部内部类local inner class
匿名内部类anonymous inner class
作用
1.内部类可以很好的实现隐藏
一般的非内部类,是不允许有 private 与protected权限的,但内部类可以
2.内部类拥有外围类的所有元素的访问权限
3.可是实现多重继承
4.可以避免修改接口而实现同一个类中两种同名方法的调用。
下面看些例子
静态内部类Static Inner Class
类定义时加上static关键字。
不能和外部类有相同的名字。
被编译成一个完全独立的.class文件,名称为OuterClass$InnerClass.class的形式。
只可以访问外部类的静态成员和静态方法,包括了私有的静态成员和方法。
生成静态内部类对象的方式为:
OuterClass.InnerClass inner = new OuterClass.InnerClass();
public class TestExample { private String name; private static String constant ="test"; public static void main(String args[]) { TestExample.Inner a = new TestExample.Inner(); } static class Inner{ public Inner(){ //System.out.println(name);//only reference static variable or method of outer class. System.out.println(constant); } } }
成员内部类Member Inner Class
成员内部类就像一个实例变量。
它可以访问它的外部类的所有成员变量和方法,不管是静态的还是非静态的都可以。
在外部类里面创建成员内部类的实例:
this.new Innerclass();
在外部类之外创建内部类的实例:
(new Outerclass()).new Innerclass();
在内部类里访问外部类的成员:
Outerclass.this.member
public class TestExample { private String name; private static String constant ="test"; public static void main(String args[]) { TestExample.Inner a = new TestExample().new Inner(); } class Inner{ public Inner(){ System.out.println(name);//can reference all kinds of outer class variable or method. System.out.println(constant); } } }
局部内部类Local Inner Class
局部内部类定义在方法中,比方法的范围还小。是内部类中最少用到的一种类型。
像局部变量一样,不能被public, protected, private和static修饰。
只能访问方法中定义的final类型的局部变量。
局部内部类在方法中定义,所以只能在方法中使用,即只能在方法当中生成局部内部类的实例并且调用其方法。
public class TestExample { private String name; private static String constant ="test"; public static void main(String args[]) { TestExample a = new TestExample(); a.say(); } public void say() { String methodname = "say"; final String methodname2 = "say"; class LocalInner{ public LocalInner(){ System.out.println(name);//can reference all kinds of variable or method of outer class . System.out.println(constant); //System.out.println(methodname);//error System.out.println(methodname2);//only reference final variable in local. } } new LocalInner(); } }
匿名内部类Anonymous Inner Class
匿名内部类就是没有名字的局部内部类,不使用关键字class, extends, implements, 没有构造方法。
匿名内部类隐式地继承了一个父类或者实现了一个接口。
匿名内部类使用得比较多,通常是作为一个方法参数。
public class TestExample { private String name; private static String constant = "test"; public static void main(String args[]) { TestExample a = new TestExample(); a.getDate(new Date(){ @Override @Deprecated public String toLocaleString() { return "Hello: " + super.toLocaleString(); } }); } public String getDate(Date date) { return date.toLocaleString(); } }
实现隐藏
package insidecategory; public interface Incrementable { void increment(); } 具体类 package insidecategory; public class Example { private class InsideClass implements Incrementable { public void increment() { System.out.println("这是一个测试"); } } public InterfaceTest getIn() { return new InsideClass (); } } public class TestExample { public static void main(String args[]) { Example a=new Example(); InterfaceTest a1=a.getIn(); a1.test(); } }
实现多重继承
类一 package insidecategory; public class Example1 { public String name() { return "liutao"; } } 类二 package insidecategory; public class Example2 { public int age() { return 25; } } 类三 package insidecategory; public class MainExample { private class test1 extends Example1 { public String name() { return super.name(); } } private class test2 extends Example2 { public int age() { return super.age(); } } public String name() { return new test1().name(); } public int age() { return new test2().age(); } public static void main(String args[]) { MainExample mi=new MainExample(); System.out.println("姓名:"+mi.name()); System.out.println("年龄:"+mi.age()); } }
避免修改接口而实现同一个类中两种同名方法的调用
大家假想一下如果,你的类要继承一个类,还要实现一个接口,可是你发觉你继承的类和接口里面有两个同名的方法怎么办?你怎么区分它们??这就需要我们的内部类了。看下面的代码
接口
package insidecategory;
public interface Incrementable
{
void increment();
}
类 MyIncrement
package insidecategory;
public class MyIncrement {
public void increment()
{
System.out.println("Other increment()");
}
static void f(MyIncrement f)
{
f.increment();
}
}
大家看上面加黑的部分,两个方法都是一样的。在看下面这个类要继承这两个类
如果不用内部类
package insidecategory;
public class Callee2 extends MyIncrement implements Incrementable
{
public void increment()
{
//代码
}
}
想问一下大家increment()这个方法是属于覆盖MyIncrement这里的方法呢?还是Incrementable这里的方法。我怎么能调到MyIncrement这里的方法?显然这是不好区分的。而我们如果用内部类就很好解决这一问题了。看下面代码
package insidecategory;
public class Callee2 extends MyIncrement
{
private int i=0;
private void incr()
{
i++;
System.out.println(i);
}
private class Closure implements Incrementable
{
public void increment()
{
incr();
}
}
Incrementable getCallbackReference()
{
return new Closure();
}
}
我们可以用内部类来实现接口,这样就不会与外围类的方法冲突了
发表评论
-
Linux安装JDK15
2020-12-10 16:53 3961.下载64位JKD 15.0.1.tar.gz 地址:htt ... -
java内存分配分析/栈内存、堆内存
2016-03-23 18:31 427java内存分配分析 本文将由浅入深详细介绍Java内存分配 ... -
Java中equals和==的区别
2016-03-23 10:45 465一、java当中的数据类型和“==”的含义: 基本数据类型 ... -
jvm学习笔记--基本结构
2014-09-04 14:59 529主要来学习jvm的基本结构 知识点1:什么是java ... -
Stack and Heap
2014-06-20 17:54 743Read a good article about Heap ... -
深入Java,初探JVM一
2014-06-19 09:39 416JAVA和JVM运行的原理,Jav ... -
java 值传递和引用传递详 解
2014-06-11 14:21 411最 近 遇到java 值传递和引用传递问题 ,做 了 一 个 ... -
jdk,jre关系
2013-02-18 17:06 589SDK(Software Develop Kit,软件开发工具 ... -
MySQL存储过程
2012-12-03 00:01 507MySQL存储过程 1.1 ... -
JAVA反射机制
2012-11-25 16:11 339看到一偏关于java反射机制的文章觉得不错,分享一下 JAVA ... -
JAVA读取键盘上输入信息
2012-11-13 22:05 687方法一:从控制台接收 ... -
cglib中Enhancer的简单使用
2012-09-13 09:36 1078cglib 是一个强大的, 高效高质的代码生成库. 简单的使 ... -
内存溢出
2012-09-13 09:22 6421. Java Method Stack 栈溢出实验什么时候会 ... -
java中的IO整理
2012-08-30 22:33 664今天看天一篇关于IO的文章,感觉写得很不错,在这里贴出来,分享 ... -
java核心
2012-08-28 12:10 697学习了一段时间的java后,小有感触,结合网上的资料和大家分享 ... -
eclipse常用快捷
2012-08-19 01:18 608一、实用类快捷键 ...
相关推荐
java.awt.datatransfer 提供在应用程序之间和在应用程序内部传输数据的接口和类。 java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中...
java.awt.datatransfer 提供在应用程序之间和在应用程序内部传输数据的接口和类。 java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示...
java.awt.datatransfer 提供在应用程序之间和在应用程序内部传输数据的接口和类。 java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示...
java.awt.datatransfer 提供在应用程序之间和在应用程序内部传输数据的接口和类。 java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中...
Java 知识汇总(资源,工具,笔记,源码,文章,文档分类整理).zip ## 项目宗旨 - **Java基础** 面向对象基本语法,抽象类,接口,内部类等;常用类api使用;常用算法,常用加密算法;Rxjava的使用;Http客户端接口测试,Okhttp的...
java.awt.datatransfer 提供在应用程序之间和在应用程序内部传输数据的接口和类。 java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中...
java.awt.datatransfer 提供在应用程序之间和在应用程序内部传输数据的接口和类。 java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中...
12.5.2 使用集合工具类同步化集合类对象324 12.5.3 使用JDK5.0后提供的并发集合类324 12.6 用Timer类调度任务325 12.7 本章练习326 第13章 13.1 java.io.File类328 13.1.1 文件和目录是什么?328 13.1.2 Java对文件...
第二十二章:使用Java解析XML 397 学习目标 397 解析器的介绍 398 DOM以及广义的基于树的处理具有几个优点 399 文档对象模型(DOM)解析实例 402 DOM对象 404 DOM解析的例子: 406 SAX解析实例 409 DOM4J解析实例 ...
java.awt.datatransfer 提供在应用程序之间和在应用程序内部传输数据的接口和类。 java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中...
实例68 植物种类(运用映射的相关类) 165 实例69 不重复的随机数序列 168 实例70 读写Properties文件 170 实例71 配置Properties带附件发送邮件 175 实例72 资源国际化(Properties) 179 常见问题 读取...
以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题。 public class ThreadTest1{ private int j; public static void main(String args[]){ ThreadTest1 tt=new ThreadTest1(); Inc inc=tt.new Inc(); ...
java.awt.datatransfer 提供在应用程序之间和在应用程序内部传输数据的接口和类。 java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示...
以前写了一个java的正规表达式的java工具类,分享一下,有用到的欢迎下载使用。 如果你有常用的定义好的,且测试通过的正规表达式,欢迎跟贴,也让我享用一下 . 类中用到了 jakarta-oro-2.0.jar 包,请大家自己在 ...