外部类与内部类的访问

外部类与内部类之间的访问

内部类相当于外部类的一个成员,和其它成员处于同一个级别,因此可以在内部类中直接访问外部类的各个成员(包括私有属性)。
需要注意的是在外部类中要想访问内部类的各个成员(这里也包括内部类的私有属性)就必须先实例化内部类,然后才能访问。对于为什么能访问内部类的私有属性,是因为即使内部类的成员是私有的,但是也是在外部类中,和外部类的其它成员是平等的,只不过被内部类囊括是在内部中,因此访问都必须先实例化。
例如:

class NodeManager{
    private Node root; //根节点
    //public int a = 3; //此处可以直接在内部类中访问,超出外部类要么自己访问,要么通过内部类的方法来访问

    //管理添加节点
    public void addNode(String name){
        if(root!=null){
            root.add(name);
        }else{
            root = new Node(name);
        }
    }

    public void deleteNode(String name){
        if(root.getName().equals(name)){
            root = root.next; //此处即使内部类是私有的,在外部类中也可以通过实例化的对象来访问
        }else{
            root.delete(name);
        }
    }

    //管理打印节点
    public void printNode(){
        if(root != null){
            System.out.print(root.getName());
        }
        root.print();
    }
    /* 此方法适用于在外部类外部实例化外部类让其访问内部类的属性
    public int getInt(){
        return b;
    }
    */

    //内部类,每个节点对象
    class Node{
        private String name; //节点名称
        private Node next; //表示当前节点的下一个节点 //此处的成员属性要么自己访问,要么通过外部类中实例化内部类对象访问,要么在整个类外部通过方法调用来访问

        //构造方法
        public Node(String name){
            this.name = name;
        }
        //获得节点名称
        public String getName(){
            return name;
        }
        //添加节点
        public void add(String name){
            if(this.next != null){
                this.next.add(name);
            }else{
                next = new Node(name);
            }
        }
        //删除节点
        public void delete(String name){
            if(this.next != null){
                if(this.next.getName().equals(name)){
                    this.next = this.next.next;
                }else{
                    this.next.delete(name);
                }
            }
        }
        //打印所有节点
        public void print(){
            if(this.next != null){
                System.out.print("->"+this.next.getName());
                this.next.print();
            }else{
                System.out.println();
            }
        }
        /*此方法可以让在外部类外实例化的内部类对象访问外部类成员属性
        public int getInt2(){
            return a;
        }
        */

    }
}                                        

但是要是在整个类的外部不管是实例化外部类还是实例化内部类也好,都无法访问对方的属性或方法,只能通过自己的方法去调用对方的成员。
实例:

public static void main(String[] args){
    NodeManager nm = new NodeManager();
    nm.addNode("1");
    nm.addNode("2");
    nm.addNode("3");
    nm.addNode("4");
    nm.printNode();

    nm.deleteNode("2");
    nm.printNode();

    nm.deleteNode("1");
    nm.printNode();
    //nm.b; //此处会报错,外部类的实例化对象不能直接是用内部类的属性
    //NodeManager.Node n = nm.new Node("5"); //此处是在外部类外部实例化内部类对象,没有问题,但不推荐使用
    //n.a; //此处会报错,在外部类外部实例化的内部类对象不能直接是用内部类的属性
    //nm.getInt(); //此处是通过外部类的方法访问内部类的属性
    //n.getInt2(); //此处是通过内部类的方法访问外部类的属性
}

原文地址:https://www.cnblogs.com/lhb0268/p/9942385.html

时间: 2024-08-03 01:01:47

外部类与内部类的访问的相关文章

Java的外部类和内部类+静态变量和非静态变量的组合关系

看的李刚<疯狂java讲义>,里面讲内部类的地方感觉有点散而且不全,看完之后还是不十分清楚到底怎么用,于是自己写了个程序测试了一下.看如下代码,即可知道外部类和内部类+静态成员和非静态成员之间的相互调用规则. 运行结果如下: 总结如下: 注意: 当如下出现报错:“无法从静态上下文中引用非静态时”,问题在于非静态方法或者非静态变量所属的类可能没有被实列化.因为要使用非静态方法,必须实例化它所属的类. 例如:将第40行代码改成inter2.StaticInter(); 编译: 原因是StaticI

外部类和内部类的创建调用实例2ge

package com.java1234.chap03.sec06; public class Outer { private int a=1; /* * 定义内部类 * */ class Inner{ public void show(){ System.out.println(a); } } public void show(){ //实例化内部类 Inner inner=new Inner(); inner.show(); } public static void main(String[

“全栈2019”Java第九十二章:外部类与内部类成员覆盖详解

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第九十二章:外部类与内部类成员覆盖详解 下一章 "全栈2019"Java第九十三章:内部类应用场景(迭代器设计模式) 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"

四种监听器(自身类,外部类,内部类,匿名类)

import javax.swing.*; import java.awt.*; import java.awt.event.*; public class ThisClassEvent extends JFrame implements ActionListener{ public ThisClassEvent(){ setLayout(new FlowLayout()); JButton btn=new JButton("ok"); add(btn); btn.addActionL

内部类访问外部类的变量必须是final吗,java静态方法中不能引用非静态变量,静态方法中不能创建内部类的实例

内部类访问外部类的变量必须是final吗? 如下:class A{int i = 3;public void shout(){ class B{public void shout1(){System.out.println(i);} }B b=new B();b.shout1();} public static void main(String [] args){A a=new A();a.shout();} }可正常输出3,证明可以访问类的变量i,但改为下面的方式:class A{public

内部类和外部类的访问细节

public class Outer{ private int outProp=5; class Inner{ public void accessOuterProp(){ //非静态内部类可以直接访问外部类的成员 System.out.println("外部类的outProp值:"+outProp); } } public void accessInnerProp(){ //外部类不嫩直接访问非静态内部类的实例Field //下面代码出现编译错误 //System.out.print

内部类和 外部类相互访问

内部类: ①静态内部类中可以有非静态的方法 ②当内部类中有静态方法或者静态成员变量时,一定是静态内部类 1.外部类访问内部类: 内部类被static修饰:可以直接new Inner in = new Inner(); 内部类没有被static修饰:得先new出来外部类的实例,再new内部类的 Inner in = new Outer().new Inner(); 2.内部类访问外部类:(外部类.this.变量) 3.外部类和内部类中的方法相互访问: ①外部类的静态方法test和非静态内部类的非静

内部类和外部类之间的相互调用

内部类: ①静态内部类中可以有非静态的方法 ②当内部类中有静态方法或者静态成员变量时,一定是静态内部类 一般内部类在外部类的成员变量位置,像这样: 1 public class Outer { 2 class Inner{ 3 4 } 5 } 1.外部类访问内部类: 内部类被static修饰:可以直接new Inner in = new Inner(); 内部类没有被static修饰:得先new出来外部类的实例,再new内部类的 Inner in = new Outer().new Inner(

Java嵌套类,内部类和外部类

1.嵌套类,内部类 嵌套类是指被定义在一个类内部的类: JAVA的嵌套类有很多种类:1.静态成员类:2.非静态成员类:3.匿名类:4.局部类:其中,除了静态成员类之外,其他的都是内部类,因为静态成员类更像是一个独立的类: 但是静态成员类,是外部类内部的一个成员,静态成员类的访问和其他的静态成员一样:1.通过外部类类名调用:2.如果静态成员类定义为私有,那么只能在外部类内部使用        JAVA 内部类可以很好的实现隐藏,并且内部类拥有外围类的所有元素的访问权限,可是实现多重继承,并且可以避