java 父类如何在运行期动态获取子类类名

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 父类如何在运行期动态获取子类类名相关的知识,希望对你有一定的参考价值。

在 java 运行中父类动态的获取子类的类型, 并获取子类的类名。 不知道java 支不支持这样的操作。

给你写了3个类:

A类:

package cn.test;
public class A 
 public void test()
  System.out.println(this.getClass());
  System.out.println(this.getClass().getSimpleName());
  System.out.println(this.getClass().getName());
 

B类:

package cn.test;
public class B extends A
 

Test类:

package cn.test;
public class Test 
 /**
  * @param args
  */
 public static void main(String[] args) 
  B b = new B();
  b.test();
 

结果:

class cn.test.B
B
cn.test.B
你要知道,在继承关系中,不管父类还是子类,这些类里面的this都代表了最终new出来时的那个类型的实例对象,所以在父类中你可以中this获取到子类的信息!

不止一层继承关系时,你可以根据下面:

A类:

package cn.test;
public class A 
 public void test()
  System.out.println(this.getClass());
  System.out.println(this.getClass().getSimpleName());
  System.out.println(this.getClass().getName());
  System.out.println(this.getClass().getSuperclass());
  System.out.println(this.getClass().getSuperclass().getSimpleName());
  System.out.println(this.getClass().getSuperclass().getName());
 

B类:

package cn.test;
public class B extends A
 B()
//  System.out.println("B......");
 

C类:

package cn.test;
public class C extends B
 C()
//  System.out.println("C...........");
 

Test类:

package cn.test;
public class Test 
 /**
  * @param args
  */
 public static void main(String[] args) 
  C c = new C();
  c.test();
 

结果:

class cn.test.C
C
cn.test.C
class cn.test.B
B
cn.test.B

参考技术A 在父类中设计一个获取类名的方法
protect String getName()
return getClass().getSimpleName();

到时直接调用就可以获取子类类名了
参考技术B 所有类都有一个公共的父类,那就是java.lang.Object,看JDK表述: public class Object类 Object 是类层次结构的根类。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法 所以抽象类有父类啊,如果没有写继承某个父类,那他的父类就是java.lang.Object

java

多态

1.多态体现:方法重载、方法覆盖、多态参数。
2.有继承关系时:运行期类型(子类)和编译期类型(父类),父类引用指向子类对象。
3.多态参数:方法的形式参数类型是父类类型,传递的实际参数可以是任意子类的对象。
4.多态环境下对象造型(向上造型,自动类型提升只能使用父类中的方法/向下造型,强制转换需要使用子类中的新方法时有此操作)
5.instanceof操作符用于判断对象的具体类型

泛型的概念和作用:

1.泛型的本质是参数化类型

2.在编译时检查类型的安全,消除强制类型转换。

泛型类:声明类名后使用<E>,E可以为任何字母

public class Animal<E> {

private E name;

public  Animal(){

}

}

集合框架:

三大接口(Collection 所有集合类的根接口; Map 映射接口,存放键值对; Iterator 遍历集合的迭代接口)

list接口继承Collection接口,list集合中的元素都是有索引的

List存在三个实现类(ArrayList 数组列表,数据采用数组方式存储;LinkedList 链表 ;Vector)

set接口中的元素是不重复的,但是是无序的是没有索引的。

set接口有两个实现类(HashSet 底层是哈希码值,基于HashMap实现的; TreeSet 元素不重复,并且元素实现了排序。)

多线程编程:

进程和线程(前者是正在执行的程序;后者是程序中的一个执行流;一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个主线程)

继承Thread类的方式 ;

import java.lang.Thread;

public class Mythread extends Thread{
public static int ticket1 = 20;
public void run(){
System.out.println("开始卖票:"+Thread.currentThread().getName()+"窗口在售票;还剩"+ticket1--+"张票");
}
public static void main(String[] args) {
// 创建多个线程
Mythread th1 = new Mythread();
Mythread th2 = new Mythread();
Mythread th3 = new Mythread();
Mythread th4 = new Mythread();
Mythread th5 = new Mythread();
//开始线程操作
th1.start();
th2.start();
th3.start();
th4.start();
th5.start();
}
}

实现Runnable接口的方式;

import java.lang.Thread;

class Myrunnable implements Runnable{
public static int ticket=10;
public void run(){
System.out.println("开始卖票:"+Thread.currentThread().getName()+"窗口在售票;还剩"+ticket--+"张票");
}
public static void main(String[] args) {
//创建一个对象
Myrunnable a = new Myrunnable();
Myrunnable b = new Myrunnable();
Myrunnable c = new Myrunnable();
Myrunnable d = new Myrunnable();
Myrunnable e = new Myrunnable();
Myrunnable f = new Myrunnable();
//创建一个线程作为外壳将对象包括
Thread th1 = new Thread(a,"线程1");
Thread th2 = new Thread(b,"线程2");
Thread th3 = new Thread(c,"线程3");
Thread th4 = new Thread(d,"线程4");
Thread th5 = new Thread(e,"线程5");
Thread th6 = new Thread(f,"线程6");
th1.start();
th2.start();
th3.start();
th4.start();
th5.start();
th6.start();
}
}

 



















































以上是关于java 父类如何在运行期动态获取子类类名的主要内容,如果未能解决你的问题,请参考以下文章

什么是多态

Java Debug 笔记:Spring如何在运行期动态注册新的数据源?

子类调用父类static方法怎么获得子类类名

java基础

什么是多态方法重写与重载

子类继承父类怎么在父类的方法中访问子类的变量