Java 之 内部类
(static修饰的成员属于整个类,而不属于单个对象)
定义:将一个类放到另一个类的内部定义,这个在内部定义的类就叫做内部类(也有的成嵌套类),包含内部类的类被称为外部类(也有的称宿主类)。
1。非静态内部类
没有使用static修饰的内部类就是非静态内部类。
注意:a。java不允许在非静态内部类中定义静态成员
b。当调用非静态内部类中的实例方法时,必须有一个非静态成员内部类实例,非静态内部类实例必须寄生在外部实例内
c。如果外部类成员变量与内部类成员变量与内部类里的方法的局部变量同名,可通过this,外部类类名.this 作为限定来加以区分。
public class Test { private String prop = "外部类的实例变量"; public class InClass{
private String prop = "内部类中的实例变量";
public void info(){
String prop = "局部变量";
System.out.println("外部类的实例变量值:"+Test.this.prop);
System.out.println("内部类的实例变量值:" + this.prop);
System.out.println("局部变量:" + prop);
}
}
public void test(){
InClass ic = new InClass();
ic.info();
}
public static void main(String[] args){
/*
* Test ts = new Test();
* ts.test();
* 上下的代码作用一样
*/
new Test().test();
}
}
使用非静态内部类:
在外部类以外的地方定义内部类的语法格式: OuterClass.InnerClass VarName
在外部类以外的地方创建非静态内部类实例的语法: OuterInstace .new InnerConstructor()
class Out{
class In
{
public In(String msg){
System.out.println(msg);
}
}
}
public class CreateInnerInstance {
public static void main(String[] args){
//OuterClass.InnerClass varName = new OutInstance.new InnearConstructor();
Out.In in = new Out().new In("测试信息");
/*Out.In in;
*Out out = new Out();
*in2 = out.new In("测试信息"); */
}
}
2.静态内部类
静态内部类是用static修饰的内部类,也称类内部类。
a。静态内部类不能访问外部类的实例成员,只能访问外部类的类成员(同为static 修饰)。
c。外部类依然不能访问静态内部类中的成员,但可以使用静态内部类的类名作为调用者来访问静态内部类中的类成员,也可以使用静态内部类对象作为调用者来访问静态内部类中的实例变量。
public class StaticInnerClassTest {
private int prop = 5 ;
private static int prop1 = 6 ;
static class InClass{
public void accessOuterProp(){ private static int prop = 5;
private int prop1 = 6;
//System.out.println(prop); //这句代码会出错,静态内部类无法访问外部类的非静态成员 System.out.println(prop1);
}
}
public void accessInnerPro(){
//通过静态内部类的类名访问静态内部类中的类成员 System.out.println(InClass.prop);
//通过静态内部类对象作为调用者来访问静态内部类中的实例变量
SYstem.out.println(new InClass().prop1);
}
}
在外部类以外使用使用静态内部类:(和使用非静态比较,相类似)
语法: new OuterClass.InnerConstructor()
class Out{
static class In
{
public In(){
System.out.println("静态内部类的构造器");
}
}
}
public class CreateStaticInnerInstance {
public static void main(String[] args){
Out.In in = new Out.In();
}
}
3.匿名内部类
如果把一个内部类放到方法中定义,则这个内部类就是一个局部内部类,局部内部类仅在该方法里有效。
定义匿名内部类的格式:
new 实现接口 | 父类构造器(实参列表)
{
类体部分
}
可以看出,匿名内部类必须继承一个父类或者实现一个接口。
interface Product{
public Double getPrice();
public String getName();
}
public class AnonymTest { public void ce(Product p){
System.out.println("购买了一个" + p.getName() + ",花掉了" + p.getPrice());
}
public static void main(String[] args){
AnonymTest at = new AnonymTest();
at.ce(new Product() {
@Override
public Double getPrice() {
return 0.5;
}
@Override
public String getName() {
return "辣条";
}
});
}
}
Java 之 内部类的更多相关文章
- Java学习--内部类(一)
Java学习--内部类(一) 一. 内部类的定义和特点 class Outer{ privite int num = 5; class Inner{ public void Display(){ Sy ...
- Java的内部类
Java的内部类 首先我们来了解一下什么是内部类? 内部类是指在一个外部类的内部再定义一个类.内部类可以是静态static的,也可用public,default,protected和private修饰 ...
- java使用内部类的好处及其初始化
java使用内部类的原因 每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响 java内部类初始化 ForeCatal ...
- JAVA基础——内部类详解
JAVA内部类详解 在我的另一篇java三大特性的封装中讲到java内部类的简单概要,这里将详细深入了解java内部类的使用和应用. 我们知道内部类可分为以下几种: 成员内部类 静态内部类 方法内部类 ...
- JAVA面向对象-----内部类的概述
JAVA面向对象-–内部类的概述s 将类定义在另一个类的内部则成为内部类.其实就是类定义的位置发生了变化. 在一个类中,定义在类中的叫成员变量,定义在函数中的叫成员函数,那么根据类定义的位置也可以分为 ...
- Java的内部类真的那么难以理解?
01 前言 昨天晚上,我把车停好以后就回家了.回家后才发现手机落在车里面了,但外面太冷,冷到骨头都能感受到寒意——实在是不想返回一趟去取了(小区的安保还不错,不用担心被砸车玻璃),于是打定主意过几个小 ...
- 第30节:Java基础-内部类
内部类 // 外部类 class Demo{ private int num = 3; // 定义内部类 class Int{ void show(){ System.out.println(&quo ...
- 【Java】 内部类
[Java]内部类 可以将一个类的定义放在另一个类的定义内部,这就是内部类. 使用内部类的的原因主要有三点: 内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据. 内部类可以对同一个包中的 ...
- java中内部类的积累
放在一个类的内部的类我们就叫内部类. 二. 作用 1.内部类可以很好的实现隐藏 一般的非内部类,是不允许有 private 与protected权限的,但内部类可以 2.内部类拥有外围类的所有元素的访 ...
- Java 基础 内部类
Java 基础 内部类 内部类(嵌套类) nested class 目的为外围类enclosing class提供服务. 四种: 静态成员类 static member class 非静态成员类 no ...
随机推荐
- MMM和MHA的对比和应用(PPT分享)
分享主题:MySQL高可用架构 --- MMM&MHA在大众点评应用和改进 内容简介:本次演讲,主要讲述以下几个方面 1. MMM在点评网是如何使用的 2. 细数MMM上踩过的坑以及如何填坑 ...
- [Matlab.Matrix] reshape
a=[1,2,3;4,5,6;7,8,9]; a=reshape(a,1,9); a=[1,4,7,2,5,8,3,6,9]; a=reshape(a,9,1); a=[1;4;7;2;5;8;3;6 ...
- UWP开发入门(十七)——判断设备类型及响应VirtualKey
蜀黍我做的工作跟IM软件有关,UWP同时会跑在电脑和手机上.电脑和手机的使用习惯不尽一致,通常我倾向于根据窗口尺寸来进行布局的变化,但是特定的操作习惯是依赖于设备类型,而不是屏幕尺寸的,比如聊天窗口的 ...
- CentOS6.5菜鸟之旅:中文编辑器忍痛放弃Sublime
一.前言 Windows下习惯使用Sublime作为编辑器,谁知道Linux下的Sublime是如此不照顾中文用户,找了N久终于找到一个蹩脚的解决方案,于是我毅然决然地加入Vim的阵营. 二.苦苦追寻 ...
- 【推荐】iOS带有加载网络图片进度的UIImageView
UCZProgressView 是一个带有通用的圆形图片进度下载控件.动画效果不错 特性 Customizable indicator (line width, radius, and color) ...
- 【Beta阶段】团队源代码管理
0. 快速上手与理解 如果你的团队来了一个新队员,有一台全新的机器,你们是否有一个文档,只要设置了相应的权限,她就可以根据文档,从头开始搭建环境,并成功地把最新.最稳定版本的软件编译出来,并运行必要的 ...
- MVC编辑状态两个DropDownList联动
前几天使用jQuery在MVC应用程序中,实现了<jQuery实现两个DropDownList联动(MVC)>http://www.cnblogs.com/insus/p/3414480. ...
- Java NIO中的读和写
一.概述 读和写是I/O的基本过程.从一个通道中读取只需创建一个缓冲区,然后让通道将数据读到这个缓冲区.写入的过程是创建一个缓冲区,用数据填充它,然后让通道用这些数据来执行写入操作. 二.从文件中读取 ...
- 【JS复习笔记】05 正则表达式
好吧,正则表达式,我从来没记过.以前要用的时候都是网上Copy一下的. 这里还是扯一下吧,以后要是有要用到的正则表达式那么就收集到这个帖子里.(尽管我认为不会,因为我根本就不是一个专业的前端,我只是来 ...
- Windows nexus 启动失败
现象: nexus Windows系统服务安装成功,但启动失败 D:\nexus-2.10.0-02-bundle\nexus-2.10.0-02\bin>nexus.bat Usage: ne ...