1.面向对象编程的特性:抽象、封装、继承、多态,其中封装、继承和多态是核心。
(1)抽象:让事物脱离具体化,只将它的类型、属性和行为抽离出来形成一个类,
例如针对猫、狗、牛、羊,根据它们的共同特征和共同行为,可以把它们抽象出一个动物类,这个从现实中的物体到程序的类设计就是一个抽象的过程,动物类本身就是泛指,它不指具体的某一种动物,这就是脱离具体化的体现。
(2)封装:简而言之就是隐藏内部的实现细节,对外提供接口的这样一种设计,封装可以增强代码的安全性
(3)继承:类与类之间的is-a关系,子类将拥有父类的非私有成员
(4)多态的概念:同一种事物,由于条件不同,产生的结果也不同
重载和重写都是多态的表现形式。
重载与重写的区别:
1、方法重写是发生在父类与子类之间,而方法重载只在同一个类里面进行。
2、方法重写是子类为扩展父类方法的功能而编写的方法,重写要求:
a、方法名相同
b、参数列表相同
c、返回值类型相关(基本数据类型必须相同)
d、访问修饰符只能大于等于父类方法的范围
e、子类抛出的异常只能是父类抛出的异常或它的子异常。
3、方法重载是为了方便对一个操作提供多种方案而编写的方法,重载要求:
a、方法名相同
b、参数列表不同
c、跟返回值类型、访问修饰符、抛出的异常没关系。
2.抽象类和接口有什么异同?
语法上的区别:
1、接口中全部都是public抽象方法,(JDK1.8可以有默认和静态方法)而抽象类可以有非抽象方法
2、接口中的属性都是常量,而抽象类不一定
3、接口中没有构造方法,而抽象类有,但抽象类的构造方法只是为了产生子类对象初始化父类属性
4、接口是给类实现的,使用implements,一个类可以实现多个接口,而抽象类是其他类给继承的extends
从语法上可以认为接口是一种特殊的抽象类,但从设计理念上这么理解就是错误的。
设计理念上的区别:
1、抽象类表示的是各个子类的共同特征,是一个“中间产品”,其子类才是“最终产品”,子类和父类之间是"is a"关系(猫、狗是动物),即父类和子类在概念本质上是相同的
2、接口表示一种约定(USB),一种能力(比如猫、鱼、燕子都继承动物类,但可以实现不同接口,如爬树、游泳,飞翔)。接口定义“做什么”,实现类负责“怎么做”,体现了功能(约定)与实现相分离的原则。
3.什么是内部类?内部类有哪几种?有什么优缺点?
答:定义在类内部的类,其他细节和普通类一致称为内部类;
内部类有4种:1 > 成员内部类 2 > 方法内部类 3 > 静态嵌套类 4> 匿名内部类
优点:1.隐藏了具体的实现和细节,
2.减少类文件的数量,
3. 避免传参,简化业务逻辑
缺点:使程序结构变得更复杂,不易维护
4.什么是构造方法,有什么作用,如何调用本类和父类的构造方法?
1.方法名与类名一致,且无返回类型的方法称之为构造方法;
2.构造方法用于对类的成员变量进行初始化
3.通过“this()”方法调用本类的构造方法, 通过“super()”方法调用父类的构造方法;必须写在第一行
5.final、finally、finalize有什么异同?
final 用于声明属性,方法和类,分别表示属性的值不可变,方法不可覆盖,类不可继承。内部类定义在类中的局部位置上时,只能访问该局部被final修饰的局部变量。
finally是异常处理语句结构的一部分,表示总是执行。除了System.exit(0)
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收。
6.异常:主要分为Throwable(运行时异常(runtime exception)、检查异常(checked exceptions))、错误(error)
(1)自定义异常:继承Exception 或者Exception 的子类,定义有参构造方法,在需要的地方throw异常。
(2).throws:用来申明方法可能产生的异常,不会处理,而是将异常抛给调用者处理
throw:抛出一个具体的异常类型
(3).在catch中return(),finally{}会不会执行?
答:会,会在return之后执行。
(4).finally()在什么情况下不会执行
答:只有一种情况不会执行,当执行到System.exit(0)时,finally不会执行。
7.访问权限
8.String和StringBuffer、StringBuilder的区别?
都是final类,String类是不可变字符串,可以像基本数据类型一样直接赋值(直接存放常量池),StringBuffer、StringBuilder是可变字符串,只能通过new产生对象,StringBuilder是线程不安全的,被单个线程使用的时候,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。
9.如何区分运行时异常与检查异常,他们使用时有何区别?
RuntimeException及其所有子类都属于运行时异常,在程序中可以不用处理,直接由jvm处理,而检查异常必须在程序中处理。
10.static, abstract可以修饰什么,有什么作用?abstract可以和final共同修饰吗?
static修饰变量、方法在类加载的时候就会初始化,所有实例共享,可以用类名.属性、类名、方法名;abstract修饰方法表示该方法没有具体实现,必须由其子类实现,修饰类表示该类为抽象类不能被实例化。他们不能共同修饰,因为abstract是代表抽象必须被实现,final代表终极的不能重写和继承。
11.当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
值传递,因为他传递的是对象的地址值,在Java中只有值传递,没有引用传递。
12.什么是java序列化,如何实现java序列化?
序列化就是将内存中的对象保存到硬盘或传输到网络中先将需要序列化的类实现Serializable接口,然后通过ObjectOutputStream或XmlEncoder类的writeObject()方法实现
13.初始化的过程(new对象时进行的操作) --其中1.2是在类加载的时候执行
1. 父类静态成员和静态代码块,按在代码中出现的顺序依次执行
2.子类静态成员和静态代码块,按在代码中出现的顺序依次执行
3.父类实例成员,按在代码中出现的顺序依次执行
4.父类构造方法
5.子类实例成员,按在代码中出现的顺序依次执行
6.子类构造方法