内部类

把一个类放在另一个类中定义,这个定义在其他内部的类被称为内部类,包含内部类 的类被成为外部类,Java从JDK1.1开始引入了内部类的定义。

内部类的作用:

  1. 内部类提供了更好的封装,可以把内部类隐藏在外部类中,不允许同一个包中的其他类访问该类。假如需要创建一个Cow类,Cow类需要一个CowLeg对象,CowLeg对象只有在Cow类中才有作用,离开了Cow类后没有任何作用,就可以在Cow类中定义一个CowLeg类。CowLeg类只有在Cow类中才有作用,离开了Cow之后就没有任何意义。
  2. 内部类成员可以直接访问外部类的私有数据,因为内部类是被当做外部类的成员,同一个类中的成员可以相互访问,但是外部类是不可访问内部类的细节的,例如内部类的成员变量
  3. 匿名内部类适用于那些仅需要一次的类
  4. 内部类比外部类多了三个修饰符:private,protected,static。
  5. 非静态内部类是不可以创建静态成员的。

内部类的种类:匿名内部类,方法内部类,成员内部类。

  1. 成员内部类的使用方法

    /*
    * 成员内部类的定义
    */
    //定义一个接口
    interface Animal {
    void shout();
    } public class Example {
    public static void main(String[] args) {
    // 定义一个成員内部类实现Animal接口
    class Cat implements Animal {
    @Override
    public void shout() {
    System.out.println("喵喵");
    }
    } // 调用Shout方法并传入Cat对象
    Shout(new Cat());
    } // 定义一个静态方法animalShout()
    public static void Shout(Animal an) {
    an.shout();
    }
    }
  2. 匿名内部类的使用

语法格式:

