、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关键字,可以用于定义友元函数和友元类。友元函数是指不包含在任何类中可以访问类中的任何成员。友元类破坏了类的封装性和隐藏性。