Scala 访问修饰符

本文详细介绍了Scala中的访问修饰符,包括private、protected和public,并通过示例对比了Scala与Java在访问控制上的区别。

Scala 访问修饰符

1、介绍

Scala 访问修饰符和Java的基本一样,分别有:private,protected,public。

如果没有指定访问修饰符,默认情况下,Scala 对象的访问级别都是 public

Scala 中的 private 限定符,比 Java 更严格,在嵌套类情况下,外层类甚至不能访问被嵌套类的私有成员

2、私有(Private)

用 private 关键字修饰,带有此标记的成员仅在包含了成员定义的类或对象内部可见,同样的规则还适用内部类。

class Outer{
    class Inner{
        private def func(){
            println("func")
        }
        class DeepInner{
            func() // 正确,因为这个访问包含在 Inner 类之内
        }
    }
    (new Inner).func() //错误,因为 f 在 Inner 中被声明为 private,而访问不在类 Inner 之内
}

Java中允许这两种访问,因为它允许外部类访问内部类的私有成员。

3、保护(Protected)

在 Scala 中,对保护(Protected)成员的访问比 java 更严格一些。因为它只允许保护成员在定义了该成员的的类的子类中被访问。而在java中,用protected关键字修饰的成员,除了定义了该成员的类的子类可以访问,同一个包里的其他类也可以进行访问。

package com.itwuyi{
    class Super{

        protected def func() {
            println("func")
        }

    }

   class Sub extends Super{

         func()//正确

    }

    class Demo{

        (new Super).func() //错误

    }
}

上例中,Sub 类对 func 的访问没有问题,因为 func 在 Super 中被声明为 protected,而 Sub 是 Super 的子类。相反,Demo 对 func 的访问不被允许,因为 Demo 没有继承自 Super。而后者在 java 里同样被认可,因为 Demo 与 Sub 在同一包里。

4、公共(Public)

Scala 中,如果没有指定任何的修饰符,则默认为 public。这样的成员在任何地方都可以被访问。

class Outer {
   class Inner {
      def func() { 
        println("func") 
      }
      class DeepInner {
         func() // 正确
      }
   }
   (new Inner).func() // 正确,因为 func() 是 public
}

5、作用域保护

Scala中,访问修饰符可以通过使用限定词强调。格式为:

这里的x指代某个所属的包、类或单例对象。如果写成private[a],读作"这个成员除了对[…]中的类或[…]中的包中的类及它们的伴生对像可见外,对其它所有类都是private。

private[a] 

或 

protected[b]
package bigpackage{
    package middleDemo{
			private[bigpackage] class smallDemo{
				protected[middleDemo] def useStarChart(){}
				class Distance{
					private[smallDemo] val distance = 8000
				}
				private[this] var speed = 300
			}
        }
        package demo{
			import middleDemo._
			object Fish{
				private[demo] val swim = new smallDemo
			}
		}
}

上述例子中,类 smallDemo 被标记为 private[bigpackage] 就是说这个类对包含在 bigpackage 包里的所有的类和对象可见。比如说,从 Fish 对象里对 smallDemo 的访问是被允许的,因为对象 Fish 包含在包 demo 中,而 demo 包在 bigpackage 中,相反,所有在包 bigpackage 之外的代码都不能访问类 smallDemo。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值