什么是内部类

  1、内部类是指在一个外部类的内部再定义一个类。

  2、内部类作为外部类的一个成员,依附于外部类而存在。

  3、内部类可为静态,可用protected和private修饰(而外部类只能使用public和缺省的包访问权限)

内部类主要有以下几类:

  内部、局部内部、静内部、匿名内部

成员内部类(示例):

  即在一个类中直接定义的内部类, 成员内部类与普通的成员没什么区别,可以与普通成员一样进行修饰和限制。成员内部类不能含有static的变量和方法。

  

package com.ou.test;

public class Demo2 {

    private static int i = 1;
private int j = 10;
private int k = 20;
public static void method1() {
System.out.println("外部类的方法:method1");
}
public void method2() {
System.out.println("外部类的方法:method2");
} //成员内部类中,不能定义静态成员
//成员内部类中,可以访问外部类的所有成员
class DemoClass{
//static int test =2;//成员内部类中,不允许创建静态变量
int j =100;//内部类和外部类的实例变量可以共存
int jj= 1;
void inner_f1(){
// 在内部类中访问内部类自己的变量直接用变量名 或者使用this.
System.out.println(i);
System.out.println(this.jj);
// 在内部类中访问外部类中与内部类同名的实例变量用外部类名.this.变量名
System.out.println(Demo2.this.i);
// 如果内部类中没有与外部类同名的变量,则可以直接用变量名访问外部类变量
System.out.println(k); method1();
method2(); }
} //外部类的非静态方法访问成员内部类
public void method3(){ //不能使用static
DemoClass demo = new DemoClass();
demo.inner_f1();
} public static void main(String[] args) {
Demo2 demo = new Demo2();
Demo2.DemoClass demo1= demo.new DemoClass();
demo1.inner_f1();
} }

结果:

局部内部类

  在方法中定义的内部类称为局部内部类

  (1)、局部内部类只能在定义该内部类的方法内实例化,不可以在此方法外对其实例化。

  (2)、局部内部类对象不能使用该内部类所在方法的非final局部变量。

package com.ou.test;

public class Demo3 {
private int s = 100;
private int out_i = 1; public void f(final int k) {
final int s = 200;
int i = 1;
final int j = 10; // 定义在方法内部
class Inner {
int s = 300;// 可以定义与外部类同名的变量 // static int m = 20;//不可以定义静态变量
Inner(int k) {
inner_f(k);
} int inner_i = 100; void inner_f(int k) {
// 如果内部类没有与外部类同名的变量,在内部类中可以直接访问外部类的实例变量
System.out.println(out_i);
// 可以访问外部类的局部变量(即方法内的变量),但是变量必须是final的
System.out.println(j);
// System.out.println(i);
// 如果内部类中有与外部类同名的变量,直接用变量名访问的是内部类的变量
System.out.println(s);
// 用this.变量名访问的也是内部类变量
System.out.println(this.s);
// 用外部类名.this.内部类变量名访问的是外部类变量
System.out.println(Demo3.this.s);
}
}
new Inner(k);
} public static void main(String[] args) {
// 访问局部内部类必须先有外部类对象
Demo3 demo3 = new Demo3();
demo3.f(3);
} }

结果:

 

静态内部类(嵌套类)

  如果你不需要内部类对象与其外围类对象之间有联系,那你可以将内部类声明为static。这通常称为嵌套类(nested class)。想要理解static应用于内部类时的含义,你就必须记住,普通的内部类对象隐含地保存了一个引用,指向创建它的外围类对象。然而,当内部类是static的时,就不是这样了。嵌套类意味着:

  1. 要创建嵌套类的对象,并不需要其外围类的对象。

  2. 不能从嵌套类的对象中访问非静态的外围类对象。

package com.ou.test;

public class Demo4 {
private static int i = 1;
private int j = 10; public static void outer_f1() {} public void outer_f2() {} // 静态内部类可以用public,protected,private修饰
// 静态内部类中可以定义静态或者非静态的成员
private static class Inner {
static int inner_i = 100;
int inner_j = 200; static void inner_f1() {
// 静态内部类只能访问外部类的静态成员(包括静态变量和静态方法)
System.out.println("Outer.i" + i);
outer_f1();
} void inner_f2() {
// 静态内部类不能访问外部类的非静态成员(包括非静态变量和非静态方法)
// System.out.println("Outer.i"+j);
// outer_f2();
}
} public void outer_f3() {
// 外部类访问内部类的静态成员:内部类.静态成员
System.out.println(Inner.inner_i);
Inner.inner_f1();
// 外部类访问内部类的非静态成员:实例化内部类即可
Inner inner = new Inner();
inner.inner_f2();
} public static void main(String[] args) {
new Demo4().outer_f3();
}
}

结果:

匿名内部类

简单地说:匿名内部类就是没有名字的内部类。什么情况下需要使用匿名内部类?如果满足下面的一些条件,使用匿名内部类是比较合适的:
  • 只用到类的一个实例。
  • 类在定义后马上用到。
  • 类非常小(SUN推荐是在4行代码以下)
  • 给类命名并不会导致你的代码更容易被理解。
在使用匿名内部类时,要记住以下几个原则:
  •   匿名内部类不能有构造方法。

  •   匿名内部类不能定义任何静态成员、方法和类。

  •   匿名内部类不能是public,protected,private,static。

  •   只能创建匿名内部类的一个实例。

  • 一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。

  •   因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。

