java的继承与多态


多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承单独的那个类即可。
多个类可以称为子类,单独这个类称为父类或者超类。

继承关系使用extends关键字进行实现,例如:class Studentextends  Person{}

Java不想C++一样是多分支继承,java是单继承结构的。

子类在构造方法中可以使用super()语句调用父类的构造方法。如果子类没有构造方法,编译器在编译阶段会自动给其添加一个无参的super()语句表示调用父类的构造方法,如果父类没有定义无参的构造方法。则编译器会报错。

当父类中的某一方法无法满足子类的需求时,子类就需要对父类中的同名函数进行覆盖(Override),重写方法体。一般为了表示这是子类对父类中的同名方法的覆盖,会加上@Override注解,以助于编译器的识别及判断,提高了程序的检错能力

继承的优点

(1)他可以将具有一定关系的类联系起来,利用已有的类创建一个子类,节省类代码,

(2)继承可以使程序组织层次更加清晰,有利于程序设计分析,减少错误的发生。

为什么子类一定要访问父类中的构造函数。

因为父类中的数据子类可以直接获取。所以子类对象在建立时,需要先查看父类是如何对这些数据进行初始化的。
所以子类在对象初始化时,要先访问一下父类中的构造函数。
如果要访问父类中指定的构造函数,可以通过手动定义super语句的方式来指定。

子类的实例化过程。

结论:
子类的所有的构造函数,默认都会访问父类中空参数的构造函数。
因为子类每一个构造函数内的第一行都有一句隐式super();
当父类中没有空参数的构造函数时,子类必须手动通过super语句形式来指定要访问父类中的构造函数。
当然:子类的构造函数第一行也可以手动指定this语句来访问本类中的构造函数。
子类中至少会有一个构造函数会访问父类中的构造函数。

public class Test 
{
        public static void main(String[] args)
        {
                Student s = new Student("lisir",22);
                System.out.println(s.getName() + "-----" + s.getAge());
        }
}
class Person
{
        private String name;
        private int age;
        public void setName(String name) {
                this.name = name;
        }
        public String getName() {
                return name;
        }
        public void setAge(int age) {
                this.age = age;
        }
        public int getAge() {
                return age;
        }
        Person(String name,int age)
        {
                this.name=name;
                this.age=age;
        }
        
}
class Student extends Person
{
        Student(String name,int age)
        {
                super(name,age);    //使用super关键字使用了父类的构造方法
        }        
}

java的 多态性

多态性是java中三大面向对象特征之一,他使的程序更加灵活,拓展性高。

即可以认为一个子类对象既是属于子类的,又是属于父类的对象。即可以理解为事物存在的多种形态。

多态的前提
必须是类与类之间有关系。要么继承,要么实现。
通常还有一个前提:存在覆盖。

多态的特点 
(1)成员函数:
<1> 编译时:要查看引用变量所属的类中是否有所
  调用的成员。
<2>在运行时:要查看对象所属的类中是否有所调
  用的成员。
(2)成员变量:
只看引用变量所属的类。

abstract class Animal
{
	abstract void eat();
}

class Cat extends Animal
{
	public void eat()
	{
		System.out.println("吃鱼");
	}
	public void catchMouse()
	{
		System.out.println("抓老鼠");
	}
}


class Dog extends Animal
{
	public void eat()
	{
		System.out.println("吃骨头");
	}
	public void kanJia()
	{
		System.out.println("看家");
	}
}

class Demo 
{
	public static void main(String[] args) 
	{
		function(new Cat());
		function(new Dog());
		function(new Pig());
	}
	public static void function(Animal a)
	{
		a.eat();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值