Java中的内部类(成员内部类、静态内部类、局部内部类、匿名内部类)

神话丿小王子的博客主页

  我们先看这样一段话:人是由大脑、肢体、器官等身体结果组成。而组成我们人体的心脏它也有自己的属性和行为(血液、跳动),显然,此处不能单方面用属性或者方法表示一个心脏了,而需要一个类,但是这个类要依赖于人这个类存在(因为心脏不能脱离人体而存活,当然不考虑现今社会的发达科技,只从正常情况下来说),所心脏以需要写在人类的内部。内部类就相当于其中的某个器官之一。

  首先看看什么是内部类:在类的内部定义另一个类。没错,定义就这么简单。如果在类Outer的内部再定义一个类Inner,此时Inner就称为内部类,而Outer则称为外部类。内部类的定义格式如下:

public class 外部类的名称{
//外部类的成员
public class 内部类的名称{
//内部类的成员
}
}

使用内部类有什么好处;

1)实现多重继承;

2)内部类可以很好的实现隐藏:一般的非内部类,是不允许有 private 与protected权限的,但内部类可以

3)减少了类文件编译后的产生的字节码文件的大小

使用内部类的缺点:使程序结构不清楚。

内部类在编译完成后也会产生.class文件,但文件名称是:外部类名称$内部类名称.class

内部类的种类:成员内部类、静态内部类、局部内部类、匿名内部类。下面分别详细学习一下这四种内部类的具体使用。

一、成员内部类

1、成员内部类也叫实例内部类。应用场合:每一个外部类对象都需要一个内部类的实例,内部类离不开外部类存在(相当于心脏对人体)

2、成员内部类的特征:

作为外部类的一个成员存在,与外部类的属性、方法并列

成员内部类持有外部类的引用

成员内部类中不能定义static变量和方法

3、使用格式:

Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();

代码演示一:

/*
* 成员内部类
*/
public class Body {
String arm;
String leg;
String blood;
public Body(String arm, String leg, String blood) {
super();
this.arm = arm;
this.leg = leg;
this.blood = blood;
}
//内部类Heart
class Heart{
String name;
void work() {
System.out.println("心脏正在给"+arm+leg+"输"+blood);
}
};
}
public class Test {
public static void main(String[] args) {
Body body=new Body("两个胳膊","两条腿","血");
Body.Heart heart=body.new Heart();
heart.work();
}
}

运行截图:

代码演示二:

/*
* 成员内部类
*/
public class Outer { private String name="Hello World"; public class Inner{
public void print(){
System.out.println(name);
}
};
public void print(){//定义外部类方法
new Inner().print();//通过内部类的实例化对象调用方法
}
public static void main(String[] args) {
Outer outer=new Outer();
outer.print();//调用外部类的方法
}
}

运行截图:

解释一下,上述代码中,new Inner().print();代码相当于
Inner inner=new Inner();
Inner.print();

二、静态内部类

1、内部类如果使用static声明,则此内部类就称为静态内部类。(其实也相当于外部类)可以通过外部类 . 内部类来访问。

2、静态内部类使用场合:内部类不需要外部类的实例(注意区分成员内部类),静态内部类存在仅仅为外部类提供服务或者逻辑上属于外部类,且逻辑上可以单独存在。

3、静态内部类的特征:

静态内部类不会持有外部类的引用

静态内部类可以访问外部的静态变量,如果访问外部类的成员变量必须通过外部类的实例访问

4、Java中只有内部类才可以是静态的

使用格式:Outer.Inner inner = new Outer.Inner();

代码演示一:

/*
* 静态内部
*/
public class Company {
String companyNam;
static String country;
static class Clear{
String name;
public Clear() {
// TODO Auto-generated constructor stub
} public Clear(String name) {
super();
this.name = name;
} public void work(String name){
String na=new Company().companyNam="联想";
country="中国";
System.out.println(name+"为"+na+"打扫卫生,该公司属于"+country);
}
}
}
public class Test {
public static void main(String[] args) {
Company.Clear zcl=new Company.Clear();
zcl.work("shen_hua");
} }

运行截图:

代码演示二:

