静态static与非静态有关访问的理解

一、先上一段代码: 

package cn.it.staticDemo;

/**
 * @author ligw
 * @description: 静态和非静态
 * @date 2020/2/28 11:18
 */
public class StaticDemo {
    //在外部类定义静态成员和非静态成员
    private static String name = "外部静态私有成员";
    private String num = "外部非静态私有成员";

    //静态内部类可以用 public,protected,private 修饰
    static class Person{

        //静态内部类中可以定义静态或者非静态的成员
        private static String x="内部静态私有成员";
        private String address = "内部非静态私有成员";

        //内部类可以定义公有成员
        public String mail = "内部非静态公有成员";

        public void display(){
            //静态内部类不能访问外部类的非静态成员(包括非静态变量和非静态方法)
            //System.out.println(num);//这是错误的

            //静态内部类能访问外部类的静态成员(包括静态变量和静态方法)
            System.out.println(name);//这是正确的

            //内部类可以访问本内部类成员(静态或者非静态的成员)。
            System.out.println("Inner:" + address+"x:"+x);
        }
    }
    //非静态内部类
   class People{
       // private static String ss;//这是错误的,非静态内部类不能定义静态成员
       public void test(){
           //非静态内部类可以访问外部类成员
           System.out.println(num);
           System.out.println(name);
           //非静态内部类不可以访问外部类的静态内部类成员
           //System.out.println(x);
           //System.out.println(address);
           //System.out.println(mail);
       }
    }

    public void printInfo(){
        System.out.println(name);//可以直接访问外部类的静态成员
        System.out.println(num);//可以直接访问外部类的非静态成员

        //外部类不能直接访问内部类的成员(静态和非静态的成员)
        //System.out.println(mail);//不可以直接访问内部类的公有成员
        //System.out.println(address);//不可以直接访问内部类的非静态成员
        //System.out.println(x);//不可以直接访问内部类的静态成员

        //外部类要访问内部类的成员(静态和非静态的成员),只能通过实例化内部类调用访问
        Person person = new Person();
        person.display();
        System.out.println(person.address);//可以访问内部类的私有成员
        System.out.println(Person.x);// 外部类访问内部类的静态成员:内部类.静态成员
        System.out.println(person.mail);//可以访问内部类的公有成员
    }

    public static void main(String[] args){
        StaticDemo staticDemo = new StaticDemo();
        staticDemo.printInfo();
        //这样调用非静态内部类的方法
        People people=new StaticDemo().new People();
        people.test();
    }
}

 二、上面代码的输出为:

外部静态私有成员
外部非静态私有成员
外部静态私有成员
Inner:内部非静态私有成员x:内部静态私有成员
内部非静态私有成员
内部静态私有成员
内部非静态公有成员
外部非静态私有成员
外部静态私有成员

三、综上所得:

1、静态内部类可以用 public,protected,private 修饰
2、静态内部类不能访问外部类的非静态成员
3、静态内部类能访问外部类的静态成员
4、内部类可以访问本内部类成员
5、外部类可以直接访问外部类的成员
6、外部类不能直接访问内部类的成员
7、外部类要访问内部类的成员(静态和非静态的成员),只能通过实例化内部类调用访问
8、非静态内部类不能定义静态成员
9、非静态内部类可以访问外部类成员
10、非静态内部类不可以访问外部类的静态内部类成员,同时,静态内部类也不可以访问外部类的非静态内部类成员
注意:成员即是变量和方法
 

发布了13 篇原创文章 · 获赞 14 · 访问量 610

猜你喜欢

转载自blog.csdn.net/weixin_40914842/article/details/104561752
今日推荐