黑马程序员——内部类及其应用
-------android培训、java培训、期待与您交流! ----------
内部类:
概念:将一个类定义在另一个类的里面,将里面那个类成为内部类。
访问规则:
(1) 内部类可以直接访问外部类中的成员,包括私有;
(2) 外部类要访问内部类,必须建立内部类对象。
注意:内部类之所以可以直接访问外部类中的成员是因为内部类中持有了一个外部类的引用,格式为:外部类名.this。
访问格式:
(1) 当内部类定义在外部类的成员位置上,而且非私有,可以再外部其他类中直接建立内部类对象。格式如下:
外部类名.内部类名变量名=外部类对象.内部类对象;
Outer.Innerin=new Outer().new Inner();
(2) 当内部类在成员位置上,就可以被成员修饰符所修饰。如被private、static修饰。当内部类被static修饰后,只能直接访问外部类中的static成员,出现了访问局限。
在外部其他类中,直接访问静态内部类中非静态成员:
newOuter.Inner().function();
在外部其他类中,直接访问静态内部类中的静态成员
Outer.Inner.function();
注意:当内部类定义了静态成员,该内部类也必须是静态的。
当外部类中的静态方法访问内部类时,内部类也必须是静态的。
定义规则:
(1) 当描述事物时,事物的内部还有事物,该事物用内部类来描述。因为内部事物在使用外部事物的内容。
(2) 当内部类定义在局部时:
不可以被成员修饰符所修饰;
可以直接访问外部类中的成员,因为还持有外部类中的引用;但是不可以访问它所在的局部中的变量,只能访问被final修饰的局部变量。
使用内部类来构建链表数据结构:
/*
链表数据结构
*/
//链表节点管理类
class NodeManager
{
//内部维护者一个根节点
privateNode root;
//添加节点
publicvoid addNode(String name)
{
//如果根节点为空,就添加到根节点
if(root==null)
root=newNode(name);
//否则调用节点的添加方法
else
root.add(name);
}
//删除节点
publicvoid delNode(String name)
{
//从根节点开始一次进行判断
if(root!=null)
{
if(root.name.equals(name))
//用后一节点覆盖掉前一节点
root=root.next;
else
root.del(name);
}
}
//打印所有节点
publicvoid printNode()
{
if(root!=null)
{
System.out.print(root.name);
root.print();
System.out.println();
}
}
//定义一个节点内部类
classNode
{
//节点名称
privateString name;
//下一节点
privateNode next;
publicNode(String name)
{
this.name=name;
}
//添加节点
publicvoid add(String name)
{
if(this.next==null)
this.next=newNode(name);
else
//递归调用
this.next.add(name);
}
//删除节点
publicvoid del(Stringname)
{
if(this.next!=null)
{
if(this.next.name.equals(name))
//用当前节点的下一个节点覆盖掉当前节点
this.next=this.next.next;
else
//递归调用
this.next.del(name);
}
}
//打印所有节点
publicvoid print()
{
if(this.next!=null)
{
System.out.print("---->"+this.next.name);
//递归调用
this.next.print();
}
}
}
}
class LinkList
{
publicstatic void main(String[] args)
{
//创建节点管理类对象
NodeManagernm=new NodeManager();
//添加节点
nm.addNode("节点1");
nm.addNode("节点2");
nm.addNode("节点3");
nm.addNode("节点4");
nm.addNode("节点5");
nm.addNode("节点6");
nm.addNode("节点7");
//打印节点
nm.printNode();
//删除节点
nm.delNode("节点4");
nm.printNode();
}
}
运行结果: