java子类的子类
❶ java的单继承中允许一个父类有多个子类吗
java中对于继承,java只支持单继承。java虽然不直接支持多继承,但是保留了这种多继承机制,进行改良。
单继承:一个类只能有一个父类。
多继承:一个类可以有多个父类。
为什么不支持多继承呢?
因为当一个类同时继承两个父类时,两个父类中有相同的功能,那么子类对象调用该功能时,运行哪一个呢?因为父类中的方法中存在方法体。
但是java支持多重继承。A继承BB继承CC继承D。
多重继承的出现,就有了继承体系。体系中的顶层父类是通过不断向上抽取而来的。它里面定义的该体系最基本最共性内容的功能。
所以,一个体系要想被使用,直接查阅该系统中的父类的功能即可知道该体系的基本用法。那么想要使用一个体系时,需要建立对象。建议建立最子类对象,因为最子类不仅可以使用父类中的功能。还可以使用子类特有的一些功能。
简单说:对于一个继承体系的使用,查阅顶层父类中的内容,创建最底层子类的对象。
子父类出现后,类中的成员都有了哪些特点:
1:成员变量。
当子父类中出现一样的属性时,子类类型的对象,调用该属性,值是子类的属性值。
如果想要调用父类中的属性值,需要使用一个关键字:super
This:代表是本类类型的对象引用。
Super:代表是子类所属的父类中的内存空间引用。
注意:子父类中通常是不会出现同名成员变量的,因为父类中只要定义了,子类就不用在定义了,直接继承过来用就可以了。
❷ java 小问题 子类的子类是父类的子类还是间接子类
你应该这样去理解 “所有“ 的 Exception 类。
在 java 中 java.lang.Exception 是 java.lang.Throwable 的子类,而 java.lang.RuntimeException 也是 java.lang.Throwable 的子类。
因此,如果有一段代码,不管是会发生 Exception 还是 RuntimeException ,而你想一次性捕获所有错误的时候,这样写:
publicstaticvoidmain(String[]args){
System.out.println("----------测试输出1----------");
try{
Strings=null;
//注:这一个会抛出NullPointException,即RuntimeException的子类。
s=s.substring(0);
}catch(Throwableex){
ex.printStackTrace();
}
System.out.println("----------测试输出2----------");
try{
Strings="123";
//注:这一个会抛出IndexOutOfBoundsException,即RuntimeException的子类。
inti=s.indexOf(200);
}catch(Throwableex){
ex.printStackTrace();
}
System.out.println("----------测试输出3----------");
}
你在上面的代码里面可以看到,即使是发生了 RuntimeException ,但是使用了 Throwable 也可以捕获到,而且你不用关心具体是什么原因出错了,只要有错误,用 Throwable 都可捕获到。
如果不使用 Throwable ,又是一个什么情况呢,这个时候,你就需要在程序中针对某一个 Exception 或 RuntimeException 来写 catch 了:
publicstaticvoidmain(String[]args){
System.out.println("----------测试输出4----------");
try{
Strings=null;
//注:这一个会抛出NullPointException,即RuntimeException的子类。
s=s.substring(0);
}catch(NullPointExceptionex){
ex.printStackTrace();
}
System.out.println("----------测试输出5----------");
try{
Strings="123";
//注:这一个会抛出IndexOutOfBoundsException,即RuntimeException的子类。
inti=s.indexOf(200);
}catch(IndexOutOfBoundsExceptionex){
ex.printStackTrace();
}
System.out.println("----------测试输出6----------");
}
但是,其实所有 RuntimeException 及其子类都不需要在程序中显式调用的,如果不进行显式调用,则表明你不需要理会错误,当有任何错误发生时,让程序自动终止:
publicstaticvoidmain(String[]args){
System.out.println("----------测试输出7----------");
Strings=null;
//注:这一个会抛出NullPointException,即RuntimeException的子类。
s=s.substring(0);
System.out.println("----------测试输出8----------");
Strings="123";
//注:这一个会抛出IndexOutOfBoundsException,即RuntimeException的子类。
inti=s.indexOf(200);
System.out.println("----------测试输出9----------");}
这个时候,在上面代码中,因为没有进行 catch ,所以,第 2 句 “测试输出 8” 就不会执行到了。
❸ Java面试题,常见面试题及答案汇总
Java最新面试题附赠答案
Q1: Java内部类和子类之间有什么区别?
答案:内部类是指在一个外部类的内部再定义一个类,内部类对外部类有访问权限,可以访问类中定义的所有变量和方法。子类是从父类(superclass)中继承的类,子类可以访问父类所有public和protected的字段和方法。
Q2: 静态方法和静态变量的目的是什么?
答案:静态变量被类的所有实例共用,静态类只能访问类的静态变量,或调用类的静态方法。
Q3: Java语言中有哪些常见的访问说明符,有什么意义?
答案:Java中的访问说明符是放在类名之前,用于定义访问范围的关键字,常见的访问说明符有以下几类:
Public:公共,能被项目中的任何一个Class、Method、Field访问。
Protected:受保护,能被同类或子类访问,不能从外部访问。
Default:默认,只能被同一个包的ClassMethod、Field访问。
Private:私有,只能被本类访问。
Q4: 什么是数据封装及其意义?
答案:封装是面向对象编程中用于在单个单元中组合属性和方法。封装可以帮助程序员遵循模块化方法进行软件开发,每个对象都有自己的一组方法和变量,并且可以独立干其他对象来执行其功能。另外,封装也有数据隐藏的目的。
Q5: 什么是 singleton class(单例类)? 并给出其用法的实际例子。
答案:单例类只能有一个实例,必须自己创建自己的唯一实例,必须给所有其他对象提供这一实例。单例做差枯使用场景的最佳实践是由于某些驱动程序限制,或由于许可问题的限制只能连接数据库。
Q6: 什么是循环? Java中有哪些循环?
答案:循环用于编程中重复执行语句,Java中的循环有三类:
1、for循环
for循环用于执行指定重复次数的语句,当程序员明确知道循环次数可以使用for循环。
2、While循环
当语句满足条件时开始进行重复执行,直到语句不再满足条件退出循环。While循环中在执行语句之前先检查是否满足条件。
3、do while循环
Do while 和while循环基本类似,唯一不同的是do while是先执行语句再检查条件,也就是说dowhile循环至少会执行一次语句。
Q7: 什么是无限循环? 如何声明无限循环?
答案:无限循环是指无条件执行,无限运行。无限循环可以由定义中断语句块来结束。
Q8: Java中的double和float变量有什么区别?
答案: float是单精度浮点数,内存中占用4字节double是双精庆册度浮点数,内存中占用8字节。
Q9: Java中的Final关键字是什么意思纯洞? 请举例说明。
答案: final是Java中的关键字,有“无法改变”、“终态”的含义,final类不能被继承,没有子类,final类中的方法默认是final的,且不能被子类的方法覆盖,但可以被继承。final成员变量表示常量,只能被赋值一次,赋值后值不再改变。final不能用于修饰构造方法。下面的例子中,const_val被声明且赋值为常量100:Private Final int const_val=100而当一个方法被声明为final之后,它不能被子类覆盖,而且会比其他方法都快。
Q10: 举例说明什么是三元运算符?
答案:三元运算符,也称为条件运算符,根据布尔值来决定将哪个值分配给变量,它被表示为...? ...:...
在下面的示例中,如果rank为1,status=Done,否则status=Pending。
Q11: 什么是Java Packages? 其意义是什么?
答案:为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间。
包的作用:
1、把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
2、如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。3、包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。
❹ 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;
}
}