---------------------- 黑马程序员 Android培训、期待与您交流! ----------------------
内部类访问规则:
* 1,内部类可以直接访问外部类中的成员,包括私有。
* 之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用
* (格式:外部类外.this)
相当于孙悟空要访问牛摩王的心脏,如果孙悟空在牛魔王的身体里,就可以直接访问了
* 2,外部类要访问内部类,必须建立内部类对象。
*
* 访问格式:
* 1.当内部类定义在外部类的成员位置上,而且非私有,可以在外部其它类中。
* 可以直接建立内部类对象。
* 格式:
* 外部类外.内部类名 变量名= new外部类().new内部类();
* Outer.Inner in = new Outer().new Inner();
* 解析上面代码:Outer.Inner就是访问Outer对象的内部类
* 2.当内部类在成员位置上,就可以被成员修饰符所修饰
* 比如,private:将内部类在外部类中封装。
* Static:内部类就具备static特性。
* 当内部类被static修饰后,只能直接访问外部类中的static成员。出现了访问局限
*
* 在外部其他类中,如何访问内部类的非静态成员呢?
* newOuter.Inter().Show();
*
* 在外部其他类中,如何访问内部类的静态成员呢?
* Outer.Inter().Show();
*
* 注意:当内部类中有static定义了静态成员变量,该内部类也必须是静态的。static
* 当外部类中静态方法访问内部类时,内部类也必须是static静态的。
*/
class Outer
{
private int x = 3;
class Inner
{
void Show()
{
int x = 3;
System.out.println("内部类"+Outer.this.x);
}
}
static class Inter //静态内部类
{
void Show()
{
int x = 3;
System.out.println("静态内部类"+x);
}
}
void method()
{
Inner in = new Inner();
in.Show();
}
//访问内部类的方法:失败
public void Insert()
{
new Outer().Insert();
System.out.println("当外部类中静态方法访问内部类时,内部类也必须是static静态的。");
}
}
public class _01内部类 {
public static void main(String[]args)
{
Outer o = new Outer();
o.method();
//直接访问内部类中的成员
Outer.Inner in = new Outer().new Inner();
in.Show();
//静态访问内部类方法(因为没有访问具体成员变量,所以可以直接通过类名调用)
new Outer.Inter().Show();
//---------------------------------
o.Insert();//访问内部类时,内部类也必须是static静态的。
}
}
内部类定义规则
/*
*当描述事物时,事物的内部还有事物,该事物用内部类来描述。
* 因为内部事物可以直接访问外部事物的内容。
*
* 举例:人体
* 人体里面包含心肝脾肺肾
*
* 人体:是一个外部类
* |--包含心脏跳动的方法
* |--包含肺的活动方法
*
* 心脏:是一个内部类
* |--包含左心房的方法
* |--包含右心房的方法
*
*
* class Body
* {
* privateclass XinZang //内部类定义时,最好将其私有,不对外暴露
* {
* voidshow TiaoDong(){}
* }
*
* //对钱提供方法,来访问内部事物
* publicvoid show()
* {
* newXinZhang().TiaoDong(); 创建心脏对象,并访问跳动方法
* }
* }
* ---------------------------------------
* 把心脏定义在人体里面,这样符合自然规律。心脏可以直接在内部访问人体内的方法。
* 如果定义在外面,心脏还要创建人体的对象,然后才可以访问人体的方法,
*
* 为什么要把内部类私有呢?
* 心脏如果直接被别人访问,就会很受伤。所以将其封装,只能让大夫访问,并判断是不是大夫
* ---------------------------------------
*/
匿名内部类
/*
* 内部类定义在局部时(就是:类中的方法中)
* 1,不可以被成员修饰符修饰
* 2,可以直接访问外部类中的成员。因为还持有外部类中的引用。
* 但是,不可以访问它所在的局部中的变量,只能访问被final修饰的局部变量
*
*/
class Out
{
int x=3;
void method(final int num)
{
final int y=4;
//定义内部类:方法中的内部类,不可以加static静态变量修饰
class Inner
{
void function()
{
System.out.println("x="+x);
System.out.println("y="+y);
}
}
new Inner().function();
System.out.println("final="+num);
}
}
public class _02匿名内部类 {
public static void main(String[]args)
{
Out o = new Out();
o.method(5);
o.method(7);
}
}
匿名内部类2
/*
* 匿名内部类:
* 1,匿名内部类其实就是内部类的简写格式
* 2,定义匿名内部类的前提:
* 内部类必须是继承一个类或者实现接口
* 3,匿名内部类的格式(new父类或者接口(){定义子类的内容})
* 4,其实匿名内部类就是一个匿名子类对象。而且这个对象有点胖。可以理解为带内容的对象
* (注意:匿名类:是把定义类,调用对象封装为一体的表现形式)
* 5,匿名内部类中定义的方法最好不要超过3个
*
*/
abstract class Demo
{
abstract void show();
}
class OutOne
{
int x = 3;
/*
class Nei extends Demo
{
void show()
{
System.out.println("内部类:"+x);
}
}
*/
public void function()
{
//new Nei().show();
//上面绿色代码的简写方式:简称匿名内部类
//因为没有类名,所以调用父类的类名,然后将父类的方法赋写,最后调用父类的方法体.show
new Demo()
{
void show()
{
System.out.println("x==="+x);
}
void abc()
{
System.out.println("xbs");
}
}.abc();
}
}
public class _03_匿名内部类 {
public static void main(String[]args)
{
new OutOne().function();
}
}
---------------------- 黑马程序员 Android培训、期待与您交流! ----------------------