内部类(嵌套类、内置类)访问规则、定义原则、静态内部类、匿名内部类

一、内部类

1、内部类的访问规则:

1、内部类可以直接访问外部类中的成员,包括私有。之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式为:外部类明.this

2、外部类要访问内部类,必须创建内部类对象。

2、访问格式

1、当内部类定义在外部类的成员位置上是,而且非私有,可以在外部其他类中

可以直接建立内部类对象

格式:

外部类明.内部类名 变量名=外部类对象.内部类对象;

Outer.Inter in=new Outer().new Inner();

2、当内部类在成员位置上时,就可以成员修饰符所修饰

比如:private:将内部类在外部类中进行封装

static:内部类就具备static特性

当内部类被静态修饰后,只能访问外部类中的静态成员了,出现了访问局限。

在外部其他类中,如何直接访问静态内部类的非静态成员呢?

new Outer.Inner().function();

在外部其他类中,如何直接访问静态内部类的静态成员呢?

Outer.Inner.function();

3、注意事项:

当内部类中定义了静态成员,该内部类必须是静态的

当外部类的静态方法访问内部类时,内部类也必须是静态的

3、何时使用内部类

当描述事物时,事物的内部还有事物,该事物用内部类来描述

因为内部事物在使用外部类事物的内容

class Outer
{
	int x=3;

	private void function()
	{
		System.out.println("inner:"+Outer.this.x);//此时打印的是3
	}

	void method()
	{
		System.out.println(x);
	}
}

class InnerClassDemo
{
	public static void main(String[] args)
	{
		Outer.Inter in=new Outer().new Inner();
		in.function();
	}
}

4、内部类定义在局部时

1、不可以被成员修饰符修饰。

2、可以直接访问外部类的成员,因为还持有外部类的引用,

但是不可以访问他所在的局部中的变量,只能访问被final修饰的局部变量。

class Outer
{
	int x=3;
	void method(final int a)
	{
		class Inter  //这里面就不能用private修饰了,也不能是静态的
		{
			final int y=4;
			void function()
			{
				System.out.println(x);

				System.out.println(y);
				System.out.println(a);
			}
			new Inter().function();
		}
	}
}

class InterClassDemo3
{
	public static void main(String[] args)
	{

		Outer out=new outer();
		out.method(7);
		out.method(8);//虽然是final修饰的,但这样是可以的,因为是局部变量,栈内存存放
		/*
		new Outer().method(7);
		new Outer().method(8);
		*/
	}
}

二、匿名内部类

1、匿名内部类其实就是内部类的简写格式

2、定义匿名内部类的前提

内部类必须是继承一个类或者是实现接口

3、匿名内部类的格式:new 父类或者接口(){定义子类的内容}

4、其实匿名内部类就是一个匿名子类对象。而且这个对象有点胖

也可以把它理解成一个带内容的对象

5、匿名内部类中定义的方法最好不要超过3个

class AbcDemo
{
	abstract void show();
}

class Outer
{
	int x=3;

	/*
	class Inter extends AbcDemo
	{
		void show()
		{
			System.out.println("method="+x);
		}

	}
*/
	public void function()
	{
		//new Inter().show();//下面这个就是相当于上面这句
		new AbsDemo()  //***********************************整体是AbsDemo的子类对象
		{
			void show()
			{
				System.out.println("x="+x);
			}
			void abs()
			{
				System.out.println("haha");
			}

		}.show();//也可以调用abc()
	}
}

class InterclassDemo4
{
	public static void main(String[] args)
	{
		new Outer().function();
	}
}
interface Inter
{
	public abstract void method();
}

/*
class Test
{
	//补足代码,通过匿名内部类
	static class Inner implements Inter
	{
		public void method()
		{
			System.out.println(method run);
		}
	}
	static Inter function()
	{
		return new Inner();
	}
}
*/

	static Inter function()
	{
		return new Inter()
		{
			void method()
			{
				System.out.prinyln("method run");
			}
		};//分号不能少,这是一个return语句
	}

class  InterClassDemo5
{
	public static void main(String[] args)
	{
		//Test类中有静态成员方法function()
		//并且返回值肯定是一个对象,而且是Inter类型的对象
		//因为只有是INter类型的对象才可以调用method方法
		Test.function().method;

	//	Inter in=Test.function();
	//	in.method();

		show(new Inter()
		{
			public void method()
			{
				System.out.println("method show run");
			}
		});
	}
	public static void show(Inter in)
	{
		in.method();
	}
}
时间: 2024-10-20 05:33:39

