java个内部类的总结
内部类的概念
将类定义在类的内部,那么该类就成为内部类
注意: 内部类是一个相对的概念,如果A类中有一个B类,那么A类相对于B类来说就是外部类,那么B类相对于A类来说就是内部类
内部的分类
1.成员内部类
2.局部内部类
3.静态内部类
4.匿名内部类
内部类的特点:
1.内部类可以直接访问外部类的所有成员
2.外部类如果需要访问内部类成员,必须创建内部类对象
3.内部类如果编译后生成2个字节码文件,格式如下
外部类\(内部类.class
OuterClass\)InnerClass.class
4.要访问内部类的成员非常麻烦,而且造成程序耦合性增高,可读性降低,所以内部类要慎用
成员内部类
内部类可以拥有private访问权限、protected访问权限、public访问权限及包访问权限。
比如下面的例子,如果成员内部类OuterClass3用private修饰,则只能在外部类的内部访问。如果用public修饰,则任何地方都能访问;如果用protected修饰,则只能在同一个包下或者继承外部类的情况下访问;如果是默认访问权限,则只能在同一个包下访问。这一点和外部类有一点不一样。
外部类只能被public和包访问两种权限修饰。我个人是这么理解的,由于成员内部类看起来像是外部类的一个成员,所以可以像类的成员一样拥有多种权限修饰。
访问成员内部类格式:
外部类类名.内部类类名 对象名 = 外部类对象.内部类对象
当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问的是成员内部类的成员。如果要访问外部类的同名成员,需要以下面的形式进行访问:
- 外部类.this.成员变量
- 外部类.this.成员方法
案例
public class InnerClassDemo03 {
public static void main(String[] args) {
OuterClass3.InnerClass oi = new OuterClass3().new InnerClass();
oi.show();
oi.setNum2(100);
System.out.println(oi.getNum2());
}
}
class OuterClass3{
// 成员位置
private int num = 10;
class InnerClass{
private int num2 = 20;
public void show() {
System.out.println(num);
System.out.println(num2);
}
public void setNum2(int num2) {
this.num2 = num2;
}
public int getNum2() {
return this.num2;
}
}
}
局部内部类
局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。
- 注意,局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。
案例
class People{
public People() {
}
}
class Man{
public Man(){
}
public People getWoman(){
class Woman extends People{ //局部内部类
int age =0;
}
return new Woman();
}
}
静态内部类
成员内部类也可以使用static修饰
而且成员内部类还可以使用private的修饰
访问格式:
外部类类名.内部类类名 对象名 = new 外部类类名.内部类类名();
静态内部类主要成员是静态成员,可以方便调用,同时提高类的安全性
静态内部类可以有静态成员和非静态成员
案例
public class InnerClassDemo05 {
public static void main(String[] args) {
// OuterClass5.InnerClass oi = new OuterClass5.InnerClass();
// System.out.println(oi.num);
// oi.show();
// oi.show2();
System.out.println(OuterClass5.InnerClass.num2);
OuterClass5.InnerClass.show2();
}
}
class OuterClass5{
private int num = 5;
public static int num2 = 10;
public static class InnerClass{
public int num = 10;
public static int num2 = 20;
public void show() {
System.out.println("InnerClass.show()");
}
public static void show2() {
System.out.println("InnerClass.show2()");
}
}
public static void method() {
InnerClass innerClass = new InnerClass();
// System.out.println(num);
}
}
匿名内部类
概念:本质就是一个子类匿名对象
特点:
1.可能是一个子类、普通类、抽象类、接口
2.没有名字的子类
3.是一个对象
格式:
new 类或者父类/抽象类/接口(){
//重写方法;
}
- 匿名内部类的本质一个继承(父类)或者实现(接口)的子类匿名对象
案例
经典面试题
public class InnerClassDemo08 {
public static void main(String[] args) {
OuterClass8.Inner oi = new OuterClass8().new Inner();
oi.show();
}
}
class Fu{
public int num = 40;
public void show() {
int num = 50;
System.out.println(num);
}
}
class OuterClass8{
public int num = 10;
class Inner extends Fu{
public int num = 20;
public void show() {
int num = 30;
// 输出30
System.out.println(num);
// 输出20
System.out.println(this.num);
// 输出40
System.out.println(super.num);
// 输出50
super.show();
// 输出10
System.out.println(OuterClass8.this.num);
}
}
}
java个内部类的总结的更多相关文章
- Java学习--内部类(一)
Java学习--内部类(一) 一. 内部类的定义和特点 class Outer{ privite int num = 5; class Inner{ public void Display(){ Sy ...
- Java的内部类
Java的内部类 首先我们来了解一下什么是内部类? 内部类是指在一个外部类的内部再定义一个类.内部类可以是静态static的,也可用public,default,protected和private修饰 ...
- java使用内部类的好处及其初始化
java使用内部类的原因 每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响 java内部类初始化 ForeCatal ...
- JAVA基础——内部类详解
JAVA内部类详解 在我的另一篇java三大特性的封装中讲到java内部类的简单概要,这里将详细深入了解java内部类的使用和应用. 我们知道内部类可分为以下几种: 成员内部类 静态内部类 方法内部类 ...
- JAVA面向对象-----内部类的概述
JAVA面向对象-–内部类的概述s 将类定义在另一个类的内部则成为内部类.其实就是类定义的位置发生了变化. 在一个类中,定义在类中的叫成员变量,定义在函数中的叫成员函数,那么根据类定义的位置也可以分为 ...
- Java的内部类真的那么难以理解?
01 前言 昨天晚上,我把车停好以后就回家了.回家后才发现手机落在车里面了,但外面太冷,冷到骨头都能感受到寒意——实在是不想返回一趟去取了(小区的安保还不错,不用担心被砸车玻璃),于是打定主意过几个小 ...
- 第30节:Java基础-内部类
内部类 // 外部类 class Demo{ private int num = 3; // 定义内部类 class Int{ void show(){ System.out.println(&quo ...
- 【Java】 内部类
[Java]内部类 可以将一个类的定义放在另一个类的定义内部,这就是内部类. 使用内部类的的原因主要有三点: 内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据. 内部类可以对同一个包中的 ...
- java中内部类的积累
放在一个类的内部的类我们就叫内部类. 二. 作用 1.内部类可以很好的实现隐藏 一般的非内部类,是不允许有 private 与protected权限的,但内部类可以 2.内部类拥有外围类的所有元素的访 ...
- Java 基础 内部类
Java 基础 内部类 内部类(嵌套类) nested class 目的为外围类enclosing class提供服务. 四种: 静态成员类 static member class 非静态成员类 no ...
随机推荐
- I Think I Need a Houseboat POJ - 1005
I Think I Need a Houseboat POJ - 1005 解题思路:水题 #include <iostream> #include <cstdio> #inc ...
- linux学习:sed与awk与tr用法整理
流编辑器:sed 语法:sed [-hnV][-e<script>][-f<script文件>][文本文件] 参数: -e<script>或--expression ...
- ASPOSE.Word 开发资料整理
1.总体说明:操作主要涉及两个对象Document及DocumentBuilder Document主要用来获取文档中的节点,DocumentBuilder主要用于实现文档内容的写入 doc_Oper ...
- pycharm 的 激活流程
激活流程 一.通过Activation code 方式激活 注册码获取地址为:http://idea.lanyus.com/ 在idea或者pycharm的Activation code中输入 注册码 ...
- python摸爬滚打之day032 管道 数据共享 进程池
1.进程池 当有成千上万个任务需要被执行的时候,有了进程池我们就不必去创建大量的进程. 首先,创建进程需要消耗时间,销毁进程(空间,变量,文件信息等等的内容)也需要消耗时间, 第二即便开启了成千上万的 ...
- 前端混淆--JavaScript Obfuscator
引言: 前端代码是直接暴漏在浏览器中的,很多web攻击都是通过直接debug业务逻辑找到漏洞进行攻击,另外还有些喜欢“不劳而获”的分子暴力盗取他人网页简单修改后用来获利,总体上来说就是前端的逻辑太容易 ...
- 聚合函数对NULL统计
Table ID Amount Number 1 28.26 NULL 2 NULL NULL 3 NULL NULL SQL SELECT SUM(Amount),SUM(Number),COUNT ...
- python迭代-如何实现反向迭代
如何实现反向迭代 问题举例 实现一个连续浮点数发生器FloatRange,根据给定范围(start, end)和步进值(step) 产生一系列连续的浮点数,如FloatRange(3.0, 4.0, ...
- adobe air for ios 例子
越南soha 平台ios ane http://yun.baidu.com/s/1o65G9XS 里面有oc源码,as库,以及打包生成ane,测试ane 全过程
- c++简单程序设计 实验一
实验内容: 2-28 实现一个简单的菜单程序,运行时显示“Menu:A(dd) D(elete) S(ort) Q(uit),Selete one:”提示用户输入.A表示增加,D表示删除, S表示排序 ...