java获取子类
1. 为什么java中Exception的对象能够获取子类的信息.
首先要明白异常的抛出与捕获机制:
当我们没有在程序中主动使用throw或throws关键字抛出一个异常时,异常一般都是有JVM,即java虚拟机抛出的,我们所写try catch语句块只是用来捕获异常的。JVM在抛出这个异常信息之前会对异常做封装处理,确定异常时什么类型的异常。比如,此题JVM抛出的就是一个ArithmeticException,然后就查看程序能捕获什么类型的异常(就是catch语句块的参数),如果程序能捕获的异常类型恰好就是这种异常或者包含这个类型,就把这个异常传递给程序处理(本题中就是封装进了e对象中),以便程序能继续运行下去。要是程序没有对这种异常进行捕获或处理,程序就会报错,并终止执行。
由于Exception类是所有异常信息的父类,所以当在catch语句的参数适用Exception 时,表示该程序能够捕获任何类型的异常,当然也包括了ArithmeticException。其实,ArithmeticException是直接继承的RuntimeException,而RuntimeException才是直接继承至Exception,如果把程序中的Exception换成RuntimeException,输出结果是一模一样的。
也许说的有点绕,好好体会下。
2. 父类获取子类类型 java
既然是父类,子类当然可以使用父类中的非私有属性了。
Base.property
3. Java 子类继承父类,子类重写父类方法,这种情况下父类可以获取到子类的数据吗
在父类中能获取子类的属性吗?一般情况下是不行的,因为孩子尚未出世哪里来的属性。但有时需要在父类处理该类(包含子类)的所有属性,该怎么做呢,有种方法能解决——在父类中将子类的实例引用进来。假设BaseClass是基类,有个getAll方法用以获取该类的所有属性。SubClass继承子BaseClass,SSClass继承自SubClass,SSClass的实例调用getAll方法时获取SSClass及其父类的所有属性。具体做法如下:
import java.lang.reflect.Field;
public class BaseClass {
private String a;
private int b;
// public BaseClass() {
// bc = setBC();
// }
private final BaseClass bc = setBC();
private BaseClass setBC() {
return this;
}
public void getAll() {
Class clazz = this.bc.getClass();
do {
Field[] fields = clazz.getDeclaredFields();
for (Field f : fields) {
System.out.println(f.getName());
}
clazz = clazz.getSuperclass();
} while (clazz != Object.class);
}
}
这里BaseClass bc就是子类的引用,构造子类SubClass或SSClass实例时,调用setBC方法将子类的引用获得。setBC中return this这里的this是子类的实例,不是父类的。setBC也可以在父类构造函数中调用,效果是一样的,如上面代码的注释块。
子类就不用关心任何事了,不管它是否有自己的构造方法:
public class SubClass extends BaseClass {
@ShareObject
private boolean c;
}
public class SSClass extends SubClass {
private String ss;
public SSClass(int i) {
ss = "";
}
}
测试:
@Test public void get() {
SSClass sc = new SSClass(1);
sc.getAll();
}
输出内容:
ss
c
a
b
bc
4. java中父类如何得到子类的对象
继承后子类包含了父类的方法,直接调用就行了,不包括私有成员。
即getChild()不是私有成员,所以直接getChild()就可以
java中父类如何得到子类的对象:
Parent
test3=new
Child();
5. java 反编译只知道接口 怎么查子类
class parent{
/**
* 获取复子类的类名
*/
public String getClassName(){
return this.getClass().getSimpleName();
}
//父类中直接调制用
String className = getClassName();
}
限定!)利用它的单调性求最值与利用均值不等式
6. java怎么获取某个父类(或接口)的所有子类
class parent{
/**
* 获取子类的类名
*/
public String getClassName(){
return this.getClass().getSimpleName();
}
//父类中直接调用
String className = getClassName();
}
限定!)利用它的单调性求最值与利用均值不等式
7. java 父类如何在运行期动态获取子类类名
给你写了3个类:
A类:
packagecn.test;
publicclassA{
publicvoidtest(){
System.out.println(this.getClass());
System.out.println(this.getClass().getSimpleName());
System.out.println(this.getClass().getName());
}
}
B类:
packagecn.test;
publicclassBextendsA{
}
Test类:
packagecn.test;
publicclassTest{
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
Bb=newB();
b.test();
}
}
结果:
class cn.test.B
B
cn.test.B
你要知道,在继承关系中,不管父类还是子类,这些类里面的this都代表了最终new出来时的那个类型的实例对象,所以在父类中你可以中this获取到子类的信息!
不止一层继承关系时,你可以根据下面:
A类:
packagecn.test;
publicclassA{
publicvoidtest(){
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类:
packagecn.test;
publicclassBextendsA{
B(){
//System.out.println("B......");
}
}
C类:
packagecn.test;
publicclassCextendsB{
C(){
//System.out.println("C...........");
}
}
Test类:
packagecn.test;
publicclassTest{
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
Cc=newC();
c.test();
}
}
结果:
class cn.test.C
C
cn.test.C
class cn.test.B
B
cn.test.B
8. java如何获得继承父类的子类并把它保存在数组中
可以做到。首先数组的定义就是一组相同数据类型的集合,而继承父类的子类作为一种引用数据类型,他造出的对象也是可以保存在数组当中的。但是基本上没人会这样做,但实现我认为是能够的,你想想,String作为一种引用数据类型,他造出的字符串都可以保存在数组中,子类为什么不能呢?
9. Java中怎样获取一个类的所有子类
1、面向对象思想的继承是子类继承父类,父类被其它子类继承在JAVA虚拟机的容器中并没有直接接口获取;
2、如果是在一个项目内获取父类的子类继承情况,参考这个代码:
packagefind;
importjava.io.File;
importjava.io.IOException;
importjava.net.URL;
importjava.util.ArrayList;
importjava.util.List;
importfind.test.Intf;
importfind.test.Man;
publicclassClassUtil{
publicstaticvoidmain(String[]args){
try{
System.out.println("接口实现类:");
for(Class<?>c:getAllAssignedClass(Intf.class)){
System.out.println(c.getName());
}
System.out.println("子类:");
for(Class<?>c:getAllAssignedClass(Man.class)){
System.out.println(c.getName());
}
}catch(ClassNotFoundExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
/**
*获取同一路径下所有子类或接口实现类
*
*@paramintf
*@return
*@throwsIOException
*@throwsClassNotFoundException
*/
publicstaticList<Class<?>>getAllAssignedClass(Class<?>cls)throwsIOException,
ClassNotFoundException{
List<Class<?>>classes=newArrayList<Class<?>>();
for(Class<?>c:getClasses(cls)){
if(cls.isAssignableFrom(c)&&!cls.equals(c)){
classes.add(c);
}
}
returnclasses;
}
/**
*取得当前类路径下的所有类
*
*@paramcls
*@return
*@throwsIOException
*@throwsClassNotFoundException
*/
publicstaticList<Class<?>>getClasses(Class<?>cls)throwsIOException,
ClassNotFoundException{
Stringpk=cls.getPackage().getName();
Stringpath=pk.replace('.','/');
ClassLoaderclassloader=Thread.currentThread().getContextClassLoader();
URLurl=classloader.getResource(path);
returngetClasses(newFile(url.getFile()),pk);
}
/**
*迭代查找类
*
*@paramdir
*@parampk
*@return
*@throwsClassNotFoundException
*/
privatestaticList<Class<?>>getClasses(Filedir,Stringpk)throwsClassNotFoundException{
List<Class<?>>classes=newArrayList<Class<?>>();
if(!dir.exists()){
returnclasses;
}
for(Filef:dir.listFiles()){
if(f.isDirectory()){
classes.addAll(getClasses(f,pk+"."+f.getName()));
}
Stringname=f.getName();
if(name.endsWith(".class")){
classes.add(Class.forName(pk+"."+name.substring(0,name.length()-6)));
}
}
returnclasses;
}
}