一、抽象类(abstract class)和接口(interface)有什么不同?
答: 1、概念: (1)抽象类:包含抽象方法的抽象类就是抽象方法 (2)接口:指抽象方法的集合,方法不包含方法体
2、相同点: (1)都不能被实例化 (2)接口的实现类或者抽象类的子类都必须实现接口或抽象类中的抽象方法,之后,实现类才可以被实例化
3、不同点: (1)接口只有声明,方法不能再接口中实现,接口的类要实现接口中所有的方法;抽象类可以有声明和定义(实现),方法可以在抽象类中实现。 (2)接口要实现,抽象类必须要被继承,一个类可以实现多个接口,但一个类只能继承一个抽象类
4、接口中定义变量默认为public static final,且要赋初始值,方法必须是public static,且只能是这两个;抽象类中可以有自己的数据成员变量,也可以有非抽象的成员方法,而且成员变量默认为default。这些成员变量可以再子类中被重新定义,也可以重新赋值,抽象方法(有abstract修饰),不能用private,static,synchronized,native等访问修饰符修饰,同时方法以分号结尾,并且不带花括号
5、接口被运用于比较常用的功能,便于日后的维护或者添加删除方法;而抽象类更加倾向于充当公共类的角色,不适合用于对里面的代码进行修改。
6、接口是一种特殊形式的抽象类,使用接口完全有可能实现与抽象类相同的操作。当子类和父类之间存在有逻辑上的层次结构时,推荐使用抽象类;当用于不同类之间,定义不同类之间的通信规则,希望支持差别较大的两个或者更多对象之间的特定交互行为时,应该使用接口。此外,接口可以继承皆苦,抽象类可以实现接口,抽象类也可以是继承实体类。抽象类也可以有静态的main方法
二、Java创建对象的方式有哪些?
1、使用new关键字
2、使用class类的newIntsance方法。newInstance方法调用无参数的构造器创建对象。如果Student s1=Student.class.newInstance或Student s2=(Student)Class.forName(“类的全路径名”).newInstance()
3、使用Constructor类的newInstance方法:本方法和Class的newInstance方法很像,Java.lang.relect.Constructor类里面也有一个newInstance方法可以创建对象。有一点不同的是Constructor的newInstance方法可以调用有参构造和私有构造函数。如: Constructor
constructor = Student.class.getInstance(); Student stu = constructor.newInstance();事实上Class的newInstance方法内部调用Constructor的newInstance方法。这也是众多框架Spring、Hibernate、Struts等使用后者的原因。 4、使用clone的方法。clone创建对象不会调用任何构造函数。clone会创建对象。clone是浅拷贝。要使用clone方法,要先实现Cloneable接口,并实现clone。
5、使用反序列化。当我们序列化和反序列一个对象,JVM会给我们创建一个单独的对象,在反序列化时,JVM创建对象并不会调用任何构造函数。为了反序列化创建一个对象,我们需要实现Serializable接口。如:ObjectInputStream in=new ObjectInputStream(new FileInputStream(“data.obj”));Student stu=(Student)in.readObject。
三、参数运行期和编译期
1、编译期和运行期进行的操作是不相同的,编译期只是进行语法分析,分析出来的错误也只是语法上的错误,而运行期在真正的在分配内存
2、编译期干的事:检查语法,绑定参数列表(重载),绑定常量值等等
3、运行期干的事:加载静态资源,开辟内存空间,创建对象等等
四、静态变量和实例变量的区别
1、静态变量:独立存在的变量,只是位置放在某个类下,可以直接使用类名点出来调用静态变量。并且是项目或程序已启动运行到该类时直接常驻内存。不需要初始化类再调用该变量。使用关键字static声明。静态方法类似。
2、实例变量:就是相当于该类的属性,需要先初始化该类,就是new该类后,才可以使用。一旦new出来的对象消失,则该变量也随着消失
区别: 1、存储区域不同:静态变量存储在静态存储区域,就是在方法区中,普通变量存储在堆中。 2、静态变量与类相关,普通变量则与实例相关 3、内存分配方式不同。静态变量是在编译期确定,实例变量是在创建对象的时候确定 4、生命周期不同。静态变量的声明周期是跟随类的,实例变量是跟随实例对象的
五、向上转型和向下转型以及需要注意哪些
向上转型:通过子类对象(小范围)实例化父类对象,也就是父类引用指向子类对象。这种属于自动转换 向下转型:通过父类对象(大范围)实例化子类对象,也就是子类引用指向父类对象。这种属于强制转换 注意点 1、当我们需要多个同父类的对象调用某个方法时,通过向上转型后,则可以确定统一的参数,方便程序设计。向上转型时,父类只能调用父类方法,或者子类覆写后的方法,而子类中的单独方法则无法调用。 2、在java中,向下转型则是为了,通过父类强制转换成为子类,从而来调用子类独有方法。为了确保向下转型,在java中提供关键字instanceof关键字,通过instanceof可以判断某对象是否是某个类的实例
6、阐述java的代码运行原理
先编译,利用java编译期(JDK自带的工具)把java文件转换成字节码文件(*.class),这时候生成的字节码也不是计算机能识别的,还需要让jvm,也就是java虚拟机进行解读,java虚拟机首先读入字节码,对字节码进行正确性检查,针对客户机平台生成对应的机器指令,有客户机机器执行机器指令
7、方法重载和重写的区别
方法重载和重写都是事先多态的方式。区别在于前者事先的是编译时的多态性,而后者实现的运行是的多态。重载发生在同一个类中,同名的方法如果有不同的参数列表(参数类型不同,参数个数不同或者二者都不同)则被视为重载;重写发生在子类和其父类之间,重写要求子类重写方法与父类被重写方法相同的返回类型,比父类的访问权限更高,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊要求。
8、画图展示两种字符串创建方式
9、谈谈对构造函数的理解
语法上 1、名字与类名字相同 2、没有返回值,但不能有void声明构造函数 3、生成类对象时自动执行,无需调用 理解上: 1、构造函数的作用是初始化全员参数 2、构造函数可以重载 3、创建一个对象其实就是调用这个类的构造函数、 4、子类继承父类的时候,构造方法不会被继承。 5、子类继承父类,子类再创建对象的时候,会默认调用父类无参构造函数
10、权限修饰符在继承中的使用。
1、public:在当前类,同包,子类,其他包都是可访问 2、protected:当前类,同包,子类都可以访问 3、默认:当前类,同胞都可以访问 4、private:当前类可访问
11、静态方法和实例方法有何不同
1、在外部调用静态方法时,可以用使用“类名.方法名”,也可以使用“对象名.方法名”的方式。而实例方法只是有后面这种方式。也就是说,调用静态方法可以无需创建对象。
2、静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法,实例方法则无此限制
12、Java中实现多态的机制是什么
java中的多态靠的是父类或接口定义的什么引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。
13、谈谈你对多态的理解
多态就是程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用,在编程时并不确定,而是在程序运行期才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类实现的方法,必须在程序运行期才能决定。因为在程序运行时才确定具体的类,这样,不用修改源代码,就可以让引用变量绑定到各种不同的对象上,从而导致该应用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态
[面向对象堂测答案.docx](https://www.yuque.com/attachments/yuque/0/2020/docx/2874987/1607473061400-6d80014a-984d-4645-a138-2f835a76bf3b.docx?_lake_card=%7B%22uid%22%3A%221607473061747-0%22%2C%22src%22%3A%22https%3A%2F%2Fwww.yuque.com%2Fattachments%2Fyuque%2F0%2F2020%2Fdocx%2F2874987%2F1607473061400-6d80014a-984d-4645-a138-2f835a76bf3b.docx%22%2C%22name%22%3A%22%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E5%A0%82%E6%B5%8B%E7%AD%94%E6%A1%88.docx%22%2C%22size%22%3A39854%2C%22type%22%3A%22application%2Fvnd.openxmlformats-officedocument.wordprocessingml.document%22%2C%22ext%22%3A%22docx%22%2C%22progress%22%3A%7B%22percent%22%3A99%7D%2C%22status%22%3A%22done%22%2C%22percent%22%3A0%2C%22id%22%3A%22zGViQ%22%2C%22card%22%3A%22file%22%7D)