内部类的概述

/*内部类概述: 把类定义在其他类的内部,这个类就被称为内部类。举例:在类A中定义了一个类B,类B就是内部类。内部的访问特点:A:内部类可以直接访问外部类的成员,包括私有。B:外部类要访问内部类的成员,必须创建对象。*/
class Outer {private int num = 10;class Inner {public void show() {//内部类可以直接访问外部类的成员,包括私有。
            System.out.println(num);}}public void method() {//找不到符号//show();//外部类要访问内部类的成员,必须创建对象。Inner i = new Inner();i.show();}}class InnerClassDemo {public static void main(String[] args) {}
}

内部类位置

/*内部类位置成员位置:在成员位置定义的类,被称为成员内部类。    局部位置:在局部位置定义的类,被称为局部内部类。成员位置:在成员位置定义的类,被称为成员内部类。    */
class Outer {private int num = 10;//成员位置/*class Inner {}*/public void method() {//局部位置class Inner {}}
}class InnerClassDemo2 {public static void main(String[] args) {}
}

如何直接访问成员内部类的成员

/*成员内部类:如何直接访问内部类的成员。外部类名.内部类名 对象名 = 外部类对象.内部类对象;
*/
class Outer {private int num = 10;class Inner {public void show() {System.out.println(num);}}
}class InnerClassDemo3 {public static void main(String[] args) {//需求:我要访问Inner类的show()方法//格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象;Outer.Inner oi = new Outer().new Inner();oi.show();}
}

成员内部类的修饰符:

/*成员内部类的修饰符:private 为了保证数据的安全性static 为了方便访问数据注意:静态内部类访问的外部类数据必须用静态修饰。案例:我有一个人(人有身体,身体内有心脏。)class Body { private class Heart {public void operator() {System.out.println("心脏搭桥");}}public void method() {if(如果你是外科医生) {Heart h = new Heart();h.operator();}}}按照我们刚才的讲解,来使用一下Body.Heart bh = new Body().new Heart();bh.operator();//加了private后,就不能被访问了,那么,怎么玩呢?Body b =  new Body();b.method();
*/
class Outer {private int num = 10;private static int num2 = 100;//内部类用静态修饰是因为内部类可以看出是外部类的成员public static class Inner {public void show() {//System.out.println(num);
            System.out.println(num2);}public static void show2() {//System.out.println(num);//报错。静态内部类访问的外部类数据必须用静态修饰。
            System.out.println(num2);}        }
}class InnerClassDemo4 {public static void main(String[] args) {//使用内部类// 限定的新静态类//Outer.Inner oi = new Outer().new Inner();//这个访问方式错误//oi.show();//oi.show2();//成员内部类被静态修饰后的访问方式是://格式:外部类名.内部类名 对象名 = new 外部类名.内部类名();Outer.Inner oi = new Outer.Inner();oi.show();oi.show2();//show2()的另一种调用方式。因为静态方法,可以通过类名调用。
        Outer.Inner.show2();}
}

内部类和外部类没有继承关系。
通过外部类名限定this对象

/*案例:要求请填空分别输出30,20,10。注意:1:内部类和外部类没有继承关系。 2:通过外部类名限定this对象Outer.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);}}
}
class InnerClassTest {public static void main(String[] args) {Outer.Inner oi = new Outer().new Inner();oi.show();}
}

局部位置的内部类访问局部变量问题

/*局部内部类A:可以直接访问外部类的成员  B:在局部位置,可以创建内部类对象,通过对象调用内部类方法,来使用局部内部类功能 注意事项:局部内部类访问局部变量的注意事项? A:局部内部类访问局部变量必须用final修饰B:为什么呢?局部变量是随着方法的调用而调用,随着调用完毕而消失。而堆内存Inner的内容并不会立即消失。所以,我们加final修饰。加入final修饰后,这个变量就成了常量。既然是常量。你消失了。我在内存中存储的是数据20,所以,我还是有数据在使用。
*/
class Outer {private int num  = 10;public void method() {//int num2 = 20;final int num2 = 20; //局部内部类访问局部变量必须用final修饰class Inner {public void show() {System.out.println(num);//从内部类中访问本地变量num2; 需要被声明为最终类型System.out.println(num2);//20
            }}//System.out.println(num2);
        Inner i = new Inner();i.show();}
}class InnerClassDemo5 {public static void main(String[] args) {Outer o = new Outer();o.method();}
}

