Java子类与父类继承变量疑问及开发者职业咨询
Java继承中变量访问的疑问解答
1. 父类定义正确性
你的父类定义完全正确:
class Superclass { int age = 3; public void printAge() { System.out.println(age); } }
2. 子类是否继承父类的age变量
是可以继承的,父类的age是默认包访问权限,同包下的子类能直接访问该变量,并非你标注的"invisible"。子类无需额外声明,就能通过age访问父类的这个变量。
3. 子类对象调用printAge()的输出结果
判断正确,执行以下代码会输出3:
Subclass obj = new Subclass(); obj.printAge(); // 输出3
子类继承了父类的printAge()方法,该方法访问的是父类自身的age变量。
4. 子类显式声明同名变量后的访问问题
这里有两个错误需要纠正:
- int类型的默认值是
0,不是null(null仅为引用类型的默认值) - 父类的
printAge()方法访问的始终是父类自己的age变量,不受子类同名变量影响。所以执行obj.printAge()依然会输出3,而非null。
子类显式声明同名变量后,父类的age会被隐藏,但仅在子类的上下文(子类方法、构造器)中直接用age才会指向子类变量;父类方法中的age始终指向父类自身的变量。
5. 重写printAge()方法的输出
修正默认值错误后,你的逻辑是对的:
class Subclass extends Superclass { int age; // 默认值为0 public void printAge() { System.out.println(super.age); // 输出3,访问父类的age System.out.println(age); // 输出0,访问子类的age } }
6. 你的理解纠正
核心理解正确,但补充一个关键细节:父类方法中访问的变量始终是父类自身的,和子类是否有同名变量无关。只有在子类的方法、构造器中,直接用age才会优先访问子类变量,此时要访问父类同名变量才需要用super.age区分。
成为优秀Java软件开发者的建议
进阶学习方向
- 深入JVM底层:掌握内存模型、垃圾回收机制、类加载流程、字节码原理,这是理解Java运行机制的核心
- 并发编程:吃透线程池、锁(synchronized、Lock)、并发工具类(CountDownLatch、CyclicBarrier等)、volatile关键字的原理,能解决实际并发场景问题
- 主流框架:重点学习Spring Boot(IOC、AOP核心)、MyBatis,有余力可以啃框架源码,理解设计思想
- 分布式技术:了解微服务架构、RPC框架、消息队列(Kafka/RabbitMQ)、缓存(Redis)、数据库分库分表等,适配大型系统开发需求
- 设计模式:熟练掌握23种经典设计模式,结合业务场景理解何时使用,写出高可维护的代码
代码实践方法
- 刷算法题:从LeetCode简单题入手,重点刷数组、链表、二叉树、动态规划等高频题型,锻炼逻辑思维和代码严谨性
- 做小型项目:比如实现个人博客、在线待办系统,用Spring Boot + MySQL完成,覆盖CRUD操作、接口设计、异常处理等基础场景
- 参与开源项目:在GitHub上找标注"good first issue"的Java项目,提交PR,学习优秀代码规范和团队协作方式
- 写技术总结:把学习中的知识点、踩过的坑写成笔记,强迫自己梳理逻辑,加深记忆
实习准备指导
- 夯实基础:重点复习Java基础(集合框架、IO流、多线程)、SQL语法、数据库索引等高频面试考点
- 刷面经:收集大厂Java实习面试题,整理高频考点的答题思路,比如HashMap的底层实现、Spring IOC的原理等
- 梳理项目经历:把自己做过的项目整理成清晰介绍,能讲清技术选型、核心实现、遇到的问题及解决方法,最好能展示代码或演示效果
- 模拟面试:找同学或同行模拟面试场景,锻炼表达能力,避免面试时紧张忘词
内容的提问来源于stack exchange,提问作者Nahum Auguste
相关产品推荐
相关产品推荐

