内部类

把一个类放在另一个类中定义,这个定义在其他内部的类被称为内部类,包含内部类 的类被成为外部类,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. Springboot跨域 ajax jsonp请求

    SpringBoot配置: <dependency> <groupId>org.springframework.boot</groupId> <artifac ...

  2. 121-PHP类成员函数(二)

    <?php class ren{ //定义人类 const name='ren'; public function classname(){ echo '这个类的名称:'.self::name; ...

  3. 可并堆模板题-mergeable heap

    Description 有n个点,第i个点标号为i,有两种操作:0 x y 表示把x所在堆和y所在堆合并.1 x 表示询问x所在堆的最小权. Input 第一行两个整数n,m,表示有n个点m个操作. ...

  4. 类成员之迭代iter

    class B: def __init__(self,name,age): self.name = name self.age = age #创建迭代方法 def __iter__(self): re ...

  5. 关于SI522替代FM17522和MFRC522的资料对比

    以下是SI522与FM17522.MFRC522的对比参数: SI522是完全PIN对PIN软硬件兼容MFRC522.CV520.FM17522,另外我们可提供一对一技术支持解决客户所遇到的问题: 1 ...

  6. java初学小项目-酒店客房管理系统

    最近初次接触JAVA,感觉之前学的C语言很有用,跟着视频做了一个小项目-酒店客房管理系统 /* 酒店客房管理系统 */ import java.util.Scanner;//通过键盘来输入命令需要的引 ...

  7. hdfs 删除和新增节点

    最近发现hdfs的一个问题,每当集群开启的时候,有一个节点上的可用空间就一直在减少,并且速度很快,发现是data目录下的dncp_block_verification.log.curr文件在一直变大, ...

  8. [Mathematics][MIT 18.03] Detailed Explanation of the Frequency Problems in Second-Order Differential Equation of Oscillation System

    Well, to begin with, I'd like to say thank you to MIT open courses twice. It's their generosity that ...

  9. 使用DOM4J生成XML文档

    package xml; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; imp ...

  10. python虚拟环境配置(下)

    前言 嘿,各位小伙伴们,晚上好呀,新年快乐,注意预防流感哈,就不要出去浪了,万一中奖了,嗯...,还是当个宅男,宅男无敌,哈哈哈, 过年了,村都被封了,哎,出都出不去,想着干点啥,就把以前没完善的继续 ...