Java内部类的定义和使用

为什么要用到内部类:

在java开发学习中我们经常会碰到内部类。内部类又有很多的优势:首先举一个简单的例子,如果你想实现一个接口,但是这个接口中的一个方法和你构想的这个类中的一个方法名称参数相同,你应该怎么办?这时候,你可以建一个内部类实现这个接口。由于内部类对外部类的所有内容都是可访问的,所以这样做可以完成所有你直接实现这个接口的功能。不过你可能要质疑,更改一下方法的不就行了吗?的确,以此作为设计内部类的理由,实在没有说服力。真正的原因是这样的,java中的内部类和接口加在一起,从而java 通过内部类加上接口,可以很好的实现多继承的效果。

 

内部类的分类和使用

1、成员内部类: 即作为外部类的一个成员存在,与外部类的属性、方法并列。注意:成员内部类中不能定义静态变量,但可以访问外部类的所有成员。值得注意的是成员内部类编译成功后会生成的两个不同的类(.class)
成员内部类的优点
1)、内部类作为外部类的成员,可以访问外部类的私有成员或属性。(即使将外部类声明为PRIVATE,但是对于处于其内部的内部类还是可见的。)
2)、用内部类定义在外部类中不可访问的属性。这样就在外部类中实现了比外部类的private还要小的访问权限。
package one;public class Outer{private static int outer_i = 1;private int k=20;public static void outer1(){//...
    }//成员内部类class Inner{int j=100;//内部类中外部类的实例变量可以共存int inner_i=1;void inner1(){System.out.println(outer_i);//外部类的变量如果和内部类的变量没有同名的,则可以直接用变量名访问外部类的变量System.out.println(j);//在内部类中访问内部类自己的变量直接用变量名System.out.println(this.j);//也可以在内部类中用"this.变量名"来访问内部类变量//访问外部类中与内部类同名的实例变量可用"外部类名.this.变量名"。System.out.println(k);//外部类的变量如果和内部类的变量没有同名的,则可以直接用变量名访问外部类的变量
           outer1();}}//外部类的非静态方法访问成员内部类public void outer2(){Inner inner = new Inner();inner.inner1();}//外部类的静态方法访问成员内部类,与在外部类外部访问成员内部类一样public static void outer3(){Outer out = new Outer();//step1 建立外部类对象Inner inner=out.new Inner();//step2 根据外部类对象建立内部类对象inner.inner1();//step3 访问内部类的方法
    }public static void main(String[] args){outer3();}
}

 

2、局部内部类: 即在方法中定义的内部类,与局部变量类似,在局部内部类前不加修饰符public或private,其范围为定义它的代码块。

 

public class Outer {public void say(){System.out.println("关门说真话!");}
}
public class Test {public void ting(){class MiMi extends Outer{//定义一个局部的内部类,继承Outer方法//……
        }new MiMi().say();//调用局部内部类中继承的say方法
        System.out.println("别人都不知道");}public static void main(String[] args) {new Test().ting();}
}

 

3、静态内部类: 静态内部类定义在类中,任何方法外,用static定义。注意:静态内部类中可以定义静态或者非静态的成员

package three;public class StaticTest {  private static String name="abc";private String sex="男";static class Person{private String age = "18";//内部私有成员public String heigth = "180";//内部类公有成员public void display(){//System.out.println(sex);//报错,不能直接访问外部类的非静态成员System.out.println(name);//只能直接访问外部类的静态成员System.out.println(age);//访问本内部类成员。
        }  }public void testone(){Person person = new Person();person.display();//System.out.println(heigth);//报错,是因为不可以直接访问内部类私有成员//System.out.println(age);//报错,是因为不可以直接访问内部类公有成员System.out.println(person.age);//可以访问内部类的私有成员System.out.println(person.heigth);//可以访问内部类的公有成员
    } public void testtwo(){StaticTest st = new StaticTest();System.out.println(name);System.out.println(sex);//System.out.println(age);//不可以直接访问内部类的成员//System.out.println(heigth);//不可以直接访问内部类的成员
    }public static void main(String[] args) { //调用StaticTestStaticTest staticTest = new StaticTest();  staticTest.testone(); staticTest.testtwo();}  
}  
4、匿名内部类: 匿名内部类是在抽象类和接口的基础之上发展起来的。匿名内部类如果继承自接口,必须实现指定接口的方法,且无参数 。匿名内部类如果继承自类,参数必须按父类的构造函数的参数传递
匿名内部类的特点:
1),一个类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的事先或是覆盖。
2),只是为了获得一个对象实例,不需要知道其实际类型。
3),类名没有意义,也就是不需要使用到。
package three;abstract class parent {public abstract void like();
}public class Demo {public static void main(String[] args) {parent pt = new parent(){public void like(){System.out.println("吃饭睡觉打豆豆。。。");}};pt.like();}
}

 

