Java—访问修饰符

访问修饰符:用来修饰被访问的类、属性、方法

访问修饰符 作用域 能被修饰
public 任何位置 类、属性、方法
protected 继承的关系都是可以访问 属性和方法
缺省(没有修饰) 同一个包中 类、属性、方法
private 类中 属性和方法

在这里插入图片描述
bean.User类:

package com.cao.test.word1.bean;

public class User {
    
    
    public String name = "cao";

    public void show() {
    
    
        System.out.println("show()...");
    }

}

Test类:

package com.cao.test.word1;

import com.cao.test.word1.bean.User;

public class Test {
    
    
    public static void main(String[] args) {
    
    
        User user = new User();
        System.out.println(user.name);
        user.show();
    }
}

正常执行

cao
show()...

如果把bean.User类的public去掉,即:

class User {
    
    
    public String name = "cao";

    public void show() {
    
    
        System.out.println("show()...");
    }

}

此时Test将报错,因为缺省修饰+不同包

同理,将成员变量和成员方法的public去掉,即:

public class User {
    
    
    String name = "cao";

    void show() {
    
    
        System.out.println("show()...");
    }

}

Test也会报错,因为缺省修饰+不同包


若新建一工程,结构如下所示:
在这里插入图片描述
Father类:成员变量用protected修饰

public class Father {
    
    
    protected String name="cao";

}

Son类继承Father类:

public class Son extends Father {
    
    
    public void show(){
    
    
       System.out.println(name);
    }
}

Test:

public class Test {
    
    
    public static void main(String[] args) {
    
    
        Son son = new Son();
        son.show();
    }
}

执行:

cao

因为成员变量用protected修饰+Son类继承Father类

在bean包下新建一类Test:
bean.Test类:

public class Test {
    
    
    public static void main(String[] args) {
    
    
        Father father=new Father();
        System.out.println(father.name);
    }
}

把Father类中成员变量的protected去掉,即:

public class Father {
    
    
    String name="cao";

}

为缺省修饰
此时Son类报错,但是bean.Test不报错,因为bean.Test与Father同包。

把Father类中成员变量的protected改为private,即:

public class Father {
    
    
    private String name="cao";

}

此时Son类报错,但是bean.Test也报错,因为private修饰使成员变量只能在类中被访问。

把Father类中成员变量的protected改为public,即:

public class Father {
    
    
    public String name="cao";

}

此时即使Son不是Father的子类,也可以正常访问:
Son类:

public class Son {
    
    
    public void show() {
    
    
        Father father = new Father();
        System.out.println(father.name);
    }
}

通过Test类的main函数执行:

cao

访问修饰符在方法重写的时候,父类的访问作用域小于等于子类的访问作用域
Father类:

public abstract class Father {
    
    
    abstract void show();
}

Son类:

public class Son extends Father{
    
    
    @Override
    void show() {
    
    
        System.out.println("show()...");
    }
}

Test类:

public class Test {
    
    
    public static void main(String[] args) {
    
    
        Son son=new Son();
        son.show();
    }
}
show()...

若Son类show()方法改为public修饰:

public class Son extends Father{
    
    
    @Override
    public void show() {
    
    
        System.out.println("show()...");
    }
}

运行正常
改为protected:

public class Son extends Father{
    
    
    @Override
    protected void show() {
    
    
        System.out.println("show()...");
    }
}

运行正常
若改为private:

public class Son extends Father{
    
    
    @Override
    private void show() {
    
    
        System.out.println("show()...");
    }
}

报错

猜你喜欢

转载自blog.csdn.net/qq_44371305/article/details/113340223