/**
* 问题:java学习之---------->java的内部类
* 首先什么叫内部类:所谓的内部类就是在一个类的内部再定义一个类
* 这个类就叫做内部类
* 内部类与类的成员一样有static类、private/public类
* 还有两种一个是局部内部类、匿名内部类
* 它们之间的差别只要在于与主类之间的访问方式及权限的问题
* 比如成员内部类---->既可以访问主类的成员,切主类也能访问它的成员
* ------------------------------------------------------------------>
* 同时它们之间可以互相访问的原因也随带了解下:
* 首先就是:内部类可以访问外部类的原因,是因为在内部类生成的时候系统会给内部类一个
* 主类的this指针,从而导致内部类可以访问主类的成员
* 但是主类可以访问内部类的实现就有些不同了-------->因为this指针是随着对象的产生而出现的
* 而在主类生成的时候,并没有内部类的对象,所以实际上外部类在访问内部类的成员的时候还要new一个内部类的对象再通过对象去访问内部类的成员
* 此时就是真正体现主类可以访问内部类的解释了------------->所谓的主类可以访问内部类
* 就是指在主类中new出一个内部类的对象之后,不管内部类中的成员是private还是protected都可以调用
* ------------------------------------------------------------------>
* 好了,基本的原理懂了之后,再来介绍另一种内部类--->局部内部类
* 顾名思义----所谓的局部自然和局部变量一样,通常是在一个函数体中定义的类/变量
* 局部内部类依旧可以访问外部类的成员------原因依旧如上
* 但是局部内部类在出了局部的范围之后,就是不可见的了,更不用说外部类还能访问内部类了
* ------------------------------------------------------------------------------------------------>
* 在往下走就到了static静态内部类了-------------->和静态变量及方法一样,静态的东西都可以剥夺主体而单独的存在
* 因为它们的创建时间比主类还要早,这也导致了一个严重的问题---->在静态类的内部没有隐含的主类的this指针
* 这也直接导致static不能访问主类的成员
* 但是主类是可以访问静态类的---------->原因自然不言而喻了
* 补充:如果局部静态类------>那么在双方都互相屏蔽了
* ------------------------------------------------------------------------------------------>
* 再往下走就到了我们的关键了---->也是四大内部类的最后一个了-->匿名内部类
* 首先既然叫匿名------->那么这个类自然是没有名字的了,那么它是如何定义的呢?
* 请看如下的代码:
* new 父接口()
* {
* //匿名内部类的实现部分
* }
* 参考资料的解释:
* 定义:父接口的匿名的内部的子类对象
* 当一个函数的参数是一个接口时,可以使用匿名内部类来实现这个接口来作为它的参数
* 匿名内部类最后被lambda表达式给代替了---------------->lambda表达式更加简洁
* 接口需要一个实现类来实现它---------->当我们new 父接口的时候就相当与创建了一个没有名字的类一样
* 而这个类就叫做匿名内部类-------------------->*******
* 结束了-----
* ------------------------------------------------------------------>
* 下面贴上前面的一部分实现代码
*class Solution {
private int num=0;
private static class node
{
protected int val;
private node left;
private node right;
public int getVal()
{
return this.val;
}
public node(int val)
{
this.val=val;
}
}
public void print()
{
node space=new node(99);
System.out.println(space.getVal());
}
public Solution(int num)
{
node space=new node(99);
this.num=num;
}
}
*/
再此最后再插入一段对内部类运用的简单的例子吧!就以创建二叉树为例子
class Tree
{
private node root;
private class node
{
private int val;
private node left;
private node right;
public node(int val)
{
this.val=val;
}
public void getNode(int val)
{
if(val<this.val)
{
if(this.left==null)
this.left=new node(val);
else
this.left.getNode(val);
}
else
{
if(this.right==null)
this.right=new node(val);
else
this.right.getNode(val);
}
}
public void showNode()
{
if(this.left!=null)
this.left.showNode();
System.out.print(this.val);
if(this.right!=null)
this.right.showNode();
}
}
public void get(int val)
{
if(root==null)
root=new node(val);
else
{
root.getNode(val);
}
}
public void show()
{
if(root!=null)
{
root.showNode();
}
}
}