文档章节

Java之接口与内部类6.3.1--内部类

Watto
 Watto
发布于 2017/04/05 17:17
字数 704
阅读 2
收藏 0

package com.aowin.define;

//内部类使用的场合
//1.针对接口或抽象类这些不能直接new创建对象的数据类型,使用匿名内部类创建对象
//2.完成复杂的功能,设计辅助外部类的类,并不想把类的细节公布出去,可以使用内部类
//内部类的好处:可以共享外部类的数据,包括私有的
public class Outter {
    
    //静态成员变量
    private static double pi=3.14;
    
    //非静态的成员
    private String str = "hello";
    
    
    //非静态内部类
    //可以访问外部类的静态成员和非静态成员,包括private修饰的
    //创建非静态内部类对象依赖于外部类对象
    class Inner{        
        public void print(){
            System.out.println("非静态内部类中访问:");
            System.out.println("静态成员pi="+pi);
            System.out.println("非静态成员str="+str); 
        }        
    }
    
    //静态内部类:static修饰的内部类
    //可以访问外部类的静态成员,包括private修饰的,但不能访问外部类非静态的成员
    //创建静态内部类对象可以通过外部类类名
    static class Static_Inner{
        public void print(){
            System.out.println("静态内部类中访问:");
            System.out.println("静态成员pi="+pi);
            //System.out.println("非静态成员str="+str);  //不能访问外部类非静态的成员
        }
    }
    
    //局部内部类:定义在方法中的内部类
    //可以访问外部类中静态成员和非静态成员,包括private修饰的
    //可以访问局部常量(final修饰的),不能访问局部变量(jdk1.7)    
    public void test(){
        int i=10;            //局部变量
        final int I =100;    //局部常量
        
        class Local{            
            public void print(){
                System.out.println("局部内部类中访问:");
                System.out.println("静态成员pi="+pi);
                System.out.println("非静态成员str="+str); 
                //System.out.println("局部变量i="+i); //不能访问局部变量
                System.out.println("局部常量I="+I);     //可以访问局部常量,局部常量的生存周期比较长
            }            
        }
        
        //在方法中创建局部内部类对象
        Local lc = new Local();        
        lc.print();        
    }
    
    
    //匿名内部类
    //针对接口或抽象类这些不能直接new创建对象的数据类型,通过匿名内部类创建对象
    //匿名内部类创建对象只能使用一次
    //主要用于事件监听器的创建
    
    public void test2(){
        //Anonymous定义的是抽象类,不能直接new创建对象,通过匿名内部类创建对象
        Anonymous ano = new Anonymous(){

            @Override
            public void abs() {
                System.out.println("abs()");                 
            }
            
        };
        
        ano.abs();            
    }
    
    

}

 

package com.aowin.define;

public abstract class Anonymous {
    
    public abstract void abs();
    

}
 

package com.aowin.define;

import com.aowin.define.Outter.Inner;

public class Test {
    
    public static void main(String[] args) {
        //创建外部类对象
        Outter out = new Outter();
        //创建非静态内部类对象,依赖于外部类对象
        Inner in = out.new Inner(); 
        in.print();
        
        //创建静态内部类对象,通过外部类类名
        Outter.Static_Inner s_in = new Outter.Static_Inner();
        s_in.print();
        
        //运行局部内部类中的方法
        new Outter().test();
        
        //运行匿名内部类中的方法
        new Outter().test2();
    }

}
 

© 著作权归作者所有

Watto
粉丝 1
博文 71
码字总数 27737
作品 0
杭州
程序员
私信 提问
【目录导航】JAVA零基础进阶之路

【JAVA零基础入门系列】(已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 Day4 变量与常量 Day5 Java中的运算符 Day6 Java字符串 Day7 Java输入与输出...

MFrank
2018/06/21
0
0
new和反射产生java内部类的实例化详解

前两天看到一道口试题,是关于内部类的知识,觉得很有意思。 这道题是这样的: 根据注释填写(1),(2),(3)处的代码 public class Test{ ?????? public static void main(String[] args){ ??...

zaizai_loong
2013/09/02
3.5K
0
关于Java对象的继承和多态学习笔记

-------------------------关于对象的构造过程------------------------ 如果类B继承了类A,那么当创建类B的实例时,遵循如下过程: 1、如果类A有静态的成员变量,初...

mj4738
2012/01/15
169
1
Java成员内部类和静态内部类

Java成员内部类和静态内部类 使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。 在我们程...

秋风醉了
2014/07/11
65
0
Java static和匿名内部类

-- static Java中,任何变量 / 代码存储时,都是 在编译时 由系统自动分配内存; 在静态变量编译后,所分配的内存会一直存在,直到程序退出内存才会释放这个空间; 类加载时,JVM会把静态变量...

desaco
2018/10/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

cleanLastUpdated.bat

@echo offrem create by AnXiaole rem 这里写你的仓库路径set REPOSITORY_PATH=C:\Users\AnXiaole\.m2\repositoryrem 正在搜索...for /f "delims=" %%i in ('dir /b /s "%REPO......

安小乐
14分钟前
3
0
操作放大器的用法是什么?

  有区别   1、单级放大的倍数比较有限,一般在100倍以下。放大倍数很大的话,负反馈就比较浅,对于放大倍数的稳定性不利。假如需要放大倍数更高,就不得不动用多级放大电路了。单级放大...

仙溪
16分钟前
2
0
c++ 上传文件 curl

bool uploadFile(std::string url, std::string file, std::string auth) { boost::filesystem::path p(file); CURL *curl; CURLcode res; struct curl_httppost *for......

青黑
22分钟前
2
0
冒泡与插入排序的代码实现

// 冒泡排序,a 表示数组,n 表示数组大小public void bubbleSort(int[] a, int n) { if (n <= 1) return; for (int i = 0; i < n; ++i) { // 提前退出冒泡循环的标志位 ...

无名氏的程序员
25分钟前
3
0
centos7.6 +mhvtl1.6安装

以前的mhvtl都是在centos6.x,5.x上安装的mhvtl以前版本为1.4,现在最新的1.6出来,可以安装在centos7.6上,下面是安装过程: 1.安装基础包 centos7.6只要能上外网,默认是配置了yun源的,这些...

突突突酱
27分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部