匿名类与内部的联系与区别:

 
按所在位置可以分为两大类:
1、在类的方法中
特点:
a、可以访问宿主类的所有元素 ;
b、保存宿主类对象的引用,创建对象时必须有宿主类对象;
c、 不能有静态数据;
继续划分:
A、本地内部类;
B、匿名内部类
两者的区别在于本地内部类有构造方法,而匿名内部类只能实例初始化;
2、在类或接口作用域中;
A、普通内部类
B、静态内部类

 

内部类总结:

1.内部类作为外部类的一个特殊的成员来看待,因此它有类成员的封闭等级:private ,protected,默认(friendly),public 它有类成员的修饰符:   static,final,abstract
2.非静态内部类nested inner class,内部类隐含有一个外部类的指针this,因此,它可以访问外部类的一切资源(当然包括private)外部类访问内部类的成员,先要取得内部类的对象,并且取决于内部类成员的封装等级。非静态内部类不能包含任何static成员.
3.静态内部类:static inner class,不再包含外部类的this指针,并且在外部类装载时初始化. 静态内部类只能访问外部类static成员. 外部类访问静态内部类的成员:static成员:类名.成员;非static成员:对象.成员
4.对于方法中的内部类或块中内部类只能访问块中或方法中的final变量。

转载于:https://www.cnblogs.com/xiao-chuan/p/6014752.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/394780.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蛋清打发奶油状

在做蛋糕、冰淇凌、面包之类的时候往往都需要奶油状蛋清,让蛋糕、面包更蓬松,冰激凌也可以使用其当做奶油来用。用料 鸡蛋4个 根据用量选择盐(只做冰激凌用奶油放)5g(根据蛋量)白醋(可以不放,根据喜好)5g(根据蛋量)白砂糖40g(分三次放)根据…

react构建_您应该了解的有关React的一切:开始构建所需的基础知识

react构建by Scott Domes由斯科特多姆斯(Scott Domes) 您应该了解的有关React的一切:开始构建所需的基础知识 (Everything You Should Know About React: The Basics You Need to Start Building) Are you curious about React and haven’t had the chance to lea…

荣新linux培训,51CTO博客-专业IT技术博客创作平台-技术成就梦想

切换用户 su - root文件夹管理 mkdir(新建文件夹) rmdir(删除空目录)文件管理 touch(新建文件) rm(删除文件)rm -rf(删除文件夹) cat(查询文件)文件文件夹 mv(剪切文件) cp(复制文件)默认拷贝文件,cp -r 就可以拷贝文件夹啦批量建文件 touch /root/tes…

Educational Codeforces Round 33 (Rated for Div. 2) E. Counting Arrays

题目链接 题意:给你两个数x,yx,yx,y,让你构造一些长为yyy的数列,让这个数列的累乘为xxx,输出方案数。 思路:考虑对xxx进行质因数分解,设某个质因子PiP_iPi​的的幂为kkk,则这个质因子的贡献就相当于把kkk个PiP_iPi​放到yyy个盒子…

《面向对象分析与设计》一第2章 什么是面向对象分析

第2章 什么是面向对象分析 面向对象分析(ObjectOriented Analysis,OOA),就是运用面向对象方法进行系统分析。它是软件生命周期的一个阶段,具有一般分析方法所共同具有的内容、目标及策略。但是OOA强调运用面向对象方…

hql可以使用distinct吗_输送食品可以使用白色PVC输送带吗?

食品,是给人们吃到肚子里的,因此不管在加工环节、制造环节还是其他环节,都需要做好食品的安全问题。根据不同的食品,其制造的环境也不同,所使用到的食品输送带的材质也是不一样的,这些是需要根据输送的食品…

htc one m7 linux驱动,HTC One M7官方RUU固件包(可救砖)

