Java修炼——内部类详解
内部类详解
定义:将一个类定义在另一个类的内部,该类就称为内部类
类中定义的内部类特点:
- 内部类作为外部类的成员,可以直接访问外部类的成员
(包括 private 成员),反之则不行。 - 内部类做为外部类成员,可声明为 private、默认、 protected或 public。
- 内部类成员只有在内部类的范围之内是有效的。
- 用内部类定义在外部类中不可访问的属性。这样就在外部
类中实现了比外部类的 private 还要小的访问权限。
内部类的优缺点:
优点:内部类可以直接访问外部类的私有属性
缺点:破坏了类的结构
内部类的分类:
1) 成员内部类:内部类相当于外部类的成员
Face类:
package com.bjsxt.inner;
public class Face {
private String shapeString="瓜子脸";
public class Noise{
public String shapeString="高鼻梁";
public void breath(){
System.out.println("鼻子长在"+shapeString+"的脸上");
System.out.println("********当外部类和内部类有相同的属性时,调用外部类需要加上 外部类类名.this. ********");
System.out.println("鼻子长在"+Face.this.shapeString+"的脸上");
System.out.println("用鼻子在呼吸");
}
}
}
测试类:
package com.bjsxt.inner;
import com.bjsxt.inner.Face.Noise;//需要导包
public class TestFace {
public static void main(String[] args) {
//创建外部类脸的对象
Face face=new Face();
//创建内部类鼻子的对象(需要导包)
Noise noise=face.new Noise();
//调用鼻子的方法
noise.breath();
}
}

2) 静态内部类
Outer类:
package com.bjsxt.innerStatic;
public class Outer {
private static String name="张三";
/*静态内部类 1.不允许访问外部类的非static属性。2.如果内部类的方法时static,那么内部类也不必须是static修饰*/
static class Inner{
public void show(){
System.out.println(name);
}
}
static class Inner2{
public static void show(){
}
}
}
测试类:
package com.bjsxt.innerStatic;
import com.bjsxt.innerStatic.Outer.Inner;
public class TestStaticInner {
public static void main(String[] args) {
//创建内部类的对象(由于是静态的,所以需要 类名. 去调用)
Outer.Inner inner=new Inner();
inner.show();
//访问的是静态内部类的静态方法。
Outer.Inner2.show();
}
}

3) 方法中的内部类:只能在方法中使用,相当于方法中的局部变量
package com.bjsxt.innermethod;
public class Outer {
public void show(){
int a=10;
class Inner{
public void fun(){
System.out.println("a="+a);
}
}
//创建内部类对象
new Inner().fun();
}
}
JDK1.8 新特性:
a) JDK1.8 之前方法中的内部类要访问外部类的局部变
量,必须加上 final 关键字 (常量)
b) JDK1.8 开始,在访问外部类的局部变量时,则可以不
加 final 关键字
匿名内部类 ( 存在继承或实现关系)
a) 可以实现一个接口,或者继承一个父类
b) 只能实现一个接口
c) 适合创建那种只需要一次使用的类,不能重复使用。
比较常见的是在图形界面编程 GUI 里用得到。
package com.bjsxt.anonymous;
public abstract class Father {
public abstract void dream();
}
class Son extends Father{
@Override
public void dream() {
System.out.println("当兵光荣");
}
}
class Test{
public static void main(String[] args) {
//父类引用指向子类对象
Father son=new Son();
son.dream();
//匿名内部类
Father father=new Father()
{
@Override
public void dream() {
System.out.println("帮助父亲完成他的梦想");
}
};
father.dream();
}
}

