高级类特性-(类的成员之一:内部类)

内的成员之一:内部类(属性、方法、构造器、代码块) 可以有四种权限访问修饰符

注意:外部类 只有两种 public 和 default

定义 : 可以将一个类的定义放在另一个类定义的内部,这就是内部类 -thinking in Java

用法:如果一个类 仅跟本类关系密切的话 对于其他类希望隐藏 就可以使用内部类 例ArrayList中的 Itr

1. 成员内部类

成员内部类也是最普通的内部类,它是外围类的一个成员。

在成员内部类中要注意两点,第一:成员内部类中不能存在任何static的变量和方法;第二:成员内部类是依附于外围类的,所以只有先创建了外围类才能够创建内部类。

public class TestInnerClass {
public static void main(String[] args) {
//创建非静态内部类的对象
Person p = new Person();
Person.Computer pc = p.new Computer();
pc.setName("IBM");
//System.out.println(pc.getName());
}
}
class Person {
private String name = "张三";
private int age; public Person() {
super();
} public Person(String name, int age) {
super();
this.name = name;
this.age = age;
} public class Computer{
private String name = "lenovo"; public String getName() {
return name;
} public void setName(String name) {
System.out.println("setName 方法局部变量name: " + name);
System.out.println("Computer 的属性name:" + this.name);
System.out.println("外部内Person 属性的name:" + Person.this.name);
this.name = name;
} } }

 

2. 局部内部类

有这样一种内部类,它是嵌套在方法和作用于内的,对于这个类的使用主要是应用与解决比较复杂的问题,想创建一个类来辅助我们的解决方案,到那时又不希望这个类是公共可用的,所以就产生了局部内部类,局部内部类和成员内部类一样被编译,只是它的作用域发生了改变,它只能在该方法和属性中被使用,出了该方法和属性就会失效。(做Java后端 用法极少见 本人三年开发 从没见过有人用过)

public class TestInnerClass2 {

	//局部内部类:如下方式使用非常的少
private void show(){ class Inner{ }
} //如果一个类仅适用于当前方法时,可以声明如下方式
public static Comparator getComparator(){ class MyComparator implements Comparator{ @Override
public int compare(Object o1, Object o2) {
return 0;
} }
return new MyComparator();
} public static void main(String[] args) {
Comparator comparator = TestInnerClass2.getComparator();
}
}

 

3. 匿名内部类

注意:

  • 1.匿名内部类是没有访问修饰符的
  • 2.想使用外部的一个变量 该变量要用final修饰 -java8开始不需要
public class TestInnerClass2 {

	public static Comparator getComparator1(){

		Comparator com = new Comparator(){ //匿名内部类实现的Comparator接口,new的是匿名内部类的构造器

			@Override
public int compare(Object o1, Object o2) {
// TODO Auto-generated method stub
return 0;
} }; return com;
} public static void main(String[] args) {
Comparator comparator = TestInnerClass2.getComparator1();
/* comparator.compare(o1, o2);*/
}
}

 

4. 静态内部类

在java提高篇-----关键字static中提到Static可以修饰成员变量、方法、代码块,其他它还可以修饰内部类,使用static修饰的内部类我们称之为静态内部类,不过我们更喜欢称之为嵌套内部类。静态内部类与非静态内部类之间存在一个最大的区别,它是属于类本身,而不是某个对象

public class TestInnerClass {
public static void main(String[] args) {
//创建静态内部类的实例
Person.Mobile pm = new Person.Mobile();
pm.show(); }
} class Person { //静态内部类
static class Mobile{
public void show(){
System.out.println("这是静态内部类的方法");
}
} }

 

五.内部类标识符

由于每个类都会产生一个.class文件,其中包含了如何创建该类型的对象的全部信息。您可能猜到了,内部类也必须生成一个.class文件以包含它们的Class对象信息。这些类文件的命名有严格的规则:外围类的名字,加上$,再加上内部类的名字。

如果内部类是匿名的,编译器会简单地产生一个数字作为其标识符。

