java类对于public的一个误区

本文通过一个简单的Java继承案例,展示了当子类重写父类方法时,调用机制的具体表现。通过对代码片段的分析,揭示了Java中方法调用遵循动态绑定原则的特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在看spring的源码,发现了一些以前理解深度不足的问题,在线面贴两段代码

 public class Animal {
public void say(){
toSay();
}
public void toSay(){
System.out.println("animalSay");
}
}


public class Person extends Animal {
public void toSay(){
System.out.println("personSay");
}
}



public class TestPublic {
public static void main(String[] args) {
Person p=new Person();
p.say();
}
}



上述运行的结果是什么呢?以前一直认为在控制台打印的是animalSay,真正运行后发现是personSay



<think>嗯,用户想了解Java基础知识中调用一个的步骤。首先,我需要回忆Java的基本概念。调用一个可能涉及多个方面,比如实例化对象、调用静态方法或访问静态变量。用户可能是刚学Java的新手,所以需要从基础讲起,步骤要清晰,避免用太专业的术语。 首先,应该解释如何创建一个,因为调用前必须存在。然后,可能需要分情况讨论:调用静态成员和实例成员的区别。用户可能混淆这两者,所以需要明确区分。静态方法可以直接通过名调用,而实例方法需要先创建对象。 接下来,要考虑构造方法的作用。实例化对象需要使用new关键字和构造方法。这里需要举例说明,比如定义一个Person,然后创建Person对象。这样用户能更直观地理解。 然后,调用方法的步骤:对象.方法名()。同时,静态变量和方法的调用方式,比如Math的方法。可能还需要提到访问修饰符,比如public,否则无法访问,但用户问题可能默认使用public,所以暂时可以不深入,除非有必要。 另外,异常处理可能不是用户当前的问题,但如果有潜在错误,比如不存在或者权限问题,可能需要简单提及,但保持回答简洁。用户可能更关注正常流程,而不是错误情况。 用户可能对加载机制不太清楚,但作为基础知识,可能不需要深入JVM的加载过程,只需说明使用时的步骤。需要检查步骤是否遗漏关键点,比如导入包、的路径等。比如,如果在不同的包中,需要使用import语句,这也是调用的前提条件之一。 结构方面,按步骤分点,每个步骤给出示例代码,用$$包裹独立代码块,行内代码用$。例如,定义、创建对象、调用方法。确保LaTeX格式正确,比如代码块用$$,行内代码用$符号。 可能还需要提醒用户注意名和文件名的关系,但这个问题可能属于定义的基础,不是调用步骤的一部分。所以可能不需要涉及,除非用户的问题隐含了这一点。 最后,总结步骤,确保用户能按顺序理解:定义→实例化(或静态调用)→调用成员。需要确认每个步骤的解释是否准确,示例是否正确,比如构造方法的参数是否匹配,避免示例中出现错误。 可能的误区是用户认为调用就是直接使用名,而实际上实例方法需要对象。所以需要强调静态和实例的区别,这是关键点。同时,导入包的部分如果用户在同一个包中可能不需要,但如果是不同包则需要import,这也是基础知识点,应该包含在步骤中。 综上所述,整理步骤为:1. 定义;2. 导入(如果需要);3. 实例化对象或直接调用静态成员;4. 访问成员。每个步骤配以示例代码,用正确格式,并解释注意事项,如访问权限、静态与非静态的区别。</think>调用Java的步骤可分为以下几个阶段,以下按执行顺序详细说明: $$示例代码结构$$ public class Person { //步骤1:定义 //静态成员 public static String species = "人"; //实例成员 private String name; //构造方法 public Person(String name) { this.name = name; } //实例方法 public void speak() { System.out.println("我是" + this.name); } //静态方法 public static void printSpecies() { System.out.println("物种:" + species); } } $$ **步骤1:的定义** - 必须存在已定义的(如上述$Person$) - 包含成员变量、方法等组件 - 注意访问修饰符(public/protected/private)控制可见性 **步骤2:加载(系统自动完成)** - JVM首次使用时自动加载 - 加载.class文件到内存 - 静态代码块在此阶段执行 **步骤3:访问静态成员(可选)** - 通过$名.成员名$直接访问 ```java //调用静态变量 System.out.println(Person.species); //调用静态方法 Person.printSpecies(); ``` **步骤4:实例化对象(访问实例成员的前提)** - 使用$new$关键字+构造方法 - 内存中创建对象实例 ```java //创建对象 Person zhangsan = new Person("张三"); //错误示例:未实例化直接访问实例成员 //zhangsan.speak(); //此处会报NullPointerException ``` **步骤5:访问实例成员** - 通过$对象.成员名$访问 ```java zhangsan.speak(); //正确调用已实例化的对象方法 ``` **关键注意事项**: 1. **静态/实例区别**: - 静态成员属于($\uparrow$ 级别) - 实例成员属于对象($\uparrow$ 对象级别) 2. **空指针异常防护**: ```java //安全调用方式 if(zhangsan != null) { zhangsan.speak(); } ``` 3. **包导入规则**: - 同包直接使用 - 不同包需要$import$声明 ```java import com.example.Person; //跨包使用时需要 ``` **完整调用示例**: ```java public class Main { public static void main(String[] args) { //调用静态方法 Person.printSpecies(); //实例化对象 Person lisi = new Person("李四"); //调用实例方法 lisi.speak(); } } ``` **执行结果**: ``` 物种:人 我是李四 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值