面向对象(oop):

image.png

abstract(抽象)

image.png

final && static

image.png

内部类

image.png

权限修饰符

image.png

构造函数

image.png

this && super

image.png
1.抽象类(abstract class)和接口(interface)有什么异同?

概念:
抽象类:包含抽象方法的类就是抽象类
接口:指抽象方法的集合,方法不包含方法体
相同点:
1.都不能被实例化
2.接口的实现类或者抽象类的子类都必须实现了接口或抽象类中的方法后才可以被实例化
不同点:
1.接口只有定义,方法不能在接口中实现,实现接口的类要实现接口中所有的方法;抽象类可以有定义与实现,方法可以在抽象类中实现
2.接口要实现,抽象类要继承,一个类可以实现多个接口,但只能继承一个抽象类
3.接口强调设计理念为“has -a”的关系,抽象类强调“is -a”关系
4.接口中定义变量默认为public static final,且要赋初值,方法必须是public,static,且只能是这两个;抽象类中可以有自己的数据成员变量,也可以有非抽象的成员方法,而且成员变量默认为default。这些成员变量可以在子类中被重新定义,也可以重新赋值,抽象方法(有abstract修饰)不能用private,static,synchronized,native等访问修饰符修饰,同时方法以分号结尾,并且不带花括号
5.接口被运用于比较常用的功能,便于日后的维护或者添加删除方法;而抽象类更倾向于充当公共类的角色,不适用于对里面的代码进行修改
另外:
接口是一种特殊形式的抽象类,使用接口完全有可能实现与抽象类相同的操作。当子类和父类之间存在有逻辑上的层次结构时,推荐使用抽象类;当用于不同类之间,定义不同类之间的通信规则,希望支持差别较大的两个或者更多对象之间的特定交互行为时,应该使用接口。
此外,接口可以继承接口,抽象类可以实现接口,抽象类也可以继承具体类。抽象类也可以有静态的main方法。

2.Java 创建对象的方式有哪些?
答:
1.使用new关键字:这是我们最常见的也是最简单的创建对象的方式,通过这种方式我们还可以调用任意的构造函数(无参的和有参的)。比如:Student student = new Student();
2.使用Class类的newInstance方法:我们也可以使用Class类的newInstance方法创建对象,这个newInstance方法调用无参的构造器创建对象,如:Student student2 = (Student)Class.forName(“根路径.Student”).newInstance(); 或者:Student stu = Student.class.newInstance();
3.使用Constructor类的newInstance方法:本方法和Class类的newInstance方法很像,java.lang.relect.Constructor类里也有一个newInstance方法可以创建对象。我们可以通过这个newInstance方法调用有参数的和私有的构造函数。如: Constructor constructor = Student.class.getInstance(); Student stu = constructor.newInstance(); 这两种newInstance的方法就是大家所说的反射,事实上Class的newInstance方法内部调用Constructor的newInstance方法。这也是众多框架Spring、Hibernate、Struts等使用后者的原因。
4.使用Clone的方法:无论何时我们调用一个对象的clone方法,JVM就会创建一个新的对象,将前面的对象的内容全部拷贝进去,用clone方法创建对象并不会调用任何构造函数。要使用clone方法,我们必须先实现Cloneable接口并实现其定义的clone方法。如:Student stu2 = stu.clone();这也是原型模式的应用。
5.使用反序列化:当我们序列化和反序列化一个对象,JVM会给我们创建一个单独的对象,在反序列化时,JVM创建对象并不会调用任何构造函数。为了反序列化一个对象,我们需要让我们的类实现Serializable接口。如:ObjectInputStream in = new ObjectInputStream (new FileInputStream(“data.obj”)); Student stu3 = (Student)in.readObject();

3.阐述运行期和编译期?
答:
1.编译期和运行期进行的操作是不相同的,编译器只是进行语法的分析,分析出来的错误也只是语法上的错误,而运行期在真正在分配内存
2.编译期干的事情:检查语法,绑定参数列表(重载),绑定常量值等等
3.运行期干的事情:加载静态资源,开辟内存空间,创建对象等等

