什么是内部类

  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. 进行hcmcloud 数据库备份以及设置的处理过程.

    导入数据库以及简单设置. 最近进行了一个数据库备份的简单工作: create database hcmcloud create user hcm with password 'Test6530' 执行 ...

  2. ARC099E. Independence

    考虑一个子问题.给定无向图 $G$,如何判断能否将 $G$ 的点集分成两部分 $S$.$T$ 使得 $S$ 和 $T$ 导出的子图都是完全图? 这个问题把我难住了.解法是考虑 $G$ 的补图 $G'$ ...

  3. 从入门到自闭之Python--MySQL数据库的单表操作

    单表查询:select * from 表 where 条件 group by 分组 having 过滤 order by 排序 limit n; 语法: select distinct 字段1,字段2 ...

  4. python---博客分类目录

    python基础 python函数 python模块 python面向对象 网络编程 并发编程 数据库 前端学习 HTML基础 CSS基础 JavaScript基础 js操作BOM和DOM jQuer ...

  5. T100——r类 凭证报表 打印

    报表开发流程:1.建立入口程序 如r类的作业:cxmr500步骤: azzi900中建立程序代号 azzi910中建立作业代号 设计器--规格--签出 设计器--程序--签出 adzp168(r.a) ...

  6. C#发送Outlook邮件(仅SMTP版本)

    先表明Outlook的参数:网址:https://support.office.com/zh-cn/article/Outlook-com-%E7%9A%84-POP%E3%80%81IMAP-%E5 ...

  7. Power BI 报表服务器中的行级别安全性 (RLS)

    在 Power BI Desktop 中定义角色和规则 你可以在 Power BI Desktop 中定义角色和规则. 发布到 Power BI 时,它还会发布角色定义. 若要定义安全角色,请执行以下 ...

  8. MVC进阶讲解+小技巧-乱七八糟

    开发步骤 1.建立项目 2.建立文件夹 3.建立Controllers 4.生成页面 5.编写Html+Js 6.编写异步请求的Action的方法,返回部分页(用于分页) 7.Js中显示部分页 8.增 ...

  9. 解决windows系统下ping,ipconfig不是内部或外部命令

    一般情况下,都是误删了系统变量path的值.解决方法:右击我的电脑 → 选择属性 → 选择高级系统设置 → 环境变量 → 在系统变量列表中,找到“path”环境变量双击,打开.在变量值这一栏检测下是否 ...

  10. luogu题解P2312解方程--暴力模+秦九韶

    题目链接 https://www.luogu.org/problemnew/show/P2312 分析 这道题很毒啊,这么大的数. 但是如果多项式\(\sum_{i=0}^N a[i]*X^i=0\) ...