匿名内部类格式,方法调用

/*匿名内部类就是内部类的简化写法。前提:存在一个类或者接口这里的类可以是具体类也可以是抽象类。格式:new 类名或者接口名(){重写方法;}本质是什么呢?是一个继承了该类或者实现了该接口的子类的匿名对象。
*/
interface Inter {public abstract void show();public abstract void show2();
}class Outer {public void method() {Inter i = new Inter() { //多态public void show() {System.out.println("show");}public void show2() {System.out.println("show2");}};i.show();//是一个继承了该类或者实现了该接口的子类的匿名对象。所以可以调用方法
        i.show2();}
}class InnerClassDemo6 {public static void main(String[] args) {Outer o = new Outer();o.method();}
}

匿名内部类在开发中的使用

/*匿名内部类在开发中的使用
*/
interface Person {public abstract void study();
}class PersonDemo {//接口名作为形式参数//其实这里需要的不是接口,而是该接口的实现类的对象public void method(Person p) {p.study();}
}//实现类
class Student implements Person {public void study() {System.out.println("好好学习,天天向上");}
}class InnerClassTest2 {public static void main(String[] args) {//测试PersonDemo pd = new PersonDemo();Person p = new Student();pd.method(p);System.out.println("--------------------");//匿名内部类在开发中的使用//匿名内部类的本质是继承类或者实现了接口的子类匿名对象//用完一次就消失Person ss = new Person(){public void study() {System.out.println("好好学习,天天向上");}};pd.method(ss);// pd.method(new Person(){// public void study() {// System.out.println("好好学习,天天向上");// }// });
    }
}

案例

/*案例:按照要求,补齐代码interface Inter { void show(); }class Outer { //补齐代码 }class OuterDemo {public static void main(String[] args) {Outer.method().show();}}要求在控制台输出”HelloWorld”
*/
interface Inter { void show(); //记得默认有 public abstract
}class Outer { //补齐代码public static Inter method() {//子类对象 -- 子类匿名对象return new Inter() {public void show() {System.out.println("HelloWorld");}};}
}class OuterDemo {public static void main(String[] args) {Outer.method().show();/*1:Outer.method()可以看出method()应该是Outer中的一个静态方法。2:Outer.method().show()可以看出method()方法的返回值是一个对象。又由于接口Inter中有一个show()方法,所以我认为method()方法的返回值类型是一个接口。*/}
}

转载于:https://www.cnblogs.com/baiyangyuanzi/p/6831624.html

10-05 Java 内部类概述和讲解相关推荐

  1. 第三次学JAVA再学不好就吃翔(part42)--内部类概述

    学习笔记,仅供参考 文章目录 面向对象 内部类 内部类概述和访问特点 成员内部类私有使用 静态成员内部内 面向对象 内部类 内部类概述和访问特点 内部类概述 在类中定义类,就叫做内部类 内部类访问特点 ...

  2. Java语言概述之标识符05

    Java语言概述之标识符 定义:凡是自己可以命名的地方都叫标识符 可以自己命名的结构: 包名,类名,接口名,变量名,方法名,常量名 命名的规则 由26个英文字母大小写,0~9,_或者$组成 数字不可以 ...

  3. 3.1_2 JavaSE入门 P1 【Java基础】Java语言概述、JDK编译

    相关链接 Excel目录 目录 Part1 Java语言概述 1 Java语言概述 1.1 Java发展史 1.2 java应用平台 1.3 跨平台原理 1.4 JVM JRE JDK 1.5 Ora ...

  4. 1,Java语言基础-Java语言概述和必要计算机知识

    Java语言基础 Java语言概述 1,Java语言发展史 Java语言本质 Java是面向对象的高级语言,它是由c和c++发展而来. Java发展语言历史概述 Java 是由 James Gosli ...

  5. java内部格式_详解java内部类的访问格式和规则

    详解java内部类的访问格式和规则 1.内部类的定义 定义一个类来描述事物,但是这个事物其中可能还有事物,这时候在类中再定义类来描述. 2.内部类访问规则 ①内部类可以直接访问外部类中的成员,包括私有 ...

  6. 10年java架构师教你如何快速打好Java基础?

    从大学到现在,我使用Java已经将近10年,日常也带实习生,还在公司内部做training,所以可以分享下我的经验,希望对你有用. 因为是在工作中培训,就必然有两个约束:实用.时间紧,因此就不能像大学 ...

  7. Java变量概述与使用

    Java变量概述与使用 概述 数据类型 什么是数据类型? 数据类型的分类 基本数据类型 整型 浮点型 字符型 布尔类型 数值基本数据类型的取值范围(重要) Java数值类型的取值范围 引用数据类型 标 ...

  8. Java核心技术(Java白皮书)卷Ⅰ 第一章 Java程序设计概述

    第1章 Java程序设计概述 1.1 Java程序设计平台  具有令人赏心悦目的语法和易于理解的语言,与其他许多优秀语言一样,Java满足这些要求.  可移植性  垃圾收集  提供大型的库   如果想 ...

  9. Java基础(一)Java语言概述及入门

    1 Java语言概述 1.1Java概述 是SUN(Stanford University Network,斯坦福大学网络公司 ) 1995年推出的一门高级编程语言. 是一种面向Internet的编程 ...

最新文章

  1. 北京实习总结——记住牛人那些话
  2. 物联网帝国——孙正义职业生涯最大的豪赌
  3. Java网络编程笔记5
  4. OpenCV之core 模块. 核心功能(1)Mat - 基本图像容器 OpenCV如何扫描图像、利用查找表和计时 矩阵的掩码操作 使用OpenCV对两幅图像求和(求混合(blending))
  5. SpringBoot集成OpenOffice实现doc文档转html
  6. 大话设计模式—命令模式
  7. 我的SAP Hybris学习笔记
  8. .NET 6 数组拷贝性能对比
  9. STemwin替换为MDK下的emwin
  10. 《实现模式(修订版)》—第2章模式
  11. conda An unexpected error has occurred
  12. 《圈圈教你玩USB》 第三章 USB鼠标的实现——看书笔记(1)
  13. Python:命令安装pyQt5相关插件
  14. Android权限设置引导
  15. android sd8217车载,【BVB-8217SD XYZ三轴振动记录仪三通道数字振动测试仪路昌LUTRON】价格_厂家 - 中国供应商...
  16. 【Love2d从青铜到王者】第四篇:Love2d之LÖVE与移动矩形
  17. 130 个相见恨晚的超实用网站,一次性分享出来。
  18. 个人云存储的两大强者比拼 百度云VS苹果iCloud
  19. 你想知道的NB-IoT知识都在这里了!
  20. python安装jupyterlab_Jupyter/JupyterLab安装使用

热门文章

  1. vscode中如何拉取git代码_工具 | 手把手教你在VSCode中使用Git
  2. pytorch 对抗样本_【天池大赛】通用目标检测的对抗攻击方法一览
  3. java c 事件对比_javacsript绑定事件的三种方式与各自特点
  4. mysql.sys用户权限_MySQL用户及权限小结
  5. 小米一元流量magisk_电信流量10G才9.9元?
  6. python的全局变量 local variable ‘xxx‘ referenced before assignment
  7. htc+one+m7+linux驱动,HTC One M7简易刷Recovery教程
  8. 20191004:包装类Integer,int,String类的相互转换
  9. 合并排序 非递归 java_合并排序-非递归
  10. 银河水滴张曼:远距离步态识别系统与应用 |量子位沙龙回顾