继承是什么
按照现有类的类型来创建新类,无需改变现有类的形式,采用现有类的形式并在其中添加新代码,这种方法就叫做继承。继承会使子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法。也就是说,子类和父类是“相似的”。下面举一个继承的例子:
如上图所示,动物继承生物类;老虎又继承动物类。从这个例子中可以明显看出:越往上的类是越抽象,越往下的类越具体。而在我们在设计的时候,父类也往往是比较抽象的类。接下来我们来看看如何使用继承。
继承关键字 extends
要想让一个类继承另一个类,就要使用到关键字 extends,举一个最简单的例子:
public class Test extends TestFather
{
}
表示的就是 Test 类继承了 TestFather 类,我们可以说,Test 是 TestFather 的子类,也可以说,TestFather 是 Test 的父类。Test 会继承 TestFather 的域和方法,也就是说 Test 的实例对象可以调用父类方法,这些方法都是在 TestFather 中定义的。
Object类是所有类的超类,我们每创建出一个类,即使没写Object类都会隐式地继承根类 Object。所以这就是为什么实例化对象后就可使用超类中方法,比如:equals
**
常见权限修饰符
**
Java中四种权限修饰符:public(公共的)、protected(受保护的)、default(默认的)、private(私有的), 其适用范围如下:
修饰符 | 同一个类 | 同一个包 | 子类 | 任何地方 |
private | yes | |||
default | yes | yes | ||
protected | yes | yes | yes | |
public | yes | yes | yes | yes |
继承的初始化顺序
1.初始化父类再初始子类
2.先执行初始化对象中属性,再执行构造方法中的初始化
public class Animal
{
public int age;
public String name;
public Animal()
{
System.out.println("Animal类被执行了!");
}
public void eat()
{
System.out.println("动物是可以吃东西的");
}
}
public class Dog extends Animal
{
public Dog()
{
System.out.println("Dog类被执行了");
}
}
public static void main(String[] args)
{
// TODO Auto-generated method stub
Dog d = new Dog();//主函数里只是创建了子类对象
d.age = 10;
d.name = "xiaotian";
d.eat();
}
运行结果为
可以看出仅仅是创建了子类对象,但它是先执行了父类的构造方法,然后执行子类的构造方法.我们就能证明当我们创建对象的时候,它是优先创建父类对象,然后创建子类对象
如果对象中有属性,属性和我们的构造方法在初始化的时候哪一个先执行呢
public class Animal
{
public int age=10;//为属性赋初值
public String name;
public void eat()
{
System.out.println("动物是可以吃东西的");
//这里的父类只是描述动物可以吃东西
}
public Animal()
{
System.out.println("Animal类执行了");
age = 20;//在执行构造方法的时候再为age赋一个值
//如果在程序中输出这个值,这个值其实应该是后一个的值,因为后面赋的值会把前面的覆盖掉
}
}
public static void main(String[] args)
{
// TODO Auto-generated method stub
//创建父类对象animal
Animal animal = new Animal();
System.out.println("animal age:"+animal.age);
Dog d = new Dog();//主函数里只是创建了子类对象
d.age = 10;
d.name = "xiaotian";
d.eat();
}
运行结果为:
显然构造方法的初始化方式是后执行的,所以属性的初始化是先执行的:
总结一下:
当我们创建一个子类对象的时候,先创建父类的属性进行初始化,然后执行父类的构造方法,接着执行子类的属性进行初始化,最后执行子类的构造方法。
**
final 关键字
**
我们都知道,final 关键字表示“这是无法改变的”的意思,显而易见,由 final 声明的方法或者变量是无法被重写的。所以一旦方法或者变量被声明为 final,方法体或者变量就无法修改。事实上,声明为 private 的方法或变量也会被隐式地声明为 final,所以声明为 private 的方法或变量也同样无法被重写。
**
super 的用法
**
1.super 表示超类,也就是父类。
2.super 可以调用父类的构造方法,格式为 super()。Java 会根据 super() 括号内的参数个数和参数类型调用相应的父类构造方法。
3.super 可以调用父类的域和方法,格式为 super.xxx,其中 xxx 为域成员或者方法名。
4.即使子类构造方法中未使用 super调用父类的构造方法,Java 仍然会在子类的构造方法中隐式地添加 super()。