/** * 问题: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(); } }}
原文地址:https://www.cnblogs.com/z2529827226/p/11794567.html
时间: 2024-09-29 19:24:13