当前位置:首页 » 编程语言 » java获取子类

java获取子类

发布时间: 2022-05-08 21:30:11

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;
}
}
热点内容
手机店设置的初始密码一般是多少 发布:2025-05-11 09:33:15 浏览:400
昂科威选择哪个配置 发布:2025-05-11 09:25:50 浏览:35
怎么解决安卓视频全屏卡顿 发布:2025-05-11 09:14:55 浏览:725
汇编从编译到执行 发布:2025-05-11 09:09:04 浏览:257
安卓系统低版本如何升级 发布:2025-05-11 09:04:44 浏览:251
认证类型加密算法 发布:2025-05-11 08:58:35 浏览:561
android停靠 发布:2025-05-11 08:42:23 浏览:646
超时代加密 发布:2025-05-11 08:41:29 浏览:780
为什么还要输入支取密码 发布:2025-05-11 08:32:24 浏览:362
数据库课程设计案例 发布:2025-05-11 08:15:33 浏览:51