Java学习笔记五-Java继承

来源:互联网 发布:网络暴力新闻评论 编辑:程序博客网 时间:2024/05/18 02:40

1.关于Java的继承

继承是对象式编程的一个非常实用以及普遍的知识. 首先要了解继承的概念, 我们知道对于自然界的很多东西, 我们都有归类. 例如动物有陆地动物, 水里动物, 空中动物; 陆地动物又有狮子, 狼, 豹子….; 水中动物又有蛇, 鱼…; 空中有麻雀, 老鹰…; 就像这样, 继承和这个也很像, 狮子继承了陆地动物在陆地上生活的特性, 鱼继承了水中动物生活特性.

所以在对象式编程中, 继承是一个非常实用的东西, 例如我们写一个商品的基类, 我们给他写几个成员变量, 名字, 价格, 给他写一个方法(销售). 那么我们在写一个衣服的类, 是不是就可以让这个继承商品的类, 我们只需要加入一个尺码, 颜色的成员变量就可以正常销售了?

2. 类的继承格式

class 父类 {}class 子类 extends 父类 {}

我们可以这样来写两个类, 父类和普通类一样正常声明, 而子类一定要用extends关键字来声明, 这样子类就继承了父类非private的成员变量以及方法.

final关键字, 这里我们在提及一下final关键字, 用final关键字声明的类, 是不能被继承的, 就是不可以成为父类的意思. 如下

final class 类名 {    //这个类是不可以被继承的}

现在我们来看一个实例, 首先我们创建一个JavaAnimal的类

public class JavaAnimal {    String name;    int age;    private String priName;    public JavaAnimal (String myName,int myAge) {        name=myName;        age=myAge;        priName=myName;    }    public void eat() {        System.out.println("Animal("+name+") 在吃饭");    }     public void run() {        System.out.println("Animal("+name+") 在跑步");    }}

这里我们的JavaAnimal作为父类, 声明了2个成员变量name, age, 以及一个private成员变量priName. 还有两个公开的方法, eat(); run();

现在我们在来实现一个他的子类JavaCat.

public class JavaCat extends JavaAnimal {    public JavaCat (String myName,int myAge){        super(myName,myAge);    }    public static void main(String[] args) {        JavaCat cat=new JavaCat("Tom",3);        cat.eat();        cat.run();    }    //重写父类方法,如果父类方法满足需求,可以不重写,如直接run方法的直接调用    public void eat (){        //super.eat() 是调用父类的eat方法, 可以加上和去掉这一句看看打印结果        super.eat();        System.out.println("Cat("+super.name+") 正在吃");    }}

编译上述代码, 打印结果为

Animal(Tom) 在吃饭
Cat(Tom) 正在吃
Animal(Tom) 在跑步
[Finished in 0.8s]

看到打印结果, super.eat(); 成功的执行了父类的eat方法, 并继续执行了下边自定义的打印函数, cat.run()直接执行了父类的run方法.

3. 几个常用关键字

首先说一下super和this关键字, 这俩也是比较常用的.

我们在父类中加一个变量num

int num=1;

在子类中加一个打印方法

public void printNum (){        System.out.println("super.num="+super.num+"-----this.num="+this.num);    }

子类main函数执行, cat.printNum(); 发现打印结果为

super.num=1—–this.num=1

这时候我们在子类中重新声明这个变量num并初始化, int num=2;再次编译, 结果为

super.num=1—–this.num=2

也就是说, super可以引用当前对象的父类成员变量, this可以引用当前对象的成员变量; 当然你也可以用这个试着引用一下方法.

但是这两个关键字在main函数中直接引用会报如下的错.

错误: 无法从静态上下文中引用非静态 变量 this this.eat();

原因很简单, 是因为在main函数中, 你声明了一个对象, 然而你使用this或者super关键字, 它根本不知道这个对象, 因为main函数中可以声明很多对象. 但是方法就不一样了, 你必须要用对象来调用这个方法, 所以这是唯一对应的关系. 也就是这个时候你使用this或者super, 它也能知道你使用的是cat对象和cat的父类.

4. 构建函数

假设父类的构建函数没有参数, 那么在子类中可以重写构建函数, 也可以不写构建函数, 他会默认执行父类没有参数的构建函数.

但是当父类的构建函数有参数时, 那么在子类的构建函数中, 如果想要继承父类的构建函数, 那么一定要显示的使用super关键字来继承父类构建函数, 并代入对应参数. 如下

public JavaCat (String myName,int myAge){        super(myName,myAge);    }

当然你可以试一下, 不写这个构建函数, 然后直接使用下边这句代码, 你会发现这时候报错了.

JavaCat cat=new JavaCat(“Tom”,3);

当然除了构建函数, 别的函数都可以直接调用, 例如, 我们在父类中增加一个sleep(int time)函数.

public void sleep(int time){        System.out.println("Animal("+name+")睡了"+time+"小时");    }

这时候在子类中, 直接使用

cat.sleep(3);

发现打印结果为

Animal(Tom)睡了3小时

成功执行了父类的方法.

5. 小结

关于继承就简单的说这么些, 这是一个很简单的技巧, 但是它很实用, 当然要想用的好, 还是需要更多的实战, 以及参考, 熟练的掌握这个技能, 会让你的代码变得更加整洁, 简洁, 有层次. 当然可能在你接触一个正式的项目之前, 你会觉得这个东西很鸡肋. 但是相信我, 等你开始接触项目一段时间后, 你会发现这个很有用, 并且在一些优秀的源码中, 这个东西你会发现并不陌生.

0 0
原创粉丝点击