目录
重载(overload)和重写(override)的区别是什么?
构造器(Constructor)是否可被重写(override)?
面向对象与面向过程的区别?
| 面向对象 | 面向过程 |
优点 | 易维护,易复用,易扩展,因为有封装,继承,多态的特性, | 性能好,原因类调用时需要实例化,开销比较大,耗资源; |
缺点 | 性能比面向过程低。 | 没有面向对象易维护,易复用,易扩展 |
面向对象的三大特性
- 封装:封装是对象和类概念的主要特征,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
- 继承:它可以使用现有类的所有功能,并在无需重新编写原有的类的情况下对这些功能进行扩展。通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”“父类”或者“超类”。
- 多态性:它是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中具有不同的含义。
Java语言是如何实现多态的?
多态分为:编译时多态(静态多态),运行时多态(动态多态)
重载(overload)属于编译时多态,编译时多态在编译时就已经确定,运行的时候调用的是确定的方法。
多态方法,又称为延迟方法,通常所说的多态指的都是运行时多态。就是说编译时不确定调用的是哪个具体方法,一直延迟到运行时才能确定。
Java实现多态的3个必要条件:继承,重写和向上转型。只有满足这3个条件,才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而执行不同的行为。
- 继承:在多态中必须存在有继承关系的子类和父类。
- 重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
- 向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用可以调用父类的方法,又能调用子类的方法。
重载(overload)和重写(override)的区别是什么?
重载:实现的是编译时的多态性;在一个类里面,方法名字相同,参数不同。返回类型可以相同也可以不同。每个重载的方法(或者构造函数)都必须要有一个独特的参数类型列表。最常用的是构造器的重载。
重写:实现的是运行时的多态性;发生在子类与父类之间,重写方法返回值和形参都不能改变,与方法返回值和访问修饰符无关,即重载的方法不能根据返回类型进行区分。
重载的方法能否根据返回值类型进行区分?
不能根据返回值类型进行重载的区分。因为调用时不指定类型信息,编译器不知道你要调用哪个函数。
Float max(int a, int b);
Int max(int a, int b);
当调用max(1,2);时无法确定调用的是哪个,从这点上来说,仅返回值类型不同的重载是不应该允许的。
构造器(Constructor)是否可被重写(override)?
构造器不能被继承,因此不能被重写,但可以被重载。每一个类必须有自己的构造函数,负责构造自己这部分的构造。子类不会覆盖父类的构造函数,相反必须一开始调用父类的构造函数。
Java创建对象有哪几种方式?
- New创建新对象:显示的调用构造方法
- 通过反射机制:显示的调用构造方法
- 采用clone机制:需要注意浅拷贝和深拷贝的区别
- 通过序列化机制:需要明确实现原理,在Java中序列化可以通过实现Externalizable或者Serializable来实现。
Java对象创建:Java对象创建的方式(简洁明了)_java创建对象_安逸的博客的博客-CSDN博客
什么是不可变对象?好处是什么?
不可变对象:指对象一旦被创建,状态就不能再改变,任何修改都会创建一个新的对象,如String,Integer及其他包装类。
不可变对象最大的好处是线程安全。
能否创建一个包含可变对象的不可变对象?
比如:final Person[] persons = new Persion[] {}.persons是不可变对象的引用,但其数组中的Person实例是可变的,这种情况下需要注意,不要共享可变对象的引用。这种情况下,如果数据需要变化时,就返回原对象的一个拷贝。
在Java中定义一个不做事且没有参数的构造方法的作用?
Java程序在执行子类的构造方法之前,如果没有用super()来调用父类特定的构造方法,则会调用父类中“没有参数的构造方法”。因此,如果父类中只定义了有参数的构造方法,而在子类的构造方法中又没有用super()来调用父类中特定的构造方法,则编译时将发生错误,因为Java程序在父类中找不到没有参数的构造方法可供执行。解决方法就是在父类中加上一个不做事且没有参数的构造方法。