`
ydcworld
  • 浏览: 23699 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Java 内部类种类及使用解析

    博客分类:
  • java
 
阅读更多
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();

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();
}
}
我们可以用内部类来实现接口,这样就不会与外围类的方法冲突了
分享到:
评论

相关推荐

    java内部类的讲解

    ### Java内部类详解 #### 一、内部类的分类与概念 Java的内部类机制是其强大特性之一,它允许类作为另一个类的成员存在,从而增强了代码的封装性和复用性。根据定义和作用域的不同,Java内部类主要分为四类: 1. ...

    有关JAVA的内部类的好东西

    本篇文章将深入探讨Java内部类的种类、用法及其优势。 1. **内部类的种类**: - **成员内部类**:定义在类的主体中的类,可以是静态或非静态的。非静态内部类(也称为实例内部类)与外部类的实例紧密关联,而静态...

    java内部类解析[归类].pdf

    Java内部类是Java编程语言中的一个特色特性,它允许在一个类的定义内部定义另一个类。自Java 1.1引入内部类以来,这种特性一直备受争议。一方面,它提供了更高级别的封装和抽象,另一方面,如果使用不当,可能导致...

    java接口与内部类

    ### Java接口与内部类知识点详解 #### 接口概述 - **接口定义**: 在Java中,接口(Interface)是一种抽象类型,它定义了一组方法签名(即方法的名称和参数列表),但没有具体实现(即没有方法体)。接口提供了一种...

    JAVA内部类

    ### JAVA内部类详解 #### 引言 自Java1.1版本起,内部类的引入为面向对象编程提供了更为灵活的封装机制。然而,如同所有强大的特性,内部类的不当使用可能导致代码复杂度的增加,甚至产生维护上的困难。本文旨在...

    java编程技巧典型案例解析

    Java编程技巧典型案例解析 在Java编程领域,掌握高效、实用的编程技巧对于提升代码质量、优化性能以及提高开发效率至关重要。本资料集旨在通过一系列典型示例,深入剖析Java编程中的常见问题及其解决策略,帮助...

    一些常用的jar包

    压缩包中的文件 "Java 内部类种类及使用解析.docx" 专门针对Java的内部类进行了讨论。Java的内部类是一种强大的特性,它可以被定义在一个类的内部,提供了封装和抽象的新方式。内部类分为四种类型:成员内部类、局部...

    sun公司的Java内部培训教材

    Java是世界上最流行的编程语言之一,尤其在企业级应用开发领域占据主导地位。Sun Microsystems公司,作为Java的创始人,对Java的推广和发展起到了至...Sun公司的Java内部培训教材无疑是学习和提升Java技能的宝贵资源。

    JAVA_API1.6文档(中文)

    java.awt.datatransfer 提供在应用程序之间和在应用程序内部传输数据的接口和类。 java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中...

    java读取flv

    Java读取FLV文件是Java开发中涉及到多媒体处理的一个应用场景,通常用于视频流的解析、播放或者转换。FLV(Flash Video)是一种流行的网络视频格式,广泛用于在线视频分享平台,如YouTube。以下是对这个主题的详细...

    JAVA异常分类和处理解析

    JAVA异常分类和处理解析 JAVA异常分类和处理解析是 Java 语言中的一种机制,通过该机制,可以捕获和处理程序在执行过程中出现的异常或错误。异常分类是指对不同的异常或错误进行分类,处理解析则是指如何对这些...

    Java IO处理类的汇总

    本篇文章将全面解析Java IO处理类,包括基本概念、常用类库、流的概念及分类,以及实际编程中的应用。 首先,Java IO体系基于流(Stream)的概念,流是数据的序列,可以是从输入源读取或向输出目标写入。Java IO提供...

    Java程序设计基础分类复习(答案)

    以下是对Java基础的详细解析: 1. **Java简介**: Java是由Sun Microsystems公司(现已被Oracle收购)开发的一种面向对象的编程语言,以其“一次编写,到处运行”的跨平台特性而闻名。Java应用广泛,包括桌面应用...

    Java 1.6 API 中文 New

    java.awt.datatransfer 提供在应用程序之间和在应用程序内部传输数据的接口和类。 java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示...

    java23种设计模式解析及源码

    19. **状态模式**:允许对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。 20. **策略模式**:定义一系列的算法,并将每一个算法封装起来,使它们可以互相替换。策略模式让算法的变化独立于使用它...

    文章分类:Java编程,java面试题1

    以上就是根据给定的信息整理出来的Java面试题及相关的知识点解析。这些知识点涵盖了Java语言的基础特性、面向对象编程的概念以及集合框架等多个方面,对于准备面试或希望深入理解Java的开发者来说都是非常重要的。

    面试题汇总:Markdown编写,作为Java知识库提供给Java面试必考小程序使用.zip

    这份名为"面试题汇总:Markdown编写,作为Java知识库提供给Java面试必考小程序使用.zip"的压缩包,显然是为了帮助Java求职者准备面试而设计的。它包含了丰富的Java知识和面试常见问题,以Markdown格式编写,易于阅读...

    javaApi分类[参考].pdf

    4. **Java.awt.datatransfer**: 支持在不同应用程序间或者应用程序内部进行数据交换,如剪贴板操作,包含了DataFlavor和Clipboard等类。 5. **Java.awt.dnd**: Drag and Drop功能的实现,提供了DragGestureListener...

    Java经典面试题大全(带答案)

    ### Java经典面试题知识点解析 #### 一、单项选择题知识点解析 1. **Java的起源** - **知识点**:Java的历史和发展。 - **解释**:Java是由Sun Microsystems公司的James Gosling等人于1995年创建的。它是在C++的...

Global site tag (gtag.js) - Google Analytics