Scala 访问修饰符

33 篇文章 1 订阅
26 篇文章 0 订阅

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值