Java visibility에 대한 간단한 데모 프로그램.
글고, 같은 directory 안에 다른 package를 가진 소스 파일이 둘 이상 있어도 된다는 거 아셨나요? 소스 파일은 같은 directory안에 있어도 돼요.
javac -d out *.java
저렇게 -d <path> flag를 주면 자동으로 class파일은 알맞은 directory에 넣어줍니다.
// ============================================================
// STUDY: This is a simple program about visibility
// ============================================================
package parent;
// =======================================================
// TLDR: members needs to be MORE visible when inherited
// =======================================================
public class Parent {
// only class it self can access it
private void privateMethod() {
System.out.println("I'm private");
}
// only classes with in in the SAME PACAKGE can see it
void packagePrivateMethod() {
System.out.println("I'm package private");
}
// only classes with in in the SAME PACAKGE, and OTHER PACKAGE'S CHILDREN can see it
protected void protectedMethod() {
System.out.println("I'm protected");
}
// anyone can see it
public void publicMethod() {
System.out.println("I'm protected");
}
private String privateName = "private";
String packagePrivateName = "packagePrivate";
protected String protectedName = "protected";
public String publicName = "public";
class innerChild {
innerChild() {
// ================================================
// inner classes are all buddies
// they can all see each others' private members ;)
// ================================================
System.out.println(privateName);
System.out.println(packagePrivateName);
System.out.println(protectedName);
System.out.println(publicName);
}
}
}
class Child extends Parent{
// // 🚫
// Can never override parent's private method
// @Override
// public void privateMethod() {
// System.out.println("I'm private child");
// }
//
// // ✅
// @Override
// public void packagePrivateMethod() {
// System.out.println("I'm package private child");
// }
//
// // ✅
// @Override
// public void protectedMethod() {
// System.out.println("I'm protected child");
// }
//
// // ✅
// @Override
// public void publicMethod() {
// System.out.println("I'm protected child");
// }
// 🚫
// Can never override parent's private method!
// @Override
// protected void privateMethod() {
// System.out.println("I'm private child");
// }
//
// // ✅
// @Override
// protected void packagePrivateMethod() {
// System.out.println("I'm package private child");
// }
//
// // ✅
// @Override
// protected void protectedMethod() {
// System.out.println("I'm protected child");
// }
//
// 🚫
// protected is less visible than public!
// @Override
// protected void publicMethod() {
// System.out.println("I'm protected child");
// }
// 🚫
// Can never override parent's private method!
// @Override
// private void privateMethod() {
// System.out.println("I'm private child");
// }
//
// // 🚫
// @Override
// private void packagePrivateMethod() {
// System.out.println("I'm package private child");
// }
//
// 🚫
// private is less visible than protected!
// @Override
// private void protectedMethod() {
// System.out.println("I'm protected child");
// }
//
// 🚫
// private is less visible than public!
// @Override
// private void publicMethod() {
// System.out.println("I'm protected child");
// }
Child() {
// privateName = "private child"; // 🚫
packagePrivateName = "packagePrivate child";
protectedName = "protected child";
publicName = "public child";
}
}
package childpkg;
import parent.Parent;
class PackageChild extends Parent{
// // 🚫
// Can never override parent's private method
// @Override
// public void privateMethod() {
// System.out.println("I'm private child");
// }
//
// // 🚫
// invisible to childpkg since package private members aren't visible to other packages
// @Override
// public void packagePrivateMethod() {
// System.out.println("I'm package private child");
// }
//
// // ✅
// @Override
// public void protectedMethod() {
// System.out.println("I'm protected child");
// }
//
// // ✅
// @Override
// public void publicMethod() {
// System.out.println("I'm protected child");
// }
// 🚫
// Can never override parent's private method!
// @Override
// protected void privateMethod() {
// System.out.println("I'm private child");
// }
//
// // 🚫
// invisible to childpkg since package private members aren't visible to other packages
// @Override
// protected void packagePrivateMethod() {
// System.out.println("I'm package private child");
// }
//
// // ✅
// @Override
// protected void protectedMethod() {
// System.out.println("I'm protected child");
// }
//
// 🚫
// protected is less visible than public!
// @Override
// protected void publicMethod() {
// System.out.println("I'm protected child");
// }
// 🚫
// Can never override parent's private method!
// @Override
// private void privateMethod() {
// System.out.println("I'm private child");
// }
//
// // 🚫
// @Override
// private void packagePrivateMethod() {
// System.out.println("I'm package private child");
// }
//
// 🚫
// private is less visible than protected!
// @Override
// private void protectedMethod() {
// System.out.println("I'm protected child");
// }
//
// 🚫
// private is less visible than public!
// @Override
// private void publicMethod() {
// System.out.println("I'm protected child");
// }
PackageChild() {
// privateName = "private child"; // 🚫
// packagePrivateName = "packagePrivate child"; // 🚫
protectedName = "protected child";
publicName = "public child";
}
}