Java访问修饰符以及调用哪些方法
因此,我有以下两种情况: 案例1:Java访问修饰符以及调用哪些方法,java,inheritance,this,super,access-modifiers,Java,Inheritance,This,Super,Access Modifiers,因此,我有以下两种情况: 案例1: public class Person { private String name = "Person"; private String getName() { return name; } public void printName() { System.out.println( getName() ); } } public class Student extends Person { pri
public class Person {
private String name = "Person";
private String getName() {
return name;
}
public void printName() {
System.out.println( getName() );
}
}
public class Student extends Person {
private double gpa = 0;
private String getName() {
return “Student”;
}
}
public class Driver {
public static void main(String[] args){
Person p = new Person();
Student s = new Student();
p.printName(); // “Person”
s.printName(); // “Person”
}
}
public class Person {
private String name = "Person";
public String getName() {
return name;
}
public void printName() {
System.out.println( getName() );
}
}
public class Student extends Person {
private double gpa = 0;
public String getName() {
return “Student”;
}
}
public class Driver {
public static void main(String[] args){
Person p = new Person();
Student s = new Student();
p.printName(); // “Person”
s.printName(); // “Student”
}
}
案例2:
public class Person {
private String name = "Person";
private String getName() {
return name;
}
public void printName() {
System.out.println( getName() );
}
}
public class Student extends Person {
private double gpa = 0;
private String getName() {
return “Student”;
}
}
public class Driver {
public static void main(String[] args){
Person p = new Person();
Student s = new Student();
p.printName(); // “Person”
s.printName(); // “Person”
}
}
public class Person {
private String name = "Person";
public String getName() {
return name;
}
public void printName() {
System.out.println( getName() );
}
}
public class Student extends Person {
private double gpa = 0;
public String getName() {
return “Student”;
}
}
public class Driver {
public static void main(String[] args){
Person p = new Person();
Student s = new Student();
p.printName(); // “Person”
s.printName(); // “Student”
}
}
案例2最有意义(它是预期的行为)
但是为什么案例1的输出与案例2不同(“人”而不是“学生”)
据我所知,非静态调用隐式地使用this
。因此,this
和super
不要“粘住”。因此,对于第一种情况,getName()
应该使用Student
的实现,因为这个引用Student
实例(不管访问修饰符如何)。但事实似乎并非如此
提前谢谢 在每种情况下Person.printName()
调用getName()
在案例1
中,唯一可见的版本是Person.getName()
,因此对Person
和Student
都调用该版本
在案例2中,Student.getName()
覆盖Person.getName()
,因此调用前者
因此,应用于getName()
的不同可见性会影响结果。当它是公共的
(或受保护的
)时,它可能会被覆盖,调用的方法将取决于对象。当它是private
时,就没有过度使用,并且总是调用Person.getName()
。对于案例1,Student#getName
不重写Person#getName
,因为这些方法是private
,这意味着其他类无法访问它们。因为Student#getName
隐式覆盖了Person#getName
(因为两者现在都是public
),所以案例2中打印了Student
。我也在尝试学习Java。这些也可以设置为受保护且仍然有效吗?@DanielZuzevich绝对可以!只要子类能够从其父类重写该方法,那么子类将调用其getName
。注意Java中的public
对象方法也是有用的。因此,案例2的工作方式为何如此;C++/C中的情况并非如此,它需要Person
的getName
上的virtual
关键字以这种方式工作。