JAVA C# C/C++之比教学:访问控制机制

本文详细介绍了Java中public、protected、private等权限修饰符的作用范围及使用规则,并对比了C#与C++中的访问控制机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

、java

java中表示权限的关键字分别为public,protected,private。没有friendly这个,什么都不写的话也是一种不同的权限表示。

class Mall
{
    public String mallName;
}


class SuperMarket extends Mall
{
    public void Show(){
        System.out.println("THIS IS A SUPERMAKET:");
        System.out.println(mallName);
    }
}

public class helloworld
{

    public static void main(String args[])
    {

        SuperMarket superMarket = new SuperMarket();
        superMarket.mallName = "Gao";
        superMarket.Show();

    }
}

简单来讲:
public的成员可以被本类,本包,子类,子类,外部包访问
protected的成员可以被本类,本包,子类访问,但是不能被外部包访问
default的成员可以被本类,本包访问.这里所谓的本包,并不包括子包哦。
private只可以被本类访问。

java的文件可以由很多个顶级类,作用位置只可能有两种,要么是所有位置(public),要么是本包中(default)。但是,一个文件只能有一个同名的有public修饰的外部类。其他的外部类由default修饰。
main函数必须使用public static修饰。

外部类内部可以包含内部类,内部类可以采用四种修饰方式,内部类的相关说明在java专题下。
最后当然是继承的问题:
private当然不可继承也不可见。
其他继承后权限不变。子类可以重写父类的方法,但是不能降低(这里指更严格)其权限。
如果重写后,父类方法被隐藏,但是可以通过super来调用。

public class TestClass {
    public static void main(String[] args){
        ChildClass a = new ChildClass();
        a.SAY();
        a.SAYFATHER();
        FatherClass b =(FatherClass)a;
        b.SAY();

    }

}

class ChildClass extends FatherClass{
    /*
     //下面两种写法是错误的
    private void SAY(){
        System.out.println("this is PRIVATE in Son");
    }

    protected void SAY(){
        System.out.println("this is PROTECTED in Son");
    }
    */
    public void SAY(){
        System.out.println("this is PUBLIC in Son");
    }
    public void SAYFATHER(){
        super.SAY();
    }
}

如果子类没有重写父类的方法的话,那么权限机制和父类是一样的。除了修饰符不变外,相对关系也必须按照父类来的。这样做的理由很简单,里氏替换原则。确保了任何指向父类对象的引用能用的场合,指向子类对象的引用也可以使用。当然这是在不考虑你重写的条件下。我们在OO设计思想中提过,任何子类的方法“应该”比父类的输入要求更严格,返回要求更宽松,保证子类对象可以替换父类对象。当然,这个不是必须的。

3、C#
C#中的访问控制机制的修饰符有public,private ,protected,internal
其中,可以修饰类的只有protected和internal。无论是类还是类的成员,如果不写修饰符默认为internal
这里写图片描述
在上图中可以看到,private只能在类的内部访问,protected只能在本类和子类中访问,internal可以被本程序集内访问,public可以在任何地方访问。protected internal是protected or internal的意思。

对于类来说,public表示任何地方都可以访问到,internal表示只有在相同程序集内才能访问到。这里所谓的相同程序集是指不同的project下的程序,而非是不同的命名空间。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {


            Console.WriteLine("hello,world");


            OtherNameSpace.A a  = new OtherNameSpace.A();//在同一个程序集不同命名空间internal也可以访问
            ConsoleApplication2.B b = new ConsoleApplication2.B();//B所在的程序是由另一个项目产生的,class B必须是public才能访问,也就是说需要在VS中新建程序后添加引用。

            Console.ReadLine();


        }
    }
}
namespace OtherNameSpace
{
    internal class A
    {
        public A()
        {
            Console.WriteLine("here is A");
        }
    }
}

3、C++
C++的访问控制符有三个,private,protected,public

private只能由本类内进行访问
protected只能由本类和子类进行访问
public可以在任何地方进行访问

在继承的时候,private属性不能被继承
如果使用public继承,那么,成员的属性不发生改变
如果使用protected继承,那么,父类的public和protected到子类中都变成了protected
如果使用private继承,那么,父类的public和protected到子类中都变成了private

相比之下,java和c#都只存在public的继承。

除此之外,c++中还有friend关键字,可以用于定义友元函数和友元类。友元函数是指不包含在任何类中可以访问类中的任何成员。友元类破坏了类的封装性和隐藏性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值