java继承 在子类中声明同名变量的问题???

如下代码:

 class Person {
String name;
int age;

public void introduce(){
System.out.println("姓名是" + name + ",年龄是" + age);
}
}

public class Students extends Person{
//  String name;

public static void main(String[] args) {
Students students = new Students();
students.name = "小明";
students.age = 24;
students.introduce();
}
}

这段代码执行结果打印 姓名是小明,年龄是24
但是把那行注释语句加上的话 打印结果是姓名是null,年龄是24
为什么呢?
貌似有继承中变量的覆盖或者说是隐藏的问题,不是很理解,求助了。

如果父类和子类存在同名变量,这两个同名变量会同时存在,成员变量不存在多态。也就是这两个同名变量,访问这个成员变量的是哪个类,就访问的是哪个类的变量。
比如Person.name就是访问person的,students.name就是访问students

你好,谢谢你的回答。想问一下,
同样是调用父类的introduce()方法,在声明同名变量name之前,访问到的是子类变量的值(如上,打印出的是"小明")
而在声明了同名变量后,调用introduce()方法,咋访问到的是父类的变量值呢( 如上,打印出的是null)

class Person{
private String name;
private int age;
Person(String name, int age){
this.name = name;
this.age = age;
}
public void introduce(){
System.out.println("姓名是" + name + ",年龄是" + age);
}

}

public class Students extends Person {
public static void main(String[] args){
Students students = new Person("小明",24);
students.introduce();
}
}

哎呀,好像明白了一些。原来没有同名变量之前,操作的都是父类的变量呀。
我原本对继承的理解是,如果继承了父类的变量,那么子类对象中,也会有自己独立的与父类相同的变量。也就是说,实例化一个子类,会生成父类和子类两个对象,而他们拥有的变量也是一样的。
按你的说法就是,如果实例化子类,会生成两个父类子类两个对象,但如果没有同名变量的情况下,其实只有父类对象中有变量的,子类对象中啥都没有。
是这个意思吗,不好意思,语文不好,话说的绕了些。。

注释行放开后,只要关注下打印时是在父类打印的因此name为空。有个选择叫最近选择,具体是哪个变量哪个离得近就是了。