/*
* 静态内部类
*/
public class Outer {
private static String info="Hello World";
private int i=8; static class Inner{
int num=new Outer().i;//获取外部类的非静态成员变量,景天成员变量可以直接使用
public void show() {
System.out.println(info+"---"+num);
}
};
}
public class Test {
public static void main(String[] args) {
Outer.Inner inner=new Outer.Inner();
inner.show();
}
}

运行截图:

三、局部内部类:

1、局部内部类也叫区域内嵌类,局部内部类与成员内部类类似,不过,区域内嵌类是定义在一个方法中的内嵌类。

2、使用场合:如果内部类对象仅仅为外部类的某个方法使用,使用局部内部类

3、特征:

用在方法内部,作用范围仅限于该方法中

根据情况决定持有外部类对象引用

不能使用private,protected,public修饰符

不能包含静态成员

代码演示一:

/*
* 局部内部类
*/
public class School { String schoolName;
String buss="培养人才";
int studentNum;
public School() {
// TODO Auto-generated constructor stub
} public School(String schoolName, String buss, int studentNum) {
super();
this.schoolName = schoolName;
this.buss = buss;
this.studentNum = studentNum;
} //宣传
public void show(){
final double tvMoney=10000;
final double netMoney=20000;
class AdverTeam{
String teamName="shen_hua";
//电视宣传
public void tvShow(){
System.out.println("宣传队是:"+teamName);
System.out.println("这是电视宣传,学校名称"+schoolName+",业务内容:"+buss+",学校人数:"+studentNum+",宣传所需费用"+tvMoney);
}
//网络宣传
public void netShow(){
System.out.println("宣传队是:"+teamName);
System.out.println("这是网络宣传,学校名称"+schoolName+",业务内容:"+buss+",学校人数:"+studentNum+",宣传所需费用"+netMoney);
}
}
new AdverTeam().tvShow();
new AdverTeam().netShow();
}
}
public class Test {
public static void main(String[] args) {
School qinghua=new School("清华","互联网培训",1000); qinghua.show();
}
}

运行截图:

四、匿名内部类

1、如果一个内部类在整个操作中只使用一次的话,就可以定义为匿名内部类。匿名内部类也就是没有名字的内部类,这是java为了方便我们编写程序而设计的一个机制,因为有时候有的内部类只需要创建一个它的对象就可以了,以后再不会用到这个类,这时候使用匿名内部类就比较合适。

2、使用场合:简化内部类的使用

3、特征:

使用new创建 ,没有具体位置

创建的匿名类,默认继承或实现new后面的类型

根据使用情况决定是否持有外部类对象引用

内嵌匿名类编译后生成的.class文件的命名方式是”外部类名称$编号.class”,编号为1,2,3…n,编号为x的文件对应的就是第x个匿名类

代码演示:

/*
* 匿名内部类
*/
public interface Person {
public void run();
}
/*
* 测试类
*/
public class Test {
public static void main(String[] args) {
Person p=new Person() {
public void run() {
System.out.println("匿名内部类实现的");
}
};
p.run();
} }

运行截图:

