我们都知道JAVA面向对象的三大特性: 封装,继承,多态。
对于继承我们在平常的撸代码的过程中十分常见,但是具体的一些细节问题可能在面试过程中还是不能第一时间回答上来。我们来整理一下
继承的概念:
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
class 父类 {
}
class 子类 extends 父类 {
}
在java中继承只能是单继承,即子类只能由一个父类。我们可以通过继承完成对类的一个规范,减少代码的臃肿。
继承的特性:
子类拥有父类非private的属性,方法。
子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
子类可以用自己的方式实现父类的方法。(重写)
Java的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如A类继承B类,B类继承C类,所以按照关系就是C类是B类的父类,B类是A类的父类,这是java继承区别于C++继承的一个特性。
提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。
父类
public class FatherClass {
private String money ="老爹 有 1个亿";
public String house = "老爹 有大别墅";
static String car="老爹 有大本";
private String moneny() {
return money;
}
static String car() {
return car;
}
public String house() {
return house;
}
}
package extendTest;
public class sonClass extends FatherClass {
private String money ="儿子 继承 1个亿";
public String house = "儿子 继承大别墅";
static String car="儿子 继承 大奔";
private String moneny() {
return money;
}
static String car() {
return car;
}
public String house() {
return house;
}
}
子类调用父类的属性和方法:
修改子类中house方法:
public String house() {
System.out.println( " 父类方法 house: "+ super.house() );// 使用super调用父类方法
System.out.println( " 父类属性 house: " + super.house );// 使用super调用父类属性
return house;
}
Test:
public static void main(String[] args) {
sonClass sonClass = new sonClass();
String house = sonClass.house();
System.out.println( house );
}
// 父类方法 house: 老爹 有大别墅
//父类属性 house: 老爹 有大别墅
//儿子 继承大别墅
我们获取到了父类的方法和属性了。
子类调用父类私有属性。
首先子类不能直接调用父类的私有方法和私有属性。
那我们间接的来。
给父类的私有变量添加public方法
private String money ="老爹 有 1个亿";
public String getMoney() {
return money;
}
public void setMoney(String money) {
this.money = money;
}
Test
sonClass sonClass = new sonClass();
System.out.println( sonClass.getMoney() );
//老爹 有 1个亿
子类能否继承父类的构造函数?
不能。
增加父类构造函数
FatherClass( ){
System.out.println("我是父类的构造函数");
}
增加子类构造函数:
sonClass(){
System.out.println("我是子类的构造函数");
}
Test
sonClass sonClass = new sonClass();
//我是父类的构造函数
//我是子类的构造函数
这不是子类继承父类的构造函数,而是类加载的时候会先加载父类的构造函数,如果是方法的继承,应该只打印子类的构造函数。
这里是方法的调用关系,每一个子类的构造函数 都有隐式的 super()。
增加带参的构造方法:
FatherClass( int a){
System.out.println("我是父类的构造函数" + a);
}
子类:
// 编译报错:
sonClass(){
System.out.println("我是子类的构造函数");
}
修改:
sonClass(){
super(1);
System.out.println("我是子类的构造函数");
}
编译通过
请问 方法重写和方法重载的区别;
方法重写 即子类重写父类方法,
特点:
1 方法名相同
2 方法参数类型及参数顺序相同
3 返回值类型 小于等于父类
4 抛出的异常类 小于等于 父类
5 访问权限 大于等于 弗雷
方法重载:
方法重载即对同一个方法多种表达形式
1 方法名相同
2 参数类型或者参数个数/参数顺序 不同
与返回值类型 ,访问权限修饰符 没有关系。