new  父类(参数列表)或 父接口(){

  匿名内部类的实现部分

//定义动物类接口
interface Animal {
public void shout();
} public class Example01 {
public static void main(String[] args) { // 定义匿名内部类作为参数传递给animalShout()方法
animalShout(new Animal() {
// 实现方法
public void shout() {
System.out.println("喵喵。。");
}
}); } // 定义静态方法animalShout()
public static void animalShout(Animal an) {
an.shout();
}
}

  大部分时候,内部类一般做为成员内部类来使用,成员内部类是一种与成员,变量,方法,构造器和初始代码块相似的类成员;局部内部类和方法内部类则不是类成员。

  成员内部类分为两种:静态内部类和非静态内部类,使用static修饰的内部类时静态内部类,没有使用static修饰符的时非静态内部类。

  一个Java源文件中定义了多个类,那种情况不是内部类,他们时相互独立的静态内部类,内部类一定是放在一个类的类体中定义的。

  在非静态内部类中的方法访问一个变量时,系统会优先在该方法中查找是否有该变量,如果没有,就到它所在的内部类中查找同名的变量,如果还没有查找到,就到内部类所在的外部类中查找同名的变量,如果依然不存在,系统就会报错。

  如果外部类成员变量,内部类成员变量和内部类方法中的成员变量同名,可以使用this,外部类类名.this作为限定区分。

package cn.it.demo01;

public class DiscerVariable {

    private String prop1="外部类的成员变量";

    private class InClass{
private String prop="内部类的成员变量";
public void info() {
String prop="局部变量";
//通过外部类的类名.this.VarName访问外部类的成员变量
System.out.println("外部类的成员变量值:"+DiscerVariable.this.prop1);
//通过内部类的this来访问内部类的成员变量:
System.out.println("内部类的成员变量值:"+this.prop);
//直接访问局部变量
System.out.println("局部变量值:"+prop);
}
} public void test() {
InClass in=new InClass();
in.info();
}
public static void main(String[] args) {
new DiscerVariable().test();
}
}

  非静态内部类是可以访问外部类分私有成员变量,如果外部类是要访问内部类的成员变量是要显示创建非静态内部类的对象来访问其实例成员。

package cn.it.demo01;

public class Outer {
private int outProp = 9; class Inner {
private int inPorp = 5; public void acessOutProp() {
// 非静态内部类时可以直接访问外部类的成员变量的
System.out.println("外部类的outProp值:" + outProp);
}
} public void accessInnerPorp() {
// 外部类时不能直接访问内部类的成员变量的
// 以下代码出项错误
// System.out.println("内部类的成员变量:"+inPorp);
// 如需访问内部类的成员变量必须显示的创建内部类的对象
System.out.println("内部类的inPorp值:" + new Inner().inPorp);
} public static void main(String[] args) {
Outer out = new Outer();
out.accessInnerPorp();
} }

   根据静态成员不能访问非静态成员以及以上代码可以推出:外部类的静态方法,静态代码块是不能访问非静态内部类的,总之,不能外部类的静态成员中直接使用非静态的内部类。

静态内部类:  

  使用static修饰的一个内部类就是一个静态内部类,这个静态内部类是属于外部类的本身,而不是属于外部类的某个对象。

  静态内部类是不可以访问外部类的非静态成员的。

  注意:静态内部类的非静态方法也是不可以访问外部类的非静态成员的,因为,静态内部类是外部类相关的,静态内部类的对象不是寄存在外部类的实例对象中,而是寄存在外部类的本身,当静态内部类对象存在时,并不存在一个被他寄存的外部类实例对象,静态内部类只持有一个外部类的引用,并没有外部类的实例对象的引用,如果允许静态内部类访问外部类的非静态成员,但找不到被寄存的外部类对象,将引起错误。

  外部类依然不能直接访问静态内部类的成员变量,但可以使用类名来直接访问内部类的静态成员,也可以创建一个内部类成员来访问静态内部类的非静态成员。

package cn.it.demo01;

public class AccessStaticInnerClass {

    static class StaticInnerClass {
private static int prop1 = 5;
private int prop2 = 9;
} public void accessInnerProp() {
// System.out.println("prop1");
// 以上代码出现错误,应该为如下形式
System.out.println(StaticInnerClass.prop1);
System.out.println(new StaticInnerClass().prop2);
} }

java学习——内部类(一)的更多相关文章

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

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

  2. Java学习——内部类

    内部类的访问规则:1,内部类可以直接访问外部类中的成员,包括私有. 之所以可以直接访问外部类中的成员,是因为内部类中持有了 一个外部类的引用,格式 外部类名.this2,外部类要访问内部类,必须建立内 ...

  3. java学习——内部类(二)

    使用内部类 内部类一共有三种使用方法: 1.在外部类中使用内部类 在外部类中使用内部类,与平常使用内部类没有区别,可以直接通过内部类的类名来定义变量,通过new调用内部类的构造方法来创建实例. 唯一的 ...

  4. Java学习笔记之---内部类

    Java学习笔记之---内部类 (一)成员内部类 内部类在外部使用时,无法直接实例化,需要借助外部类信息才能实例化 内部类的访问修饰符可以任意,但是访问范围会受到影响 内部类可以直接访问外部类的成员, ...

  5. 【Java学习笔记之二十五】初步认知Java内部类

    可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面 ...

  6. 0035 Java学习笔记-注解

    什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...

  7. 0028 Java学习笔记-面向对象-Lambda表达式

    匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...

  8. 深入理解Java:内部类

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

  9. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

随机推荐

  1. Windows2008R2安装iis和iis下搭建web服务器(9.18 第七天)

    IIS internet information services 互联网信息服务微软开发的运行在windows中的互联网服务,提供了web.ftp.smtp服务 Windows server 200 ...

  2. 关于Promise的异步依次函数调用

    在Promise中async用于定义一个异步函数(可不写),该函数返回一个Promise. 如果async函数返回的是一个同步的值,这个值将被包装成一个理解resolve的Promise, 等同于re ...

  3. Android自定义View——仿滴滴出行十大司机评选活动说明

    滴滴出行原版图 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 仿图 ? ? ? ? ? ? 1.分 ...

  4. 设置Apache(httpd)和Nginx 开机自启动

     方法1: 进入目录: vi  /etc/rc.d/rc.local #设置apache 和 nginx 开机自启动/usr/sbin/apachectl start/usr/sbin/nginx s ...

  5. java使用BigDecimal 实现随机金额红包拆分算法

    原创代码,引用注明出处:https://www.cnblogs.com/guangxiang/p/12218714.html @Servicepublic class SplitRedPacketsS ...

  6. Postgres psql: 致命错误: 角色 "postgres" 不存在

    问题再现 当前环境: postgresql: 11.5 windows 10 企业版LTSC 64位 当运行"C:\Program Files\PostgreSQL\11\scripts\r ...

  7. [GXYCTF2019]禁止套娃

    0x00 知识点 无参数RCE eval($_GET['exp']); 参考链接: https://skysec.top/2019/03/29/PHP-Parametric-Function-RCE/ ...

  8. Linux学习打卡20200214

  9. CCCC 红色警报

    题意: 战争中保持各个城市间的连通性非常重要.本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报.注意:若该国本来就不完全连通,是分裂的k个区域,而失去一个 ...

  10. unix中嘚vim编辑器

    在linux家族中,vim编辑器是系统自带的文本编辑器,其功能强大自不必说了. 偶有小白,刚接触linux,要修改某个文本文件,不可能像WINDOWS那样操作,更有甚者,进入VI编辑器后,无法退出以致 ...