理解 java 內(nèi)部類(lèi)
1、內(nèi)部類(lèi)基礎(chǔ)知識(shí):
一般定義在java類(lèi)內(nèi)部的類(lèi)成為內(nèi)部類(lèi)
內(nèi)部類(lèi)可以分為:定義在方法體外部的類(lèi)、定義方法內(nèi)部的類(lèi)、靜態(tài)內(nèi)部類(lèi)(只能定義在方法外部),匿名內(nèi)部類(lèi)
說(shuō)明:
定義在方法外面的類(lèi):
類(lèi)的成員變量(靜態(tài)、非靜態(tài))可以訪(fǎng)問(wèn),為了保證能夠正確的引用的類(lèi)的成員變量,所以必須先實(shí)例化外部類(lèi)的對(duì)象,才可以實(shí)例化內(nèi)部類(lèi)的對(duì)象
訪(fǎng)問(wèn)權(quán)限可以任何,可以把它看成類(lèi)的成員變量,這樣理解就好多來(lái)了。
定義在方法體內(nèi)的類(lèi);
類(lèi)的成員變量(靜態(tài)、非靜態(tài))可以訪(fǎng)問(wèn),為了保證能夠正確的引用的類(lèi)的成員變量,所以必須先實(shí)例化外部類(lèi)的對(duì)象,才可以實(shí)例化內(nèi)部類(lèi)的對(duì)象
訪(fǎng)問(wèn)權(quán)限不可以有,把他看成方法的局部變量就可以了。
靜態(tài)內(nèi)部類(lèi):
只能訪(fǎng)問(wèn)類(lèi)的靜態(tài)成員變量
訪(fǎng)問(wèn)權(quán)限任何
匿名內(nèi)部類(lèi):
類(lèi)的成員變量(靜態(tài)、非靜態(tài))可以訪(fǎng)問(wèn),為了保證能夠正確的引用的類(lèi)的成員變量,所以必須先實(shí)例化外部類(lèi)的對(duì)象,才可以實(shí)例化內(nèi)部類(lèi)的對(duì)象
訪(fǎng)問(wèn)權(quán)限不可以有
2、內(nèi)部類(lèi)的作用
內(nèi)部類(lèi)可以很好的隱藏類(lèi),一般類(lèi)不允許有private protect default訪(fǎng)問(wèn)權(quán)限。
內(nèi)部類(lèi)可以實(shí)現(xiàn)多重基礎(chǔ),彌補(bǔ)了java不能多繼承的特點(diǎn)
3、例子
- package com.ajun.test.innerclass.example;
- /**
- * 水果內(nèi)容
- * @author Administrator
- *
- */
- public interface Contents {
- String value();
- }
- package com.ajun.test.innerclass.example;
- /**
- * 水果目的地
- * @author Administrator
- *
- */
- public interface Destination {
- //目的地
- String readLabel();
- }
- package com.ajun.test.innerclass.example;
- public class Goods {
- private String des="is ruit!!";
- //方法外部
- private class Content implements Contents{
- private String name = "apple "+des;
- @Override
- public String value() {
- return name;
- }
- }
- //方法外部
- private class GDestination implements Destination{
- private String label ;
- private GDestination(String label){
- this.label= label;
- }
- @Override
- public String readLabel() {
- return label;
- }
- }
- //匿名內(nèi)部類(lèi)
- public Destination getdestination(final String label){
- return new Destination(){
- @Override
- public String readLabel() {
- return label;
- }
- };
- }
- public Destination dest(String s){
- return new GDestination(s);
- }
- public Contents content(){
- return new Content();
- }
- public Destination dest2(String s){
- class GDestination implements Destination{
- private String label;
- private GDestination(String label){
- this.label= label;
- }
- @Override
- public String readLabel() {
- return label;
- }
- }
- return new GDestination(s);
- }
- }
- package com.ajun.test.innerclass.example;
- public class Test {
- public static void main(String [] a){
- Goods gs = new Goods();
- Contents c = gs.content();
- Destination d = gs.dest("Beijing");
- System.out.println(c.value());
- System.out.println(d.readLabel());
- Destination d1 = gs.getdestination("Shanghai");
- System.out.println(d1.readLabel());
- System.out.println(gs.dest2("Tianjin").readLabel());
- }
- }
其中Content和Gdestination得到了很好的隱藏,外面調(diào)用的時(shí)候,根本就不知道調(diào)用的是具體哪個(gè)類(lèi),使這個(gè)類(lèi)擁有多繼承的特性。
輸出;
- apple is ruit!!
- Beijing
- Shanghai
- Tianjin
posted on 2012-10-27 08:53 你爸是李剛 閱讀(1261) 評(píng)論(0) 編輯 收藏