先看看构造函数的加载顺序
-
构造函数
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堆中为分配出来内存空间
相关推荐
在java中调用训练好的TensorFlow模型1
Java代码调用HTML5中的JS函数算法,这样就可以轻松解密..
Java调用Groovy,实时动态加载数据库groovy脚本,java读取mongoDB的groovy脚本,加载实时运行,热部署
反射,动态加载指定类调用类中的方法 简单例子
亲测可用,java 成功调用dll函数。包含调用回调函数,springboot版本。最近由于公司业务需要,要调用dll文件,用JNA调用。
NULL 博文链接:https://genius.iteye.com/blog/296000
使用java程序调用kettle的sap组件,由于从kettle7.0版本开始,sap组件作为插件形式加载,所以在项目工程中需要修改相应的配置文件及jar才可以被加载和调用。
我们知道,使用 JNI 调用 .dll/.so 共享类库是非常非常麻烦和痛苦...使用 JNA ,不需要再编写适配用的 .dll/.so ,只需要在 Java 中编写一个接口和一些代码,作为 .dll/.so 的代理,就可以在 Java 程序中调用 dll/so 。
Java调用Redis的一些简单Demo,可在MyEclipse上运行
让Java支持热加载是个不错的想法。如何做到的呢? 1. 定义好接口和实现类 2. 让代理类通过反射的方式调用实现类,对外暴露的是代理类。 3. 自定义URLClassLoader。检查实现类.class文件的修改时间,如果是更新的....
帮助在java中调用weka中的数据集的源代码,java写的代码
java 调用第三方DLL readWriteCard.cpp
java调用kettle中的Job或是Trans要用到的jar包
一个java读取加密狗的demo,加密狗是ET199,部分无关代码已删除。
JAVA动态加载JAR文件以及反射调用其方法
4.知道了static的作用,那么X类被加载,那么就会先执行X类的静态属性和静态语句块(static),执行先后顺序看谁在前面就先执行谁。只在此时执行,以后都不会。 5.所以一个输出结果为tttt,没问题了吧。 6.X类的...
II. java c/cpp互相调用实例(姊妹篇之一)——java调用c/cpp 4 一 先制作一个系统中有的DLL文件(cpp给出的sdk接口) 4 二 JNI 7 1、 编写java文件 7 2、 生成.h头文件 8 3、 用c/cpp实现这个头文件 9 三 测试 10 ...
NULL 博文链接:https://cyj86.iteye.com/blog/1095213
java调用kettle时需要的jar包合计,其中包括了可能会用到的Oracle和MySQL的驱动文件
java调用c代码demo