1、内部类访问特点:

-  内部类可以直接访问外部类的成员,包括私有。

-  外部类要访问内部类的成员,必须创建对象。

-  外部类名.内部类名 对象名 = 外部类对象.内部类对象;

-  例:

 class Demo {
public static void main(String[] args) {
//外部类名.内部类名 = 外部类对象.内部类对象
Outer.Inner oi = new Outer().new Inner(); //创建内部类对象
oi.method(); }
} class Outer {
private int num = 10;
class Inner {
public void method() {
System.out.println(num);
}
}
}

2、私有成员内部类

-  通过本类中提供一个公共的方法来访问私有成员内部类。

-  例:

 class Demo {
public static void main(String[] args) {
//Outer.Inner oi = new Outer().new Inner();
//oi.method(); //这种方法不可以访问,因为成员内部类已经私有了 Outer o = new Outer();
o.print();
}
} class Outer {
private int num = 10;
private class Inner {
public void method() {
System.out.println(num);
}
} //本类中提供一个公共的访问方式,通过本类中的方法访问私有成员内部类
public void print() {
Inner i = new Inner();
i.method();
}
}

3、静态成员内部类

-  例:

 class Demo {
public static void main(String[] args) {
//外部类名.内部类名 对象名 = 外部类名.内部类对象;
//其实这句话中new的位置是在Inner()前,new是修饰Inner()的:Outer.new Inner();
//但是一般将new提到最前面,否则编译会报错,所以就写成下面这样了
Outer.Inner oi = new Outer.Inner();
oi.method();
//内部类里面静态方法的访问特点:外部类.内部类.静态方法名();
Outer.Inner2.print();
}
} class Outer {
static class Inner {
public void method() {
System.out.println("method");
}
} static class Inner2 {
public static void print() {
System.out.println("print");
}
}
}

4、局部内部类访问局部变量

-  局部内部类访问局部变量,该局部变量必须用final修饰

-  局部内部类在访问他所在方法中的局部变量必须用final修饰,为什么?

  *  因为当调用这个方法时,局部变量如果没有用final修饰,他的生命周期和方法的生命周期是一样的,当方法弹栈,这个局部变量也会消失,那么如果局部内部类对象还没有马上消失想用这个局部变量,就没有了。如果用final修饰会在类加载的时候进入常量池,即使方法弹栈,常量池的常量还在,也可以继续使用。

  *  但是jdk 1.8取消了这个事情,所以我认为这是个bug。

-  例:

 class Demo {
public static void main(String[] args) {
Outer o = new Outer();
//o.run(); //错误,因为Inner在method方法中,属于局部成员。方法外无法访问
o.method();
}
} class Outer {
public void method() {
//int num = 10; //错误: 从内部类中访问本地变量num; 需要被声明为最终类型
final int num=10;
class Inner {
public void print() {
System.out.println(num);
}
} Inner i = new Inner();
i.print();
} /*public void run() {
Inner i = new Inner(); //局部内部类,只能在其所在的方法中访问
i.print();
}*/
}

5、面试题

-  例:

 class Test {
public static void main(String[] args) {
Outer.Inner oi = new Outer().new Inner();
oi.show();
}
}
//要求:使用已知的变量,在控制台输出30,20,10。
//内部类之所以能获取到外部类的成员,是因为他能获取到外部类的引用。外部类名.this
class Outer {
public int num = 10;
class Inner {
public int num = 20;
public void show() {
int num = 30;
System.out.println(num);
System.out.println(this.num);
//System.out.println(new Outer().num); //使用对象来访问成员变量
System.out.println(Outer.this.num);
}
}
}

6、个人总结:

-  普通内部类可通过在别的类中直接实例化访问,或者将该内部类的实例化写在该内部类所在的类中的一个方法里,外部通过调用该方法访问内部类。

-  私有成员内部类是将内部类的实例化放在了该内部类所在的类中的一个方法里,该方法提供了一个可供外部公共访问的方式,外部可通过该方法访问私有成员内部类。

-  静态成员内部类与普通内部类相似,可在别的类中直接(实例化)访问或在该内部类所在的类中写一个方法用来(实例化)访问该内部类。只不过静态成员内部类可通过类名调用来访问。

-  局部内部类是将该内部类的实例化直接写在了该内部类所在的方法体中,因为它相当于一个局部变量,在方法体外是访问不到的。

