Java 第二弹- 继承

继承是什么

按照现有类的类型来创建新类,无需改变现有类的形式,采用现有类的形式并在其中添加新代码,这种方法就叫做继承。继承会使子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法。也就是说,子类和父类是“相似的”。下面举一个继承的例子:
在这里插入图片描述
如上图所示,动物继承生物类;老虎又继承动物类。从这个例子中可以明显看出:越往上的类是越抽象,越往下的类越具体。而在我们在设计的时候,父类也往往是比较抽象的类。接下来我们来看看如何使用继承。

继承关键字 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(私有的), 其适用范围如下:

修饰符同一个类同一个包子类任何地方
privateyes
defaultyesyes
protectedyesyesyes
publicyesyesyesyes

继承的初始化顺序

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()。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值