网站首页 > java教程 正文
JDK(Java Development Kit )中文名是Java开发工具包。
JDK有两种:一种是JDK成品包,一种是JDK源码包。
JDK成品包:
我们在oracle官网下载的JDK一般都是JDK成品包,它是由oracle公司编译JDK源码之后形成的JDK成品,我们可以直接安装它以此来执行java程序。
JDK源码包:
我们下载的openJDK一般都是JDK源码包,里面放的是JDK的源码,我们要使用它的话必须先进行编译。我们编译的好处就是这个是我们自己的JDK,我们有它的源码可以对其进行我们想要的修改,以此来进行实验。
我们编译jdk的意义:
我们无法直接操作oracle官网下载的JDK因为它是已经编译好的,我们没有它的源码所以无法把我们对它的修改应用到我们的程序上,因为那并不是JDK源码,而JVM执行的是class文件,官网的JDK源码我们没有,所以我们无法编译官网的JDK。这就导致我们如果想修改JDK源码来做实验就只能用属于自己的JDK,这时我们就需要去下载JDK源码,然后可以进行修改或者直接编译,然后把编译后的JDK成品用于我们想要做实验的环境。
比如我们如果想要窥探Java虚拟机内部的实现原理,就可以编译一套自己的JDK,然后跟踪调试我们自己编译的JDK一次来了解Java技术体系的运作。
这里需要注意我们每一次修改JDK源码都需要重新编译,它跟我们手写的java程序是一样的,我们修改的是JDK源码,JVM执行的是class字节码文件,所以想要执行我们的修改内容就需要重新编译。
java中的保护(protected)修饰符的理解
@TOCprotected修饰符给出的大部分定义解释都为protected修饰的成员(下文中的成员统一指代属性和方法),允许同包下的类和不同包的子类访问。 注意这里的异包下的子类访问是指通过继承访问父类中的protected属性或方法(就是子类实例进行访问),而不是直接通过创建父类实例然后访问protected属性或方法。
也就是protected修饰的成员,只可以被同包的类访问。这一点很关键 这句话的意思就是:子类通过继承,可以在自己的类中访问自己的protected成员,但是不能访问异包类(同包的可以访问)的protected成员(即使是自己的超类)。这是为了避免通过派生子类来访问父类受保护的成员。
1.People类(所有测试类可以继承的父类)
package com.tong;
//这是所有测设类的父类
public class People {
private int age;
// 这是用于测试的受保护的属性
protected String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 这是用于测试的受保护的方法
protected void play(){
}
}
2.Teacher类,继承了People类,且和People类在同一个包下
package com.tong;
//这是一个和父类同包下且继承父类的测试类
public class Teacher extends People{
public static void main(String[] args) {
People people = new People();
people.name = "people";
people.play();
Teacher teacher = new Teacher();
teacher.name = "teacher";
teacher.play();
//所有代码都能编译通过,表示同包下子类可以直接通过父类实例访问父类的受保护成员
}
}
3.Cooker类,和People类在同一个包下,但没有继承关系
package com.tong;
//这是一个和父类同包下但没有继承关系的测试类
public class Cooker {
public static void main(String[] args) {
People people = new People();
people.name = "people";
people.play();
Teacher teacher = new Teacher();
teacher.name = "teacher";
teacher.play();
//上面的代码表示同包下哪怕没有继承关系也可以访问同包下的类的受保护属性
Cooker cooker = new Cooker();
cooker.name = "cooker";//编译错误,没有继承父类,所以Cooker类没有name属性
}
}
复制代码
4.Student类,继承了People类,但不合People类在同一个包下
package com.yi;
import com.tong.People;
import com.tong.Teacher;
import com.tong.Cooker;
//这是一个和父类不同包但有继承关系的测试类
public class Student extends People{
public static void main(String[] args) {
People people = new People();
people.name = "people";//编译失败,不能通过父类实例访问受保护属性
people.play();//编译失败,不能通过父类实例访问受保护方法
Teacher teacher = new Teacher();
teacher.name = "teacher";//编译失败.不能访问异包的类的受保护属性
teacher.play();//编译失败.不能访问异包的类的受保护方法
Student student = new Student();
student.name="student";//编译通过
student.play();//编译通过
//上面两行代码编译通过表示异包的子类只可以访问自己的受保护属性,而不可以访问父类的受保护属性和异包下其他继承父类的子类的受保护属性
}
}
这和大部分给出的定义相违背,因为父类中用protected修饰的成员,如果继承这个类的子类与这个类不在同一个包下,那么子类就不能访问父类中用protected修饰符修饰的成员。而是只可以访问自己的受保护成员
也就是子类和父类在不在同一个包中对于父类protected修饰的成员访问权限是不同的。 子类与父类在同一包中:被声明为 protected 的成员能被同一个包中的任何其他类访问; 子类与父类不在同一包中:那么在子类中,子类只可以访问其从父类继承而来的自己的protected成员,而不能访问父类实例以及和父类在同一个包下的其他子类实例的protected成员。
很典型的一个例子就是Object的clone()方法,这个方法只能允许对象克隆自己的对象,而不能克隆Object对象,因为所有对象的clone方法都是继承的Object类的clone方法,但是这个方法是peotected修饰的,它的可见性是Object的所有子类和java.lang包但是异包子类不能直接访问父类的受保护成员
关于protected成员的调用时是否有访问权限的问题 首先要确定出该protected成员出自哪个类这个类在哪个包中,然后才可以得出这个protected成员的可见性范围是什么,然后就可以判断出当前用法是否可行了。
猜你喜欢
- 2025-03-14 Java 性能优化的 50 个细节(珍藏版)
- 2025-03-14 【干货】什么是Java反射,以及Java中为什么需要反射?
- 2025-03-14 小心陷阱!Java中常犯的10个错误(java程序中的错误有哪几种)
- 2025-03-14 Java 类、域与字段:从基础到实践的深度解析
- 2025-03-14 三十四、Java中的final关键字(关于java语言中的final关键字的使用)
- 2025-03-14 Java中的方法重载和方法重写的区别是什么?它们在多态中的作用?
- 2025-03-14 Java 四种访问权限深入解析(java四种访问权限区别)
- 2025-03-14 Java修炼终极指南:38. 从Proxy实例调用默认方法
- 2025-03-14 JAVA面试基础题(java面试基础题及答案整理)
- 2025-03-14 Java基础分享,一篇文章说透Java访问修饰符详解
你 发表评论:
欢迎- 最近发表
-
- 一招解决vscode报java插件版本不一致以及相关缓存引起的问题
- 关于Java 8版本的理解(java中的接口怎么理解)
- Java 9 到 Java 16 的版本演进:一次模块化革命和语言的持续进化
- 如何选择合适的Java版本(如何选择jdk版本)
- 晚会互动小游戏(晚会节目互动小游戏)
- 基于JavaSwing的象棋游戏系统java休闲游戏jsp源代码Mysql
- Java 猜字母游戏!会写会玩才是真本事!
- 基于JavaSwing的贪吃蛇大作战java休闲游戏jsp源代码mysql
- Java & Python 康威生命游戏 - 命令行版
- 高玩随机种子无损速通《我的世界》10分钟不到刷新世界纪录
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)