PersonStudent-MethodOverriding2
/// Person
class Person {
private static int count = 0; // static (class) field
protected String name; // instance field
protected int age; // instance field
public Person() {
//System.out.println("Person Constructor"); // this("", 0); error: call to this must be first statemenht in constructor
this("", 0);
}
public Person(String name, int age) {
this.name = name;
this.age = age;
count++;
}
public static void printCount() { // static (class) method
System.out.println("Person Count: " + count);
}
public static int getCount() { // static (class) method
return count;
}
public String toString() { // Object.toString() overriding
return "Person Name: " + name + " Age: " + age;
}
public void print() { // instance method
System.out.println("Person Name: " + name + " Age: " + age);
}
}
/// Student
class Student extends Person {
private static int scount = 0; // static (class) variables
protected int id;
public Student() {
this("", 0, 5208);
}
public Student(String name, int age, int id) {
super(name, age);
this.id = id;
scount++;
}
public static void printCount() { // static (class) method overriding
System.out.println("Student Count: " + scount);
}
public String toString() { // Object.toString() overriding
return "Student Name: " + name + " Age: " + age + " ID: " + id;
}
public void print() { // Person.print() method overriding
System.out.println("Student Name: " + name + " Age: " + age + " ID: " + id);
}
}
class PersonStudentTest {
public static void main(String[] args) {
Person p1 = new Student("K", 20, 2018); // upcasting 1번째 Student 객체 생성
p1.print(); // dynamic binding Student Name: K Age: 20 ID: 2018
p1.name = "JAVA";
p1.age = 1;
//p1.id = 2017; // cannnot call id because p1 is Person type
System.out.println(p1); // dynamic binding p1.toString() Student Name: JAVA Age: 1 ID: 1208
p1.printCount(); // p1 is Person, Person.printCount() Person.count=1
Person.printCount(); // Person.printCount() Person.count=1
Student.printCount(); // Student.printCount() Student.scount=1
System.out.println();
Student s1 = (Student)p1; // downcasting
s1.name = "JAVA2";
s1.age = 2;
s1.id = 2017; // can call id, because s1 is Student type
s1.print(); // Student Name: JAVA2 Age: 2 ID: 2017
s1.printCount(); // s1 is Student, Student.printCount() scount=1
Person.printCount(); // Person.printCount() count=1
Student.printCount(); // Student.printCount() scount=1
System.out.println();
Student s2 = new Student("S", 30, 1207); // 2번째 Student 객체 생성
s2.print(); // Student Name: S Age: 30 ID: 1217
s2.printCount(); // s2 is Student, Student.printCount() scount=2
Person.printCount(); // Person.printCount() count=2
Student.printCount(); // Student.printCount() count=2
System.out.println();
Person p2 = new Person("Park", 1); // 1번째 Person 객체 생성
System.out.println(p2); // Person Name: Park Age: 1
p2.printCount(); // p2 is Person, Person.printCount() count=3
Person.printCount(); // Person.printCount() count=3
Student.printCount(); // Student.printCount() scount=2
System.out.println();
Person p3 = new Person(); // 2번째 Person 객체 생성
System.out.println(p3); // Person Name: Age: 0
p3.printCount(); // p3 is Person, Person.printCount() count=4
Person.printCount(); // Person.printCount() count=4
Student.printCount(); // Student.printCount() scount=2
System.out.println();
System.out.println("Number of Person: " + Person.getCount()); // Person.getCount() count=4
}
}