内部类

把一个类放在另一个类中定义,这个定义在其他内部的类被称为内部类,包含内部类 的类被成为外部类,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. Emacs服务器模式以及emacsclient配置

    Emacs有很多强大的插件,但是插件安装多了会导致启动速度很慢.为了解决这个问题,一个方法是使用emacs提供的server模式. 基本用法[1] 启动emacs server: $ emacs -- ...

  2. 15.swoole学习笔记--异步写入文件

    <?php //异步写入文件 $content="hello world"; swoole_async_writefile('2.txt',$content,function ...

  3. 与Power BI一起使用Cortana

    使用此页面测试您的Cortana卡.https://app.powerbi.com/cortana/test 文档: 使用Power BI为Cortana创建自定义答案页https://powerbi ...

  4. centos7搭建kafka集群

    一.安装jdk 1.下载jdk压缩包并移动到/usr/local目录 mv jdk-8u162-linux-x64.tar.gz /usr/local 2.解压 tar -zxvf jdk-8u162 ...

  5. Day 18:SequenceInputStream、合并切割mp3、对象输入输出流对象

    SequenceInputStream用例题讲述用法 需求:1.把a.txt与b.txt 文件的内容合并 2.把a.txt与b.txt .c.txt文件的内容合并 import java.io.Fil ...

  6. python--txt文件处理

    1.打开文件的模式主要有,r.w.a.r+.w+.a+ file = open('test.txt',mode='w',encoding='utf-8') file.write('hello,worl ...

  7. Java算法练习——最长回文子串

    题目链接 题目描述 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1 输入: "babad" 输出: "bab" ...

  8. oracle(5)--DQL查询语句

    DQL 数据查询语句(data query language) 1.查询条件符号: < ,  > ,  = ,    <= ,  >= ,    != ,  < > ...

  9. bash: java: command not found

    [root@izm5eab8t820b79js38tbxz ~]# java -version -bash: java: command not found 出现上面问题,解决方法: [root@iz ...

  10. Vue.js(2)- 过滤器

    概念:过滤器本质上就是一个函数,可被用作一些常见的文本格式化. 过滤器只可以用在两个地方:mustache 插值表达式和 v-bind 表达式. 过滤器应该被添加在 JavaScript 表达式的尾部 ...