先看看构造函数的加载顺序
-
构造函数
package Loader; class Parent { public Parent() { System.out.println("parent"); } } public class LoadTest extends Parent { public LoadTest() { System.out.println("LoadTest"); } public static void main(String[] args) { new LoadTest(); } }
输出:
parent LoadTest
多级的继承关系按规则逐级向上 找到最上面的开始父类开始构造
package Loader; class root { public root() { System.out.println("root "); } } class Parent extends root{ public Parent() { System.out.println("parent"); } } public class LoadTest extends Parent { public LoadTest() { System.out.println("LoadTest"); } public static void main(String[] args) { Parent parent = new LoadTest(); LoadTest loadTest = new LoadTest(); } }
输出:
root parent LoadTest root parent LoadTest
2 静态块和构造函数
package Loader; class Parent { static{ System.out.println("parent static block"); } public Parent() { System.out.println("parent"); } } public class LoadTest extends Parent { static{ System.out.println("LoadTest static block"); } public LoadTest() { System.out.println("LoadTest"); } public static void main(String[] args) { new LoadTest(); } }
输出:
parent static block LoadTest static block parent LoadTest
3 静态块 块 和构造函数
package Loader; class Parent { static{ System.out.println("parent static block"); } { System.out.println("parent block"); } public Parent() { System.out.println("parent"); } } public class LoadTest extends Parent { static{ System.out.println("LoadTest static block"); } { System.out.println("LoadTest block"); } public LoadTest() { System.out.println("LoadTest"); } public static void main(String[] args) { new LoadTest(); } }
输出:
parent static block LoadTest static block parent block parent LoadTest block LoadTest
结论:
父类静态块
自身静态块
父类块
父类构造器
自身块
自身构造器
2、普通方法和变量
package Loader; class Parent { public String str = "parent"; public void getFir() { System.out.println("Parent getFir"); } public void getSec() { System.out.println("Parent getSec"); } } public class LoadTest extends Parent { public String str = "LoadTest"; public int a = 1; public void getFir() { System.out.println(" LoadTest getFir"); } public void getSec() { System.out.println("LoadTest getSec"); } public void getThd() { System.out.println("LoadTest getthd"); } public static void main(String[] args) { Parent parent = new LoadTest(); LoadTest loadTest = new LoadTest(); System.out.println(parent.str); parent.getFir(); System.out.println(loadTest.str); loadTest.getFir(); // parent.getThd(); //编译错误 loadTest.getThd(); // System.out.println(parent.a); // 编译错误 System.out.println(loadTest.a); } }
输出为:
parent LoadTest getFir LoadTest LoadTest getFir LoadTest getthd 1
父类类型的引用指向子类的实例时 该引用只能调用父类中的变量和方法
当父类中的方法被重写后 (只指方法,变量是不会有重写的概念 ) 将调用实例类的方法(动态连接 动态调用 根据这个对象引用实际的类型来获取对应的方法)。
单看:
package Loader; class Parent { public void getFir() { getSec(); } public void getSec() { System.out.println("Parent getSec"); } } public class LoadTest extends Parent { public void getFir() { getSec(); } public void getSec() { System.out.println("LoadTest getSec"); } public void getThd() { System.out.println("LoadTest getthd"); } public static void main(String[] args) { Parent parent = new LoadTest(); LoadTest loadTest = new LoadTest(); parent.getFir(); loadTest.getFir(); } }
输出会比较明显的:
LoadTest getSec LoadTest getSec
SUN目前的JVM实现机制,类实例的引用就是指向一个句柄(handle)的指针,这个句柄是一对指针:
一个指针指向一张表格,实际上这个表格也有两个指针(一个指针指向一个包含了对象的方法表,另外一个指向类对象,表明该对象所属的类型);
另一个指针指向一块从java堆中为分配出来内存空间
相关推荐
2. **方法2:反射动态调用** - 使用Java的反射机制,可以在运行时动态加载和执行Groovy类。这种方法的优点是Groovy脚本的修改不需要重新编译整个项目,因为Java代码可以通过反射动态地找到并调用Groovy方法。这里,...
本文将详细讲解如何在Java应用程序中调用Groovy脚本,实现从MongoDB数据库中读取并实时运行Groovy脚本,以及其背后的原理和优势。 首先,Groovy是一种与Java高度兼容的脚本语言,它可以无缝地与Java代码集成,共享...
Java通过JNI调用C# DLL是一个跨平台、跨语言的技术实践,主要应用于需要利用Java的稳定性和C#的高性能场景。JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。C# ...
- **Java调用示例**:这些示例代码展示了如何在Java中加载和使用JNI库,调用GMSSL的加密、解密、签名和验证等功能。开发者可以通过阅读和运行这些示例来了解如何在自己的项目中集成GMSSL。 集成过程通常包括以下...
标题“Java加载dll,导致...总的来说,当Java加载DLL并遇到内存泄露问题时,开发者需要对Java和C++代码进行深入审查,确保两者在资源管理上的协调一致。同时,利用工具进行内存分析和调试,可以帮助定位和修复问题。
"java调用js方法.doc"很可能是详细描述如何从Java调用JS函数的步骤和示例。 在实际应用中,Java代码可能会通过Ajax发送一个请求到服务器,服务器解析请求后调用对应的JS函数,例如在"des.js"中执行解密操作,然后将...
这意味着该示例可能包含了Java代码片段,这些代码会加载并调用C# DLL中的特定函数或方法,为开发者提供了一个可参考的模板。 标签中的"Java .NET JACOB Java COM Bridge"进一步明确了主题。`.NET`是微软开发的面向...
在 Java 中调用训练好的 TensorFlow 模型 在本文中,我们将探讨如何将训练好的 TensorFlow 模型保存成 pb 格式的文档,并在 Java 项目中运用。首先,我们需要了解如何将模型保存成 pb 格式,然后我们将探讨如何在 ...
在C++端,我们使用了Windows API来创建和操作ActiveX控件,同时通过JNI调用Java方法,如获取窗口句柄等。这种双端编程的方式,实现了Java应用对ActiveX控件的间接控制。 #### 结论 通过上述分析,我们可以看出,...
要从Java程序中调用Qt功能,首先需要正确地加载和链接这些DLL。这包括设置正确的环境变量,以及在JNI中使用`System.loadLibrary()`或`LoadLibrary()`方法来加载库。 3. **头文件和JNI函数声明**:在Java中调用C++...
对于简单且不频繁的调用,JavaBridge和PECL扩展可能是较好的选择;对于复杂的企业级应用,可能需要考虑Web服务或者JNI以实现更高的性能和灵活性。 在压缩包“jphp调用JAVA”中,可能包含了一些示例代码或教程,帮助...
本文将详细介绍如何使用Java通过JNA调用系统API,以Windows系统为例,重点讲解如何调用`Kernel32.dll`中的`GetLocalTime()`, `GetSystemTime()` 和 `SetLocalTime()` 方法。 1. **Java Native Access (JNA)**: JNA...
了解这些概念和步骤后,开发者便能利用Java和Spring Boot通过JNA调用DLL函数,实现Java与本地库的高效交互。记得在实际项目中,安全性和稳定性是首要考虑的因素,需要对DLL的使用进行充分的测试和异常处理。
它通过Java接口来定义本地函数,然后在运行时动态加载和调用这些函数。 2. **Platform 类**: JNA 提供了 Platform 类,用于根据当前操作系统的类型和架构自动加载相应的库。 3. **类型映射**: JNA 自动处理Java数据...
在“反射,动态加载指定类调用类中的方法”这个主题中,我们将深入探讨如何使用反射来实现动态加载和执行类的方法。首先,我们需要理解几个关键的反射API: 1. `Class<?>`: 这是所有Java类的通用表示,通过`Class....
无论是JNI还是JNA,都需要对C/C++和Windows API有一定的了解,因为DLL的函数签名、参数类型和调用约定等都需要正确地映射到Java代码中。同时,需要注意的是,这种方式可能会引入平台依赖性,因为DLL是Windows特有的...
你需要定义一个接口,该接口的每个方法对应DLL中的一个函数,然后使用`NativeLibrary`类加载DLL,并将接口实例化,这样就可以在Java中直接调用DLL函数了。 1. **基本数据类型**:JNA支持Java的基本数据类型如int、...
Java可以通过调用Python的YOLO ONNX模型实现AI视频识别,支持YOLOv5、YOLOv8和YOLOv7,这包括了预处理和后处理步骤。在Java中实现目标检测和目标识别,可以集成实时流传输协议(RTSP)和实时多媒体传输协议(RTMP)...
JNI是Java和本地代码之间的桥梁,它定义了一套接口,使得Java代码可以通过这些接口调用本地函数,反之亦然。 ### 创建本地方法 创建本地方法需要以下步骤: 1. **定义JNI接口**:在Java类中声明本地方法,但不实现...
2. **加载Java类**:使用IKVM.Runtime.JNIEnv类的静态方法,如`LoadLibrary`或`FindClass`,加载Java类库和类。 3. **创建Java对象**:通过反射机制创建Java对象,调用`JNIEnv.NewObject`方法。 4. **调用Java方法**...