在网上找了找关于HTC One M7 (801e)的官方ruu固件包还不多,找了一些,不过有些不能下载,在这里整理了几款可以下载的官方ruu包,这些包都是官方原版的,都是支持线刷的,大家可以下载下来备用了,也可…

emoji .png_根据我对3.5GB聊天记录的分析,Emoji开发人员使用最多

emoji .pngby Evaristo Caraballo通过Evaristo Caraballo 根据我对3.5GB聊天记录的分析,Emoji开发人员使用最多 (The Emoji developers use most — based on my analysis of 3.5GB of chat logs) Emoji have drastically changed the way we communicate in socia…

forward和redirect的区别

1.从地址栏显示来说forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求…

CF662C Binary Table(FWT)

[Luogu-CF662C] FWT_xor 题目描述 有一个 \(n\) 行 \(m\) 列的表格,每个元素都是 $0/1 $,每次操作可以选择一行或一列,把 \(0/1\) 翻转,即把 \(0\) 换为 \(1\) ,把 \(1\) 换为 \(0\) 。请问经过若干次操作后&#xff0…

c语言fmin最小公倍数,matlab小函数

8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?(记得按字母序索引)矩阵向量化操作A(:)拉成一个向量 ($a_{11},a_{21},…$),注意先列后行repmat用途:创建由小型矩阵重复组合成的矩阵&#…

spring管理的类如何调用非spring管理的类

spring管理的类如何调用非spring管理的类. 就是使用一个spring提供的感知概念,在容器启动的时候,注入上下文即可. 下面是一个工具类. 1 import org.springframework.beans.BeansException;2 import org.springframework.context.ApplicationContext;3 import org.springframewo…

django构建网页_如何使用Django构建照片供稿

django构建网页by Ogundipe Samuel由Ogundipe Samuel 如何使用Django构建照片供稿 (How to build a photo feed using Django) Today, we will make a real-time photo feed framework using Django and Pusher. This is like a mini Instagram, but without the comments and…

报表系统的雄心

这周有朋自远方来,聊了对报表工具的看法,因此专门写篇文章来谈谈报表系统的未来。 笔者知道不可能有十全十美的报表系统,毕竟任何一个行业和企业受自身客观环境的限制,但表哥嘛,总要有点理想和追求,就好比到…

02----mockjs基本使用

一.mockjs基本使用 1.安装mockjs cnpm install mockjs --save-dev2.新建mockjs文件夹/index.js // 引入 Mock var Mock require(mockjs)// 定义数据类型 var data Mock.mock({// 20条数据"data|20": [{// 商品种类"goodsClass": "女装",// 商品…

vuefullcalendar怎么判断切换上下月_房间太多、楼上楼下,终极解决家里wifi信号无缝切换问题...

相信不少人有我一样的烦恼,房间太多,或者楼上楼下,家里的wifi信号总是不能无缝切换。路由器放在配电箱,除了客厅信号不错外,一旦到了其他房间,掉线、网速慢等问题让人很苦恼。特别是和小伙伴一起玩游戏一边…

C语言程序顺序结构1交换变量,如何将c语言中结构体内的所有类型变量的值输出来...

教了多年《C程序设计》课程,大多学生觉的这门课程难学。其实,按照我们现在的教学大纲和教学要求,只要同学们掌握一些方法,克服心理上畏难、不轻言放弃,是完全可以学好的。《C 程序设计》的内容很丰富,按照我…

尼古拉斯 android_圣尼古拉斯和Alexa的访问

尼古拉斯 android祝大家圣诞节快乐,并祝大家晚安! (Happy Christmas to all, and to all a good night!) Inspired by the holiday season, emerging voice-first technology, and too much eggnog — I’ve twisted the classic poem from Clement Clar…

github 进阶说明

目录 github 进阶说明前言三个目录树重置 git reset增加路径的reset检出 checkout带路径的checkout仓库数据对象其他资料github 进阶说明 前言 我们可以什么都不管,照搬命令来完成我们大部分git工作,但是如果想要进一步,就要深入理解git的实现…

手把手教你 Spark 性能调优

0、背景 集群部分 spark 任务执行很慢,且经常出错,参数改来改去怎么都无法优化其性能和解决频繁随机报错的问题。 看了下任务的历史运行情况,平均时间 3h 左右,而且极其不稳定,偶尔还会报错: 1、优化思路 任…