实例1:不使用匿名内部类来实现抽象方法

abstract class Person {
public abstract void eat();
} class Child extends Person {
public void eat() {
System.out.println("eat something");
}
} public class Demo {
public static void main(String[] args) {
Person p = new Child();
p.eat();
}
}

实例2:匿名内部类的基本实现

abstract class Person {
public abstract void eat();
} public class Demo {
public static void main(String[] args) {
Person p = new Person() {
public void eat() {
System.out.println("eat something");
}
};
p.eat();
}
}

实例3:在接口上使用匿名内部类

interface Person {
public void eat();
} public class Demo {
public static void main(String[] args) {
Person p = new Person() {
public void eat() {
System.out.println("eat something");
}
};
p.eat();
}
}

实例4:Thread类的匿名内部类实现

public class Demo {
public static void main(String[] args) {
Thread t = new Thread() {
public void run() {
for (int i = 1; i <= 5; i++) {
System.out.print(i + " ");
}
}
};
t.start();
}
}

java 内部类(简单使用)的更多相关文章

  1. java 内部类简单总结

    在java中,一个类可以放在另一个类的内部,称之为内部类,相对而言,包含它的类称之为外部类.不过对于Java虚拟机而言,它是不知道内部类这回事的, 每个内部类最后都会被编译为一个独立的类,生成一个独立 ...

  2. java内部类简单用法

    package innerClass; /** * 特点 * 1:增强封装性,通过把内部类隐藏在外部类的里面,使得其他类不能访问外部类. * 2:增强可维护性. * 3:内部类可以访问外部的成员. * ...

  3. 简单谈一谈Java内部类的使用原因

    使用内部类的原因 学习总得知其所以然,前面的一篇文章中我有提到过关于java内部类的几种用法以及一些示例,但是不明白内部类具体可以做什么,显然学习起来很渺茫,今天的文章简单说一说使用内部类的几个原因, ...

  4. java 内部类 *** 最爱那水货

    注: 转载于http://blog.csdn.net/jiangxinyu/article/details/8177326 Java语言允许在类中再定义类,这种在其它类内部定义的类就叫内部类.内部类又 ...

  5. java内部类的作用分析

    提起Java内部类(Inner Class)可能很多人不太熟悉,实际上类似的概念在C++里也有,那就是嵌套类(Nested Class),关于这两者的区别与联系,在下文中会有对比.内部类从表面上看,就 ...

  6. Java内部类this$0字段产生的一个bug

    首先查看下面一段代码,我指出了问题代码的所在,读者先自己思考一下这段代码会有什么问题. 这是用clone方法完整拷贝一个二项堆(BinomialHeap)结构的代码.二项堆中包含一个内部类Binomi ...

  7. Java内部类的使用小结

    转载:http://android.blog.51cto.com/268543/384844/ Java内部类的使用小结 内部类是指在一个外部类的内部再定义一个类.类名不需要和文件夹相同. *内部类可 ...

  8. 【转】Java 内部类种类及使用解析

    Java 内部类种类及使用解析 内部类Inner Class 将相关的类组织在一起,从而降低了命名空间的混乱. 一个内部类可以定义在另一个类里,可以定义在函数里,甚至可以作为一个表达式的一部分. Ja ...

  9. (转载)Java内部类的使用小结

    原文摘自:http://android.blog.51cto.com/268543/384844/   内部类是指在一个外部类的内部再定义一个类.类名不需要和文件夹相同. *内部类可以是静态stati ...

随机推荐

  1. 多线程基础知识---join方法

    join方法的作用 thread.join()方法用于把指定的线程加入到当前线程中,把当前线程的CPU执行时间让给另一个线程.比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继 ...

  2. js-object引用示例

    function displayInfo(args){ var output=""; if(typeof args.name == "string"){ out ...

  3. chgrp 命令

    NAME chgrp - change group ownership SYNOPSIS chgrp [OPTION]... GROUP FILE... chgrp [OPTION]... --ref ...

  4. python 下安装pymysql数据库

    两种方法来安装pymysql 方法一.利用命令来安装 安装:python37 -m pip install pymysql 升级:python37 -m pip install pymysql --u ...

  5. 小菜鸟之HTML常用

    html的基本结构是什么? 表示段落标签是什么?<p> 表示标题标签的是什么?<title>Css标签样式</title> 表示区域标签的是什么?<div&g ...

  6. 小a的强迫症 题解

    题面: 小a是一名强迫症患者,现在他要给一群带颜色的珠子排成一列,现在有N种颜色,其中第i种颜色的柱子有num(i)个.要求排列中第i种颜色珠子的最后一个珠子,一定要排在第i+1种颜色的最后一个珠子之 ...

  7. Lazy的SDL教程 翻译----Lesson 22 Timing

    原文:http://lazyfoo.net/tutorials/SDL/22_timing/index.php Timing 计时 Last Updated 3/10/14 Another impor ...

  8. echart4数据管理组件dataset学习

    背景 如果后台数据固定,如何动态定制其前端数据展示方式呢?也就是说同一种数据,如何被多个前端Echarts图表复用呢?最近在研究一种数据展示可配置化的功能,然后发现了echart4.0的dataset ...

  9. 【原创】大数据基础之ETL vs ELT or DataWarehouse vs DataLake

    ETL ETL is an abbreviation of Extract, Transform and Load. In this process, an ETL tool extracts the ...

  10. JS基础_打印出1-100之间所有的质数

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...