java-内部类访问特点-私有成员内部类-静态成员内部类-局部内部类访问局部变量的更多相关文章

  1. Java 内部类(成员内部类、局部内部类、静态内部类,匿名内部类)

    一.什么是内部类? 内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的一个成员,并且依附于外部类而存在的.内部类可为静态,可用protected和private修饰(而外部类只能使用publ ...

  2. Java中的内部类(成员内部类、静态内部类、局部内部类、匿名内部类)

    Java中的内部类(成员内部类.静态内部类.局部内部类.匿名内部类) 神话丿小王子的博客主页 我们先看这样一段话:人是由大脑.肢体.器官等身体结果组成.而组成我们人体的心脏它也有自己的属性和行为(血液 ...

  3. Java内部类小程序(成员内部类,静态内部类,匿名内部类)

    /** * 测试java内部类(成员内部类,静态内部类,匿名内部类) * 局部内部类不常用,就不写了. * @package :java05 * @author shaobn * @Describe ...

  4. java基础15 内部类(成员内部类、局部内部类)和匿名内部类

    一.内部类 1.1.1.成员内部类 一个类定义在另一个类的内部,那么该类就叫作成员内部类 1.1.2.成员内部类访问方式 方式一:在外部类中提供一个方法创建内部类的对象进行访问       方式二:在 ...

  5. 牛客网Java刷题知识点之什么是内部类、为什么要使用内部类、内部类如何使用外部类的属性和方法、成员内部类、局部内部类、静态内部类、匿名内部类

    不多说,直接上干货! 可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 内部类 ...

  6. Java学习笔记23---内部类之局部内部类只能访问final的局部变量

    局部内部类是定义在方法体或代码块中的类,在笔记19中已有过简单介绍. 今天要讨论的是局部内部类为什么只能访问为常量的局部变量. 作者: 博客园--蝉蝉 请尊重作者劳动成果,转载请在标题注明“转载”字样 ...

  7. Java内部类——局部内部类

    局部内部类,即放在“{块中}”,局部内部类,不能被成员修饰符static修饰,且内部类的成员也不能是static. 内部类中访问局部变量“{块中}”,需要将局部变量声明为final. 可以直接访问外部 ...

  8. C#的匿名委托 和 Java的匿名局部内部类

    .NET:C#的匿名委托 和 Java的匿名局部内部类 目录 背景实验备注 背景返回目录 这几天重温Java,发现Java在嵌套类型这里提供的特性比较多,结合自身对C#中匿名委托的理解,我大胆的做了一 ...

  9. .NET:C#的匿名委托 和 Java的匿名局部内部类

    背景 这几天重温Java,发现Java在嵌套类型这里提供的特性比较多,结合自身对C#中匿名委托的理解,我大胆的做了一个假设:Java的字节码只支持静态嵌套类,内部类.局部内部类和匿名局部内部类都是编译 ...

随机推荐

  1. vue cli搭建的vue项目 不小心开了eslint 一直报黄色的警告

    报错必须处理,警告也忍不了,发现在bulid -webpack.base.config.js 里找到 const createLintingRule = () => ({ /*test: /\. ...

  2. ASCII编码、Unicode编码、UTF-8

    一.区别 ASCII.Unicode 是“字符集” UTF-8 .UTF-16.UTF-32  是“编码规则” 其中: 字符集:为每一个「字符」分配一个唯一的 ID(学名为码位 / 码点 / Code ...

  3. 蓝桥杯—BASIC-21 sine之舞(递归递推)

    题目:最近FJ为他的奶牛们开设了数学分析课,FJ知道若要学好这门课,必须有一个好的三角函数,所以他准备和奶牛们做一个“Sine之舞”的游戏,寓教于乐,提高奶牛们的计算能力. 不妨设 An=sin(1– ...

  4. Ubuntu下如何访问Windows磁盘?

    有些同学的电脑原来是Windows系统的,但为了需要,又下载了一个Ubuntu系统,变成双系统的电脑. 但是,在Ubuntu下,Windows的磁盘是打不开的,用网盘或者U盘又是很不方便,所以ljn教 ...

  5. Unity中物体碰撞后去掉相互之间的反弹力

    最近自制了一个的角色控制器(没有重力的角色)时发现,角色碰撞到墙壁之后会有一个小小的反弹力导致角色有一个微弱的反弹位移,这样给人一种不好的感觉.研究了一下,除了限制坐标轴( Rigidbody---C ...

  6. unity中键盘WASD控制。(WS控制物体前后移动,AD控制左右旋转。)

    private float rotateSpeed = 30f; private float movespeed = 5; void FixedUpdate() { //第一种控制移动 float h ...

  7. Grafana配置SingleStat图表信息(三)

    Grafana是一个用于展示数据的工具,配置数据源,直接连接数据库.(这里的数据库应该是结果库,直接需要给用户看的结果数据信息) SingleStat : 想用来展示单一数据信息的图表,效果图如图 ( ...

  8. C++ Templates STL标准模板库的基本概念

    STL标准库包括几个重要的组件:容器.迭代器和算法.迭代器iterator,用来在一个对象群集的元素上进行遍历操作.这个对象群集或许是一个容器,或许是容器的一部分.迭代器的主要好处是,为所有的容器提供 ...

  9. C数据结构 : 线性表 与 链表

    一.线性表 一般表现为数组,使用一组地址连续的存储单元依次存储数据元素,如图: 它具有如下特点: 长度固定,必须在分配内存之前确定数组的长度. 存储空间连续,即允许元素的随机访问. 存储密度大,内存中 ...

  10. eclipse配置和使用memory Analyse分析内存

    1. 安装 在Eclipse help -> Eclipse Marketplace下搜索Memory:  图 1-1 搜索MAT插件 按照步骤安装完成重启即可. 2. 测试代码准备 测试代码 ...