内部类

把一个类放在另一个类中定义,这个定义在其他内部的类被称为内部类,包含内部类 的类被成为外部类,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. (转)ERROR 2002 (HY000): Can't connect to local MySQL server through socket '***' (2)

    有时候,当我们使用“mysql”.“mysqladmin”.“mysqldump”等命令管理数据库时,服务器抛出类似如下错误: 1 ERROR 2002 (HY000): Can't connect ...

  2. tensorflow学习笔记(三)常用函数

    上一篇简单介绍了tensorflow的基本操作,这一篇介绍一些常用的函数. tf.constant() tf.constant ( value , dtype = None , shape = Non ...

  3. 十八、JavaScript之布尔类型

    一.代码如下 二.运行效果 <!DOCTYPE html> <html> <meta http-equiv="Content-Type" conten ...

  4. 九十四、SAP中ALV事件之八,显示功能按钮栏

    一.我们把其他代码都注释掉,直接写一行调用 SET PF-STATUS 'TIANPAN_TOOLS'. 二.运行程序,会看到我们上一篇所添加的相关功能栏图标, 三.点击不同图标,会按程序代码,有不同 ...

  5. opencv目录(转)

    github:https://github.com/opencv/opencv OpenCV 3 的源代码文件夹: 3rdparty/: 包含第三方库,如用视频解码用的 ffmpeg.jpg.png. ...

  6. Mysql :分支结构—if函数

    一分支结构 1.if函数 功能:实现简单的双分支 语法: IF (表达式1,表达式2,表达式3) 执行顺序 如果表达式1成立 则if函数返回表达式2的值,否则返回表达式3的值 应用: 任何地方

  7. kettle将csv文件导入数据库

    具体过程学习了: 1.连接数据库 2.添加新资源库 3.选择Other Repositories 4.选择Database Repository,第二个需要配置额外参数 5.连接数据库相关设置 6.连 ...

  8. 实验吧web-易-上传绕过

    随便上传一个png文件,出现提示 我们再上传一个php文件,却出现提示 上传遇到问题是肯定的,题目就是上传绕过,所以我们下面要做的就是绕过检测. 这里使用00截断. 首先在提交时抓包 我们将图中upl ...

  9. Android进阶——Crash异常捕获并发送到服务器

    在项目中,我们常常会遇到Crash的现象,也就是程序崩溃的时候,这个时候最常看到的就是这个界面 如果你的项目已经发布到市场上了,这样的崩溃对于开发人员是看不到的,所以我们得想方法将崩溃信息发送到服务器 ...

  10. php和js的小区别

    1.今天看了下php的api感觉还可以,不是很难,可能没看到深入的地方, (1)和js很相似 目前感觉它和js的最大区别 js的  点  被替换成 -> function setCate($pa ...