fun main() {
val a: AAA = AAA()
val b: AAA = BBB()

b.testA()
}

open class AAA {
       protected open fun testA() {
                   println("AAA임다")
       }
}

class BBB : AAA() {
       public override fun testA() {
                   println("오버라이드 된 a 임다")
       }
}


상속관계 공부중인데 여기서 a.test()가 동작하지 않는 이유는 무엇인가요?


testA()가 그냥 open 클래스(public)이고 BBB 클래스에서 이걸 오버라이드하고


a.test()하면 오버라이드된 testA()가 호출됩니다. (오버라이딩하지 않았을 경우에는 AAA의 testA()가 호출)


그런데 AAA에서 testA()의 접근 지정자를 protected로 하고 BBB에서 접근지정자를 public으로 변경해주면서 오버라이딩하면 왜 호출조차 안되나요?


저는 public으로 오버라이딩 했으므로 호출될줄 알았는데