java核心技术-内部类的更多相关文章

  1. Java核心技术点之内部类

    1. 为什么要使用内部类     内部类就是定义在一个类内部的类,那么为什么要使用内部类呢?主要原因有以下几点:第一,内部类中定义的方法能访问到它所在外部类的私有属性及方法:第二,外部类无法实现对同一 ...

  2. 对《Java核心技术卷一》读者的一些建议

    <Java核心技术卷一>是唯一可以和<Java编程思想>媲美的一本 Java 入门书.单从技术的角度来看,前者更好一些.但上升到思想层面嘛,自然后者更好,两者的偏重点不同. 思 ...

  3. 面试必备!Java核心技术100+面试题

    一线互联网公司工作了几年,我作为求职者参加了不少面试,也作为面试官面试了很多同学,整理这份面试指南,一方面是帮助大家更好的准备面试,有的放矢,另一方面也是对自己知识框架做一个体系化的梳理. 这篇文章梳 ...

  4. 《Java核心技术卷I》观赏指南

    Tomxin7 如果你有想看书的计划,但是还在纠结哪些书值得看,可以简单看看"观赏指南"系列,本文会简单列出书中内容,给还没有买书的朋友提供一个参考. 前言 秋招过去很久了,虽然在 ...

  5. 【阅读笔记】Java核心技术卷一 #0

    这是一篇备忘性质的读书笔记,仅记录个人觉得有用的知识点 本文作为一个目录索引,部分章节跳过 吐槽:此书中文翻译有不少地方不太通顺,这种情况我要把英文版对应的部分也读一遍才能明白(说实话,英文里的从句表 ...

  6. Java学习--内部类(一)

    Java学习--内部类(一) 一. 内部类的定义和特点 class Outer{ privite int num = 5; class Inner{ public void Display(){ Sy ...

  7. Java核心技术点之泛型

    1. Why ——引入泛型机制的原因 假如我们想要实现一个String数组,并且要求它可以动态改变大小,这时我们都会想到用ArrayList来聚合String对象.然而,过了一阵,我们想要实现一个大小 ...

  8. Java核心技术点之集合框架

    1. 概述     Java集合框架由Java类库的一系列接口.抽象类以及具体实现类组成.我们这里所说的集合就是把一组对象组织到一起,然后再根据不同的需求操纵这些数据.集合类型就是容纳这些对象的一个容 ...

  9. Java核心技术点之动态代理

    本篇博文会从代理的概念出发,介绍Java中动态代理技术的使用,并进一步探索它的实现原理.由于个人水平有限,叙述中难免出现不清晰或是不准确的地方,希望大家可以指正,谢谢大家:) 一.概述 1. 什么是代 ...

随机推荐

  1. Python Pymongo中Connection()与MongoClient()差异

    在git找了几个blog的源码,在学习的过程中,发现有人使用Connection(),有人却在使用MongoClient(),那么到底两者有什么差别呢? 且看分析如下: db = Connection ...

  2. JDK8的安装及环境配置

    原文链接:https://www.cnblogs.com/chenxj/p/10137221.html 1.下载JDK: a.直接官网下载:http://www.oracle.com/: b.或百度网 ...

  3. Linux(ubuntu18.04)切换python版本

    前言 Ubuntu18.04系统在安装python时会安装两个版本:2.7和3.6.默认情况下系统环境使用的是python2,但是我们有时需要使用python3来作为我们的开发环境,所以需要自由切换p ...

  4. K8s的POD连接数据库时报错

    [root@cccc xxxx]# ./showlog.sh dr iff-dr-1128668949-lb90g 2017-09-29 03:21:57,575 INFO [org.wildfly. ...

  5. 【Alpha】任务分解与分配

    Alpha阶段总体任务规划 Alpha阶段我们的任务主要是恢复原先项目的代码运行,并增加一部分物理实验(二)的内容以及完善之前项目未完成的功能,例如后台管理及用户管理界面.在恢复项目部分的主要工作是将 ...

  6. vsftpd文件虚拟用户搭建

    关于vsftpd的原理这里就不多说了,下面红色部分有单独标出,突出显示,意思是这里的东西有额外的配置,全文的配置一定要跟着第二步的配置来,不要过程中随便改变参数,除非你看得懂,好了直接上配置过程 1. ...

  7. PyCharm+selenium环境搭建报错:Traceback (most recent call last): TypeError: 'module' object is not callable

    环境搭建好后,代码如下: from selenium import webdriverdriver = webdriver.chrome()driver.get("http://www.ba ...

  8. Firefox、Chrome、IE9、IE8、IE7、IE6等浏览器HTTP_USER_AGENT汇总

    Firefox.Chrome.IE9.IE8.IE7.IE6 浏览器HTTP_USER_AGENT汇总 结论:  浏览器 \ OS XP(IE6) XP(IE7) XP(IE8) Win7 x64(I ...

  9. (转)Db2 备份恢复性能问题诊断与调优

    原文:https://www.ibm.com/developerworks/cn/analytics/library/ba-lo-backup-restore-performance-issue-ju ...

  10. maven开发项目中遇到的问题 StartChild.call at java.util.concurrent.FutureTask.run

    这个原因是没有配置 pom中没有配置 <scope>provided</scope>  导致冲突 正确的配置文件如下 <project xmlns="http: ...