Java面向对象编程的三大特性
封装:是面向对象三大特征之一,其含义有两个(掌握思想):
把对象的字段和方法存放在一个独立的模块中(类)
信息隐藏,尽可能隐藏对象的数据和功能的实现细节
封装的好处:
提高组件的重用性,把公用功能放到一个类中,谁需要该功能,直接调用即可
保证数据的安全性,防止调用者随意修改数据
继承:不同类型的对象,相互之间经常有一定数量的共同点。例如,小明同学、小红同学、小李同学,都共享学生的特性(班级、学号等)。同时每一个对象还定义了额外的特性使得他们与众不同。例如小明的数学比较好,小红的性格惹人喜爱;小李的力气比较大。继承时使用已存在的类定义作为基础建立新的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承,可以快速地创建新的类,可以提高代码的重用,程序的可维护性,节省大量创建新类的时间,提高我们的开发效率。
关于继承如下3点请记住:
子类拥有父类对象所有的字段和方法(包括私有字段和私有方法),但是傅雷中的私有字段和方法子类时无法访问,只是拥有。
子类可以拥有自己得的字段和方法,即子类可以对父类进行扩展。
子类可以用自己的方式实现父类的方法(方法的重写)。
多态:顾名思义,表示一个对象具有多种的状态,具体表现为父类的引用指向子类的实例。
多态的特点:
对象类型和引用类型之间具有继承(类)、实现(接口)的关系;
引用类型变量发出的方法调用的到底是哪个类中的方法,必须在程序运行期间才能确定;
多态不能调用”只在子类存在但在父类不存在“的方法;
如果子类重写了父类的方法,真正执行的是子类覆盖的方法,如果子类没有覆盖父类的方法,执行的是父类的方法。
构造方法有哪些特点?是否可被override?
构造方法特点如下:
名字与类名相同。
没有返回值,但是不能用void声明构造函数。
生成类的对象自动执行,无需调用。
构造方法不能被override(重写),但是可以被overload(重载),所以你可以看到一个类中有多个构造函数的情况。
类的构造器的作用是什么?
构造方法是一种特殊的方法,主要作用是完成对象的初始化工作。
重载和重写的区别
重载:发生在同一个类中,方法名必须相同,参数类型不同,个数不同顺序不同,方法返回值和访问修饰符可以不同
重写:是子类对父类的允许访问的方法的实现过程进行重新编写,发生在子类中,方法名,参数列表必须相同,返回值范围小于父类,访问修饰符范围大于等于父类,抛出的异常范围小于父类。另外,如果父类方法访问修饰符为private则子类就不能重写该方法。也就是说方法提供的行为改变,而方法的外貌并没有改变。
接口抽象类的区别是什么?
共同点:
都不能被实例化
都可以包含抽象方法
都可以有默认实现的方法(Java8可以用default关键字在接口中定义默认方法)。
区别:
接口主要用于对类的行为进行约束,你实现了某个接口就具有了对应的行为。抽象类主要用于代码复用,强调的是所属关系。
一个类只能继承一个类,但是可以实现多个接口。
接口中的成员变量只能是 public static final 类型的,不能被修改且必须有初始值,而抽象类的成员变量默认default,可在子类中被重新定义,也可被重新赋值。
在调用子类构造方法之前会调用父类没有参数的构造方法,其目的是?
帮助子类做初始化工作,为了对象实例化
子类中所有的构造器都会默认调用父类的无参构造器,因为每一个子类构造器内的第一行都有一条隐式的super()
若父类中没有无参构造器,那么子类的构造器内必须通过super语句指定要调用父类中的构造器
若子类构造器中用this来指定调用子类自己的构造器,那么被调用的构造器也一样会调用父类中的构造器
==与equals区别?
==:他的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象(基本数据类型比较的是值,引用数据类型比较的是地址).
equals():它的作用也是判断两个对象是否相等。但它一般有两种使用情况:
类没有覆盖equals()方法。则通过equals()比较该类的两个对象时,等价通过”==“比较这两个对象
类覆盖了equals()方法。一般,我们都覆盖equals()方法来比较两个对象的内容是否相等;若它们的内容相等,则返回true(即,认为这两个对象相等)。
final关键字修饰这三个地方:变量,方法,类,会有什么作用
对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
当final修饰一个类时,表明这类不能别继承。final类中的所有成员方法都会被隐式地指定为fianl方法。
final修饰的方法不可以被重写。
使用final方法的原因有两个。第一个原因就是把方法锁定,以防任何继承类修改它的含义;第二个原因时效率,在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升(现在的Java版本已经不需要使用final方法进行优化了)。类中所有的方法都隐式的指定为final。
描述深拷贝和浅拷贝
浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递的拷贝,此为浅拷贝。
深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝。
当某个场景下,接口与继承这2种均可用时,如何判断何种更合适?
继承:是面向对象分析与设计最常用的方式之一,在应用系统的设计过程中,得到了广泛的使用。它的主要不足是,继承后的系统需要囊括整个继承树的信息,对新系统而言,冗余部分相当大;二是子类对父类的耦合很紧密,不利于系统的扩展;
接口:有很大的灵活性,接口的不同实现方式,对于使用接口的客户而言,只是一种抽象的耦合。改变接口的实现,对客户代码的影响很小。
因此,如果某个功能的实现比较复杂,今后发生变化、引入不同实现方式的可能性比较大,一般采用接口的方式。如果有大量的功能,已经在父类得到实现,可以直接使用,并且,这些功能已经比较成熟,则采用继承的方式。