`

java 内部类

    博客分类:
  • java
阅读更多

一,什么是内部类?

    内部类是指在一个外部类的内部再定义一个类,类名不需要和文件名相同。而对于一般的,类定义代码不嵌套在其它类定义中的类,成为顶层(top-level)类,对于一个内部类,包含定义代码的类称为外部类(outer class)。

   内部类和外部类的比较:                                              

     1,内部类可以是静态static的,也可用public,default,protected和private修饰。(而外部顶级类即类名和文件名相同的只能使用public和default)。                                    

    2,内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。对于一个名为outer的外部类和其内部定义的名为inner的内部类。编译完成后出现           outer.class和outer$inner.class两类。所以内部类的成员变量/方法名可以和外部类的相同。

二,内部类的作用?

      内部类存在的目的应该只是为它的外围类(outer class)提供服务,如果内部类可能用于其它的某个环境中,它就应该是顶层类。

      内部类的作用(这个是这篇博客总结的比较好http://andy136566.iteye.com/blog/1061951)

                              可以很好的实现隐藏(因为内部类可以有private与protected权限)。

                              内部类有外部类所以元素的访问权限。

                              可以实现伪多重继承。

                             

三,内部类的分类

      A.成员内部类

         成员内部类,就是作为外部类的成员,可以直接使用外部类的所有成员和方法,即使是private的。同时外部类要访问内部类的所有成员变量/方法,则需要通过内部类的对象来获取。       要注意的是,成员内部类不能含有static的变量和方法。成员内部类需要先创建了外部类,才能创建它自己的

          在成员内部类要引用外部类对象时,使用outer.this来表示外部类对象

          而需要创建内部类对象,可以使用outer.inner  obj = outerobj.new inner();

    public class Outer { 
        public static void main(String[] args) { 
            Outer outer = new Outer(); 
            Outer.Inner inner = outer.new Inner(); 
            inner.print("Outer.new"); 
     
            inner = outer.getInner(); 
            inner.print("Outer.get"); 
        } 
     
        // 个人推荐使用getxxx()来获取成员内部类,尤其是该内部类的构造函数无参数时 
        public Inner getInner() { 
            return new Inner(); 
        } 
     
        public class Inner { 
            public void print(String str) { 
                System.out.println(str); 
            } 
        } 
    } 

 B.局部内部类

   局部内部类,是指内部类定义在方法和作用域内(局部内部类用的比较少)

    public class Parcel4 { 
        public Destination destination(String s) { 
            class PDestination implements Destination { 
                private String label; 
     
                private PDestination(String whereTo) { 
                    label = whereTo; 
                } 
     
                public String readLabel() { 
                    return label; 
                } 
            } 
            return new PDestination(s); 
        } 
     
        public static void main(String[] args) { 
            Parcel4 p = new Parcel4(); 
            Destination d = p.destination("Tasmania"); 
        } 
    } 

 

    定义在作用域里:

    public class Parcel5 { 
        private void internalTracking(boolean b) { 
            if (b) { 
                class TrackingSlip { 
                    private String id; 
                    TrackingSlip(String s) { 
                        id = s; 
                    } 
                    String getSlip() { 
                        return id; 
                    } 
                } 
                TrackingSlip ts = new TrackingSlip("slip"); 
                String s = ts.getSlip(); 
            } 
        } 
     
        public void track() { 
            internalTracking(true); 
        } 
     
        public static void main(String[] args) { 
            Parcel5 p = new Parcel5(); 
            p.track(); 
        } 
    } 

     局部内部类也像别的类一样进行编译,但只是作用域不同而已,只在该方法或条件的作用域内才能使用,退出这些作用域后无法引用的

 

 C.静态内部类

   就是修饰为static的内部类。声明为static的内部类,不需要内部类对象和外部类对象之间的联系,就是说我们可以直接引用ou ter.inner,即不需要创建外部类,也不需要创建内部类。嵌套类和普通的内部类还有一个区别:普通内部类不能有static数据和static属性,也不能包含嵌套类,但嵌套类可以。而静态内部类,一般声明为public,方便调用,如果声明为private只能在外部类的内部使用。

 

public class Outer {
	    static int x =1;
	    static class Nest {
	        void print(){
 	            System.out.println("Nest "+x);
 	        }
 	    }
 	    public static void main(String[] args){
 	        Outer.Nest nest = new Outer.Nest();
	        nest.print();
 	    }
 	}

 因为静态嵌套类和其他静态方法一样只能访问其它静态的成员,而不能访问实例成员。因此静态嵌套类和外部类(封装类)之间的联系就很少了,他们之间可能也就 是命名空间上的一些关联。上面例子中你需要注意的就是静态嵌套类的声明方法 new Outer.Nest() 连续写了两个类名,以至于我们都怀疑前面的Outer是个包名了,好在包名一般都小写的,要不还真分不清……

 

 

D.匿名内部类   当我们把内部类的定义和声明写到一起时,就不用给这个类起个类名而是直接使用了,这种形式的内部类根本就没有类名,因此我们叫它匿名内部类。匿名类在事件处理中最常用。

 

public class Dog {
	    public interface Pet {
	        public void beFriendly();
                public void play();
 	    }
	  public static void main(String[] args){
 	        Pet dog = new Pet(){
 	            @Override
	            public void beFriendly() {
	                System.out.println("蹭蹭你^_^");
	            }
	            @Override
                public void play() {
	                System.out.println("把飞盘叼给你,逼你把飞盘丢出去,然后它再捡回来让你继续扔,连续500次^_^");
                    }
 	         };
	        dog.beFriendly();
 	        dog.play();
 	 
 	    }
 	}

 好吧我们再看一个例子,方法参数内的匿名内部类在事件处理中很常见

 

 

public class Dog { 
       static abstract class Ball {
               abstract String getName();
        }
        void play(Ball b){
	      System.out.println(b.getName());
 	}
	public static void main(String[] args){
 	     Dog dog = new Dog();
	      dog.play(new Ball(){
                 @Override
	            String getName() {
	                return "qiu qiu";
	     }});
	    }
	}

 

 

 

 

 

 

1
0
分享到:
评论

相关推荐

    java内部类详解

    Java 内部类详解 Java 内部类是一种高级特性,允许在一个类的定义内部创建另一个类。这种设计模式提供了更灵活的代码组织方式,同时还可以实现特定的封装和访问控制。内部类主要分为四种类型:静态内部类、成员内部...

    Java内部类总结

    ### Java内部类总结 在Java编程语言中,内部类是一个重要的概念,它允许开发者在一个类的内部定义另一个类。这种特性极大地增强了代码的封装性和复用性,同时也为解决特定问题提供了灵活的方法。本文将围绕Java内部...

    java内部类的讲解

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

    Java 内部类

    Java 内部类是Java语言特性中的一个重要组成部分,它允许我们在一个类的内部定义另一个类。内部类可以访问外部类的所有成员,包括私有成员,这使得内部类在实现复杂逻辑和封装上具有很大的灵活性。下面我们将详细...

    浅谈Java内部类的四个应用场景

    ### Java内部类的应用场景 #### 场景一:当某个类除了它的外部类,不再被其他的类使用时 内部类的使用场景之一是当某个类仅需被其外部类使用时。这种情况下,将此类定义为内部类可以提高代码的封装性和可维护性。 ...

    java内部类使用例子

    Java内部类是Java语言提供的一种独特特性,它允许我们在一个类的定义内部定义另一个类。这种内部类可以是成员内部类、局部内部类、匿名内部类或静态内部类,每种都有其特定的用途和使用场景。在这个"java内部类使用...

    12.java内部类.zip

    12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类...

    java 内部类应用

    Java内部类是Java语言的一个特色特性,它允许我们在一个类的内部定义另一个类。这种设计模式在处理一些特定情况时非常有用,例如实现匿名回调、封装特定逻辑或创建与外部类有紧密关系的类。本篇文章将深入探讨Java...

    JAVA 内部类 PPT

    Java内部类是Java语言的一个独特特性,它允许我们在一个类的内部定义另一个类。这种设计提供了更高级别的封装和组织代码的方式。以下是关于内部类及其相关知识点的详细说明: 1. **内部类基本语法** - **实例内部...

    JAVA内部类总结

    ### JAVA内部类总结 在Java编程语言中,内部类(Inner Classes)是一种非常重要的特性,它允许我们在一个类的内部定义另一个类。这种结构不仅能够提高代码的组织性,还能帮助我们更好地处理类与类之间的关系。根据...

    java 内部类使用(内部匿名类)

    Java内部类是Java语言提供的一种独特机制,它允许在一个类的内部定义另一个类。这种设计模式使得代码结构更紧凑,可以更好地封装和隐藏实现细节,同时也增强了代码的复用性。内部类分为几种类型,包括成员内部类、...

    java内部类总结(含概念和实例)

    Java 内部类总结 Java 内部类是指在一个外部类的内部再定义一个类。内部类作为外部类的一个成员,并且依附于外部类而存在的。内部类可为静态,可用 protected 和 private 修饰(而外部类只能使用 public 和缺省的包...

    java 内部类 局部内部类 匿名类 实例代码

    Java内部类是Java语言特性中一个独特而强大的部分,它允许在一个类的内部定义另一个类。内部类可以访问外部类的所有成员,包括私有成员,这使得内部类在实现某些特定设计模式时非常有用。本篇文章将深入探讨Java中的...

    Java语法总结 - 内部类

    Java内部类详解 Java内部类是Java语言中的一种特殊类别,它是指定义在另外一个类内部的类。内部类可以访问外部类的所有成员变量和方法,包括私有的变量和方法。内部类可以分为四种:成员内部类、静态嵌套类、方法...

    Java内部类的四个应用场景

    谈Java内部类的四个应用场景

    java内部类使用总结

    Java内部类是Java语言中一个独特且强大的特性,它允许我们在一个类的内部定义另一个类。内部类提供了增强封装的能力,使得内部类可以被隐藏在外部类中,仅对外部类可见,从而增加了代码的隐私性和安全性。同时,内部...

    Java内部类的作用

    ### Java内部类的作用 #### 一、定义及概念 内部类,顾名思义,指的是一个定义在另一个类内部的类。这样的结构让内部类能够访问外部类的成员(包括私有成员),并且允许内部类拥有不同的访问级别,如`private`、`...

    Java内部类_动力节点Java学院整理

    Java内部类是Java语言的一个重要特性,它允许我们在一个类的内部定义另一个类。这种设计模式使得代码结构更加紧凑,同时也提供了更高级的封装和抽象。内部类主要有两种类型:成员内部类和局部内部类。 1. 成员内部...

Global site tag (gtag.js) - Google Analytics