继承
1.概念
子类对象具有父类的实例域和方法,子类从父类继承方法。
2.格式
class parent{
}
class child extends parent{
}
3.为什么继承
有两个类老鼠和企鹅,分别要求如下:
·老鼠:属性(姓名,id)、 行为(吃,睡,自我介绍)
·企鹅:属性(同上)、行为(同上)
class Mouse{
String name;
int id;
public Mouse(String name,int id){
this.name = name;
this.id = id;
}
public void sleep(){
System.out.println(name+" is sleeping");
}
public void eat(){
System.out.println(name+" is eating");
}
public void introduce(){
System.out.println("my name is "+name);
}
}
class Penguin{
String name;
int id;
public Penguin(String name,int id){
this.name = name;
this.id = id;
}
public void sleep(){
System.out.println(name+" is sleeping");
}
public void eat(){
System.out.println(name+" is eating");
}
public void introduce(){
System.out.println("my name is "+name);
}
}
两类都可以抽出很多共性,比如都属于动物类,都具有相似属性和行为,则加上继承如下:
public class test {
public static void main(String[] args) {
Animal mo = new Mouse("jiji",1);
Animal pe = new Penguin("pp",2);
mo.eat();
pe.introduce();
}
}
class Animal{
String name;
int id;
public Animal(String name,int id){
this.name = name;
this.id = id;
}
public void sleep(){
System.out.println(name+" is sleeping");
}
public void eat(){
System.out.println(name+" is eating");
}
public void introduce(){
System.out.println("my name is "+name);
}
}
class Mouse extends Animal{
public Mouse(String name,int id){
super(name,id);
}
}
class Penguin extends Animal{
public Penguin(String name,int id){
super(name,id);
}
}
输出:
jiji is eating
my name is pp
4.特性
·子类可以拥有父类的非private属性和方法
·子类可以有自己的属性方法
·子类可以重写父类的方法
·可以多继承,A继承B,B继承C
·提高代码间的耦合性(缺点)
5.关键字
extends、implements、super、this,final
1)extends:
这个关键字只能实现单一继承,即一个子类只能拥有一个父类。
2)implements:
类可以实现多个接口实现多继承
interface A{
public void eat();
public void run();
}
interface B{
public void drink();
}
class C implements A,B{
@Override
public void drink() {
// TODO Auto-generated method stub
}
@Override
public void eat() {
// TODO Auto-generated method stub
}
@Override
public void run() {
// TODO Auto-generated method stub
}
}
3)super、this
super用来实现子类对父类成员的访问。
this指向自己的引用。
public class test {
public static void main(String[] args) {
Animal a = new Animal();
a.eat();
Mouse m = new Mouse();
m.eatTest();
}
}
class Animal{
public void eat(){
System.out.println("Animal is eating");
}
}
class Mouse extends Animal{
public void eat(){
System.out.println("Mouse is eating");
}
public void eatTest(){
super.eat();
this.eat();
}
}
输出:
Animal is eating
Animal is eating
Mouse is eating
4)final
用final关键字定义的类不可以被继承,定义的方法不可以被重写。
6.构造器
子类不继承父类的构造器,只调用。如果父类的构造器有参数,则必须在子类的构造器中通过super调用构造函数并配以适当的参数列表。如果父类参数列表没有参数,则不用通过super调用,系统会自动调用父类的无参构造器。
public class test {
public static void main(String[] args) {
Animal a = new Animal();
Animal b = new Animal("b");
Mouse c = new Mouse();
Mouse d = new Mouse("d");
}
}
class Animal{
public Animal(){
System.out.println("no parameter Animal is instansed");
}
public Animal(String name){
System.out.println("parameter Animal is instansed");
}
}
class Mouse extends Animal{
public Mouse(){
System.out.println("no parameter Mouse is instansed");
}
public Mouse(String name){
super(name);
System.out.println("parameter Mouse is instansed");
}
}
输出:
no parameter Animal is instansed
parameter Animal is instansed
no parameter Animal is instansed
no parameter Mouse is instansed
parameter Animal is instansed
parameter Mouse is instansed