Java修炼——内部类详解的更多相关文章
- JAVA基础——内部类详解
JAVA内部类详解 在我的另一篇java三大特性的封装中讲到java内部类的简单概要,这里将详细深入了解java内部类的使用和应用. 我们知道内部类可分为以下几种: 成员内部类 静态内部类 方法内部类 ...
- Java中内部类详解—匿名内部类
什么是内部类? 将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类. 成员内部类 定义在类中方法外的类. 定义格式: class 外部类 { class 内部类{ } } ...
- java基础 内部类详解
什么是内部类? 1.内部类也是一个类: 2.内部类位于其他类声明内部. 内部类的常见类型 1.成员内部类 2.局部内部类 3.匿名内部类 4.静态内部类 简单示例 /** * 外部类 * */ pub ...
- Java修炼——接口详解_接口的特征_使用接口的意义
接口中可以包含的内容: 抽象法和非抽象方法(jdk1.8,必须使用default的关键字),属性(public static final)常量. 接口和类的关系 1.(继承了接口)类必须去实现接口中的 ...
- Java内部类详解
Java内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就 ...
- [转] Java内部类详解
作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本博客中未标明转载的文章归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置 ...
- 【转】Java内部类详解
一.内部类基础 在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类.广泛意义上的内部类一般来说包括这四种:成员内部类.局部内部类.匿名内部类和静态内部类.下面就先来了解一 ...
- Java内部类详解(一)
(转自:http://blog.csdn.net/wangpeng047/article/details/12344593) 很多人对于Java内部类(Inner Class)都十分陌生,甚至听都没听 ...
- “全栈2019”Java第九十六章:抽象局部内部类详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
随机推荐
- VSCode JAVA环境配置使遇到的几个小问题
1.出现的问题: The JAVA_HOME environment variable points to a missing or inaccessible folder等三个报错! 2.说明及解决 ...
- nsq (三) 消息传输的可靠性和持久化[二]diskqueue
上一篇主要说了一下nsq是如何保证消息被消费端成功消费,大概提了一下消息的持久化,--mem-queue-size 设置为 0,所有的消息将会存储到磁盘. 总有人说nsq的持久化问题,消除疑虑的方法就 ...
- [视频演示].NET Core开发的iNeuOS物联网平台,实现从设备&PLC、云平台、移动APP数据链路闭环
目 录 1. 概述... 1 2. 登陆信息... 2 3. 设备驱动... 3 4. 组态建模... 3 5. 手机APP. 5 6. ...
- 【idea】高德地图可以关爱一下高个汽车
现状:1.交通事故时不时能看到大卡车,双层巴士在城市里限高区域时的车祸 原因分析:1.司机对路况不熟,驶入新的限高路,造成事故2.司机对车况不熟,临时换的车驾驶,忘记车高的变化3.司机路况车况都熟,道 ...
- SqlServer2005 查询 第一讲 计算列
数据库查询[最重要且在数据库中难度最大] 声明一下我这里用的数据库样例是郝斌老师的(scott库) 我尽最大努力把复杂的问题简单化,方便理解,希望我写的东西能够帮助到你们 有些复杂的东西我我用自己的方 ...
- sparkContext初始化机制
sparkContext初始化机制 要点: 1.TaskSchedular如何注册,application.Excutor 如何反向注册 TaskScheduleImpl 即 TaskSchedula ...
- opencv MatchTemplate()模板匹配寻找最匹配部分
通常,随着从简单的测量(平方差)到更复杂的测量(相关系数),可以获得越来越准确的匹配,然而,这同时也会以越来越大的计算量为代价.比较科学的方法是对所有这些方法多次测试实验,以便为自己的应用选择同时兼顾 ...
- 最新版 IDEA 2019.2.4 下载安装 & 破解使用期限至2089年
一.准备 官网下载链接:https://www.jetbrains.com/idea/download/#section=windows 根据自己系统选择对应版本,这里选择Windows的UItima ...
- 在阿里云服务器中配置JDK、tomcat、mysql
阿里云服务器搭建配置 linux命令:参考:https://www.cnblogs.com/itdansan/p/8545187.html cat 文件名: 查看文件内容 ctrl+D : 退出查看 ...
- 【集训Day1 测试】装饰
装饰(decorate) [题目描述] 一个图有 N 个结点,编号 1 至 N,有 M 条无向边,第 i 条边连接的两个结点是 Ai 和Bi,其中 Ai 和 Bi 是不同的结点.可能有多条边连接的是同 ...