4.静态变量和实例变量的区别?
答:
概念:
1.静态变量:独立存在的变量,只是位置放在某个类下,可以直接类名加点调用静态变量名使用。并且是项目或程序一启动运行到该类时就直接常驻内存。不需要初始化类再调用该变量。用关键字static声明。静态方法也是同样,可以直接调用。
2.实例变量:就是相当于该类的属性,需要先初始化该类,就是new 该类后,才可以调用。但是该类未被再次使用,被垃圾回收器回收后,该实例也将不存在了,就是不在内存中了。
区别:
1.存储区域不同:静态变量存储在静态存储区,普通变量存储在堆中;
2.静态变量与类相关,普通变量则与实例相关
3.内存分配方式不同。
4.生命周期不同。

5.向上转型和向下转型以及需要注意哪些?
答:
概念:
向上转型 : 通过子类对象(小范围)实例化父类对象(大范围),这种属于自动转换
向下转型 : 通过父类对象(大范围)实例化子类对象(小范围),这种属于强制转换
注意点:
1.当我们需要多个同父的对象调用某个方法时,通过向上转换后,则可以确定参数的统一.方便程序设计,向上转型时,父类只能调用父类方法或者子类覆写后的方法,而子类中的单独方法则是无法调用的
2.在java中,向下转型则是为了,通过父类强制转换为子类,从而来调用子类独有的方法。
为了保证向下转型的顺利完成,在java中提供了一个关键字:i
f,通过instanceof可以判断某对象是否是某类的实例,如果是则返回true,否则为false

6.阐述java的代码的运行原理?
答:
先编译,利用java编译器(JDK自带的工具)把java文件转换成字节码文件(.class文件)
这个时候生成的字节码也不是计算机能识别的,还要让jvm也就是java虚拟机解读,java虚拟机首先读入字节码、对字节码进行正确性检查,针对客户计算机平台生成对应的机器指令,由客户机器执行机器指令。

7.方法重载和重写的区别(语法和原理)?
答:
方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问(子类方法的访问权限要比父类的大或者等于父类的(public>默认)),不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求。

8.画图展示两种字符串创建方式?
答:看笔记


9.谈谈你对构造函数的理解?
答:
语法上:
1.名字与类名相同。
2.没有返回值,但不能用void声明构造函数。
3.生成类的对象时自动执行,无需调用。
理解上:
1. 构造函数的作用是初始化全员参数
2. 构造函数可以重载
3. 创建一个对象其实就是调用这个类的构造函数
4. 子类继承父类的时候会默认调用父类的无参构造函数

10.权限修饰符在继承中的使用?
答:
image.png

11.静态方法和实例方法有何不同?
答:
1. 在外部调用静态方法时,可以使用”类名.方法名”的方式,也可以使用”对象名.方法名”的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。
2. 静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制。

12.Java中实现多态的机制是什么?
答:
Java中的多态靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。

13.谈谈你对多态的理解?
答:
多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源代码,就可以让引用变量绑定到各种不同的对象上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。

14.请说明JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
答:
Java 通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。在Java中,每个异常都是一个对象,它是Throwable类或其它子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理。Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally。一般情况下是用try来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理。用try来指定一块预防所有”异常”的程序。紧跟在try程序后面,应包含一个catch子句来指定你想要捕捉的”异常”的类型。throw语句用来明确地抛出一个”异常”。throws用来标明一个成员函数可能抛出的各种”异常”。Finally为确保一段代码不管发生什么”异常”都被执行一段代码。可以在一个成员函数调用的外面写一个try语句,在这个成员函数内部写另一个try语句保护其他代码。每当遇到一个try语句,”异常“的框架就放到堆栈上面,直到所有的try语句都完成。如果下一级的try语句没有对某种”异常”进行处理,堆栈就会展开,直到遇到有处理这种”异常”的try语句。

15.请说明Java是否支持多继承?
答:
Java中类不支持多继承,只支持单继承(即一个类只有一个父类)。 但是java中的接口支持多继承(单根性的拓展),即一个子接口可以有多个父接口。(接口的作用是用来扩展对象的功能,一个子接口继承多个父接口,说明子接口扩展了多个功能,当类实现接口时,类就扩展了相应的功能)。

16.请你讲讲什么是泛型?
答:
泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。

17.请你谈谈StringBuffer和StringBuilder有什么区别?
答:
StringBuffer线程安全,StringBuilder线程不安全,底层实现上的话,StringBuffer其实就是比StringBuilder多了Synchronized修饰符。

18.请说明”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?
答:
“static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。 Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。