Java中的内部类(成员内部类、静态内部类、局部内部类、匿名内部类)的更多相关文章

  1. Java 内部类(成员内部类、局部内部类、静态内部类,匿名内部类)

    一.什么是内部类? 内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的一个成员,并且依附于外部类而存在的.内部类可为静态,可用protected和private修饰(而外部类只能使用publ ...

  2. java基础15 内部类(成员内部类、局部内部类)和匿名内部类

    一.内部类 1.1.1.成员内部类 一个类定义在另一个类的内部,那么该类就叫作成员内部类 1.1.2.成员内部类访问方式 方式一:在外部类中提供一个方法创建内部类的对象进行访问       方式二:在 ...

  3. 牛客网Java刷题知识点之什么是内部类、为什么要使用内部类、内部类如何使用外部类的属性和方法、成员内部类、局部内部类、静态内部类、匿名内部类

    不多说,直接上干货! 可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 内部类 ...

  4. Java中:接口,抽象类,内部类

    Java8中的接口 public interface Output { //接口里定义的成员变量只能是常量 //默认使用public static final修饰 int MAX_CACHE_LINE ...

  5. “全栈2019”Java第九十四章:局部内部类详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  6. Java内部类(3):局部内部类

    有这样一种内部类,它是嵌套在方法和作用域内的,对于这个类的使用主要是应用与解决比较复杂的问题,想创建一个类来辅助我们的解决方案,到那时又不希望这个类是公共可用的,所以就产生了局部内部类,局部内部类和成 ...

  7. “全栈2019”Java第九十九章:局部内部类与继承详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  8. Java:内部类(静态内部类、成员内部类、局部内部类、匿名内部类)

    Java基础_内部类:在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类. 内部类的主要作用:使用内部类可以减少命名冲突. 定义位置:一个内部类可以定义在一个类中,也可以 ...

  9. Java基础_内部类、静态内部类、成员内部类、局部内部类、匿名内部类 (转)

    From: http://www.itzhai.com/java-based-notebook-a-static-inner-class-within-a-class-member-within-th ...

  10. Java学习笔记19---内部类之简介成员内部类、局部内部类及匿名内部类

    内部类,顾名思义,即定义在某个类内部的类,称包含该内部类的类为外部类. 从定义的位置来说,分为成员内部类和局部内部类:从类的特征来说,分为匿名内部类和静态内部类. 今天先简要介绍一下前三种内部类的定义 ...

随机推荐

  1. 浅谈图片蒙版效果-webkit-mask

    会用PS的童鞋一定知道“蒙版”的概念,它可以在图片上实现一定的遮罩效果,当然这里我们不介绍ps里的蒙版,而是介绍利用CSS3的新属性-webkit-mask来实现网页中的图片遮罩效果. 大家对-web ...

  2. sqlserver 服务器主体 无法在当前安全上下文下访问数据库

    今天使用sqlserver,发现了一个问题,就是使用 insert into 数据库名.dbo.表名(字段) values(值) 这样语句的时候,会返回错误: sqlserver 服务器主体 无法在当 ...

  3. ASP.NET MVC系列:为已有模型添加新的属性

    在模型类Movie中添加一个新的属性Rating

  4. 127.0.0.1\SQLEXPRESS连接异常

    当你的数据库为SQLEXPRESS时,在程序的数据库连接字符串的服务Server使用127.0.0.1\SQLEXPRESS时,如下: 它会显示一异常: Server Error in '/' App ...

  5. ASP.NET MVC 请求流程:Route

    1.RouteTable RouteTable翻译过来的意思就是路由表,一个Web应用程序具有一个全局的路由表,该路由表通过System.Web.Routiing.RouteTable的静态只读属性R ...

  6. Tigase集群设置

    在两台Linux服务器ddd(IP:10.3.93.212)和tsung213(IP:10.3.93.213)上安装了Tigase,要把这两台服务器组成一个Tigase集群,只需要修改这两台服务器的i ...

  7. 解决在android开发中ViewPager中Gallery无法滑动问题

    我的是在viewpager中某个fragment中有gallery... 导致无法滑动,网上找到解决方法. 自定义Gallery. 代码: import android.content.Context ...

  8. 百度地图自定义Marker

    最近写了百度地图的Demo,所以总结下遇到的问题: 1.首先在百度地图中创建应用时用到 发布版SHA1是在Preferences下的Android下的Build中;2.在使用百度地图时,先要创建一个A ...

  9. IOS 2D游戏开发框架 SpriteKit-->续(postion,锚点,游戏滚动场景)

    一. Postion 这里的postion和app开发中的layer.postion是一样的,postion的值代表该视图在父节点中的相对位置, 比如一个试图的父节点是self.view, 这里我们想 ...

  10. volcanol_Linux_ 问题汇总系列_4_Thinkpad_E40_0578MDC_在Fedora 13 Linux(FC13)中如何安装无线网卡驱动

    今天晚上,我突然想在自己到笔记本上安装linux系统,因为我自己第一次接触到的linux是红帽支持到Fedora Core 4,所以一直最中意的linux 发行版本是FC系列,同时由于FC 15以后到 ...