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 ...
随机推荐
- UliPad 初体验----python 开发利器
学习python 有段时间,最近博客更新比较慢了,空闲时间在零零碎碎的学python ,难成文,也就没整理成博客. 学习python 最苦恼的就是没有趁手IDE ,之前学java 时 Eclipse ...
- Android学习笔记之布局技巧以及布局中的细节介绍....
PS:休息两天,放一放手上的东西,做做总结... 学习内容: 1.Android中LinearLayout布局技巧... 2.layout中drawable属性的区别... 先简单的介绍一下dra ...
- 初涉SQL Server性能问题(4/4):列出最耗资源的会话
在上3篇文章里,我们讨论了列出反映服务器当前状态的不同查询. 初涉SQL Server性能问题(1/4):服务器概况 初涉SQL Server性能问题(2/4):列出等待资源的会话 初涉SQL Ser ...
- JS魔法堂:那些困扰你的DOM集合类型
一.前言 大家先看看下面的js,猜猜结果会怎样吧! 可选答案: ①. 获取id属性值为id的节点元素 ②. 抛namedItem is undefined的异常 var nodes = documen ...
- ADO.NET完整增删改
完整增添 删除 修改 运用中间变量运用.bool has=false 1增加 需要使用cmd.Parameters这个集合 占位符: @key 代表这个位置用这个占位符占住了 SqlConnectio ...
- 使用“原生”HTML DOM获取input的输入值并显示
理论基础 HTML <input> value属性.value规定<input>元素的值.value对于不同input类型,用法也不同. 1.对于"button&qu ...
- 关于SVN删除后的文件不能重新添加(正常途径不行)
在你自己的机器上(即SVN客户端),把“新建test”文件夹标记为删除,然后提交,在删除之前可以备份“新建test”文件夹,提交后,在当前文件夹下更新SVN.然后把你刚刚备份的文件夹重新放到该目录下. ...
- .net多线程的发展
APM和EAP是在async/await之前的两种不同的异步编程模式. APM如果不阻塞主线程,那么完成通知(回调)就会执行在另外一个线程中,从而给我们更新UI带来一定的问题. EAP的通知事件是在主 ...
- MyBatis插入语句返回主键值
插入语句xml代码: <insert id="insertUser" parameterType="com.spring.mybatis.po.User" ...
- ArrayList、Vector、HashMap、HashTable、HashSet的默认初始容量、加载因子、扩容增量
这里要讨论这些常用的默认初始容量和扩容的原因是: 当底层实现涉及到扩容时,容器或重新分配一段更大的连续内存(如果是离散分配则不需要重新分配,离散分配都是插入新元素时动态分配内存),要将容器原来的数据全 ...