内部类(嵌套类、内置类)访问规则、定义原则、静态内部类、匿名内部类的相关文章

Java多线程编程6--单例模式与多线程--使用静态内置类、(反)序列化、static代码块、enum枚举数据类实现

前面讲的用DCL可以解决多线程单例模式的非线程安全,虽然看下去十分完美,但还是有一些问题,具体分析看这篇:http://blog.csdn.net/ochangwen/article/details/51348078 当然用其他的办法也能达到同样的效果. 1.使用静态内置类实现单例模式 public class Singleton { /* 私有构造方法,防止被实例化 */ private Singleton() { } /* 此处使用一个内部类来维护单例 */ private static c

基于内置类的原型扩展方法

<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title>基于内置类的原型扩展方法</title></head><body><script type="text/javascript"> var ary = [12, 23, 34, 12, 23, 34, 12, 23, 34, 12, 23, 34,

EXT心得--并非所有的items配置对象都属于EXT的内置类

之前我对EXT的items中未指明xtype的配置对象有一个错误的认识--即虽然某个items未指明它下面的某个组件的xtype,但这个组件肯定属性EXT的某个类.然而今天在查看actioncolumn的配置items时发现这个思想是错误的认识. 看以下代码 },{ header : "删除", xtype:'actioncolumn', //3.4.0/#!/api/Ext.grid.ActionColumn 未在当前版本找到该类.--ext4api Ext.grid.column.

类内与类之间相关属性耦合采取刷新的讨论

标题有点看不懂,说简单点,第一种情况就是类A与类B两个类.其中类B需要类A的一个数据,并且到A中的数据进行更改时,类B需要被通知,进行刷新修改本地保存的类A中的相关属性.懂设计模式的朋友一看就知道可以用Observe观察者模式,将类B当成观察者,类A当成被观察者.即 A a; B b; a.addObserve(&b); a.update(); 当每次A的数据发生改变时,维护A的人需要手动去刷一把update来让A的所有观察者进行刷新,更新数据,这是一种方法.当然了,像我平时Qt开发,自然而然的

[转]后台页面访问权限:页面基类&amp;内置票据认证 使用方法

本文转自:http://www.cnblogs.com/fishtreeyu/archive/2011/01/29/1947421.html 一般网站后台页面除了登录页面login.aspx未登录用户可访问外,其它页面必须登录用户才可访问, 当用户未登录时进入某个页面则自动判断并跳转到登录页面: (如果login.aspx页面用到图片及Css.Js文件,那么也必须允许未登录用户可访问Images.Css.Js文件夹) 方法一:运用页面基类BasePage.cs 1.BasePage.cs代码:

01类内置方法

# 写一个单例类# __名子__ # 类中的特殊方法.内置方法 # 双下方法 # 魔法方法 # __call__ flask# __new__ 特别重要 写一个单例类# __len__# __str__ /__repr__ __call__ # __call__ flask class A: def __call__(self, *args, **kwargs): print("执行__call__方法") # # a = A() # a() # 对象加()执行call方法 # A()

类内置的attr属性

python类的内置attr属性 class Foo: x=1 def __init__(self,y): self.y=y def __getattr__(self, item): print('----> from getattr:你找的属性不存在') def __setattr__(self, key, value): print('----> from setattr') # self.key=value #这就无限递归了,你好好想想 # self.__dict__[key]=valu

2.2.14内置类与同步:测试1

本实验测试是在内置类中有两个同步方法,但使用的却是不同的锁,打印结果也是异步的 package com.cky.bean; /** * Created by edison on 2017/12/9. */ public class OutClass { static class Inner { public void method1(){ synchronized ("其他的锁") { for (int i = 0; i <= 10; i++) { System.out.prin

.Net——使用.net内置处理程序处理自己定义节点Demo

在.net中.由于对不同的节点,都相应着类去对它进行处理,.net里面为了方便.已经内置了一些类供我们使用.使我们在读取配置文件时.不必自己去定义类去处理自己定义的自己定义节点. 以下我们写了这样一个配置文件: <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <!--使用IgnoreSection处理自己定义节点--> &