Java 从子类调用方法

Java 从子类调用方法,java,Java,在Start类中,我定义了两个对象并将信息作为参数传递给这些对象构造函数,然后在Person类中创建两个实例变量并在构造函数中实例化这两个变量。为什么我不能从类A调用getName()方法?如何从class A()调用getName()方法 公共类启动{ 公共静态void main(字符串[]args){ A对象A=新的A(“约翰”); B objectB=新的B(24); 人员a=新人员(对象a、对象B); a、 getAge(); } } 公共阶层人士{ A aa; B-bb; 人(A a

在Start类中,我定义了两个对象并将信息作为参数传递给这些对象构造函数,然后在Person类中创建两个实例变量并在构造函数中实例化这两个变量。为什么我不能从
类A
调用
getName()
方法?如何从
class A()
调用
getName()
方法

公共类启动{
公共静态void main(字符串[]args){
A对象A=新的A(“约翰”);
B objectB=新的B(24);
人员a=新人员(对象a、对象B);
a、 getAge();
} 
}
公共阶层人士{
A aa;
B-bb;
人(A aa,B bb){
这个。aa=aa;
这个.bb=bb;
}
公众假期{
System.out.println(this.aa.getClass().getName());
System.out.println(this.bb.getClass().getName());
System.out.println(this.aa.getName());
}
}
公共A类{
公共字符串名称;
公用A(字符串名称){
this.name=名称;
}
字符串getName(){
返回此.name;
}
}
您可以简单地执行此操作

A a=new A();
String name=a.getName();

问题是,您已经使用默认访问权限声明了
getName
函数,即包私有,只要使用
public
修饰符在
class A
中声明函数,以防这些类位于不同的包中

public String getName()

您已经创建了一个由两种类型a、B参数化的泛型类Person。它们只是“占位符”,与您的类a、B没有任何共同之处。请从Person类中删除这些类型,它应该可以工作。这意味着你必须这样定义一个人:

public class Person {
//the rest of you code here
}

顺便说一句:您应该在这里得到一个编译器警告,“类型参数a正在隐藏类a”。

如果类
Person
和类
a
在不同的包中,您需要将getName()方法公开。它当前具有默认访问权限(包访问)。因此,它是不可见的,并且显示未定义的

public String getName() {
    return this.name;
}

无需更改方法的访问修饰符,因为您将导入类A。

这是因为Person类不知道类
A
B
。您已经为类
Person
指定了泛型类型参数-此处
a
B
并不表示a类或B类,它们是“变量名”为a和B的其他类类型的占位符。 当你说 A aa; B-bb; 在类中,这意味着A和B将替换为在三角括号中创建类的对象时指定的类型。因为java是强类型语言,所以它应该保证无论您以后指定什么类型的代码都可以工作。它失败了,因为它不能保证以后指定为参数-A的任何类型都将具有getName()方法。您可以保证只允许传递属于a类子类的类型参数: 公共阶层人士{ T aa; U-bb; 人员(T aa、U bb){ 这个。aa=aa; 这个.bb=bb;
}

错误是什么?getName()方法是否不可见?类型A的方法getName()未定义
public String getName() {
    return this.name;
}
class A {
public String name;
A(String name) {
    this.name = name;
}
 String getName() {
    return this.name;
}
}

class B {
public int num;
public B(int a ) {
    this.num = a;
}
int getNum() {
    return this.num;
}
}

public class Start {

    public static void main(String[] args) {
        A objectA = new A("John");
        B objectB = new B(24);
        Person a = new Person(objectA, objectB);
        a.getAge();

    } 
}

**class Person{**
A aa;
B bb;
Person(A aa, B bb) {
    this.aa = aa;
    this.bb = bb;
}
public void getAge() {
    System.out.println(this.aa.getClass().getName());
    System.out.println(this.bb.getClass().getName());

    System.out.println(this.aa.getName());

}
}