不二极端编程之JAVA基础总结(2)

来源:互联网 发布:淘宝是怎么做的 编辑:程序博客网 时间:2024/05/16 18:19

这里写图片描述

一、继承概述

1.继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类

2.继承就是子类继承父类的特征和行为,是的子类对象具有父类的属性和方法,或者子类从父类继承方法,是的子类具有父类相同的行为


二、继承的好处

1.继承关系的传递的,若类C继承类B,类B继承类A,则类C既有从类B那里继承下来的属性和方法,也有从类A哪里继承下来的属相和方法,还可以有自己行定义的属性和方法,继承来的属性和方法尽管是隐式的,但仍是类C的属性和方法,继承在一些比较一般的类的基础上构造,建立和扩充新类的最有效的手段继承简化了人们对事物的认识和描述,能清晰体现相关类见的层次结构关系

2.继承提供了软件复用功能,若类B继承类A,那么建立类B时只需要再描述与基类不同的少量特征即可,这种做法能减小代码和数据的冗余度,大大增加程序的重用性

3.继承通过增强一致性来减少模块间的接口和界面,大大增加了程序的易维护性

4.提供多重继承机制,从理论上来说,一个类可以是多个一般类的特殊类,它可以从多个一般类中继承属性和方法,这便是多重继承,java处于安全性和可靠性的考虑,仅支持单重继承,二通过使用接口机制来实现多重继承


三、Java中继承的特点

1.子类拥有父类非private的属性,方法

2.子类可以拥有自己的属性和方法,即子类可以对父类进行拓展

3.子类可以用自己的方式实现父类的方法

4.Java的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如A类继承B类,B类继承C类,所以按照关系就是C类是B类的父亲,B类是A类的父亲,这是Java继承区别与C++继承的一个特性

5.提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系)


四、Java中继承需要注意的事项?以及我们什么时候使用继承?

重写方法的规则:

1.参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载

2.返回的类型必须是一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载

3.访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)

4.重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常

例如:
父类的一个方法申明了一个检查异常IOException,在重写这个方法时就不能抛出Exception,只能抛出IOException的子类异常,可以抛出非检查异常

重载方法的规矩:

1.必须具有不同的参数列表

2.可以有一样的返回类型,只要参数列表不同就可以了

3.可以有不同的访问修饰符

4.可以抛出不同的异常

重写和重载的区别在于:

重写多态性起作用,对调用被重载过的方法可以大大减少代码的输入量,同一个方法只要往里面传递不同的参数就可以拥有不同的功能和返回值

如果类之间存在着:is a 的关系,就可以考虑使用继承
不要为了继承部分功能,而去使用继承


五、继承中构造方法的执行流程?

例子:

class Person{    static {        System.out.println("执行Person静态代码块");    }    {        System.out.println("执行Person构造代码块");    }    public Person(){        System.out.println("执行Person构造方法");    }}class Student extends Person{    static {        System.out.println("执行Student静态代码块");    }    {        System.out.println("执行Student构造代码块");    }    public Student(){        System.out.println("执行Student构造方法");    }}public class ExtendsStaticConstruct {    public static void main(String args[]){        Student student = new Student();    }}

执行结果如下:


执行Person静态代码块

执行Student静态代码块

执行Person构造代码块

执行Person构造方法

执行Student构造代码块

执行Student构造方法

说明程序的执行顺序是:

静态代码块 —》 构造代码块 —》 构造方法

执行流程解释:

New的是Student类,但是Student是继承自Person类,所以在加载Student类时要先加载Person类,而静态的内容是随着类的加载而加载的,所以先打印“执行Person静态代码块”,后执行Student的静态代码块。

加载完类后,开始走main方法,执行Student构造方法上,即初始化Student,但是Student是继承自Person,必须先初识化Person,所以先调用Person类的空参构造方法进行初始化,但是Person类的构造代码块优先于构造方法执行,所以Person类的构造代码块先执行,构造方法后执行。

然后再执行Student类的构造代码块和构造方法。

这里的执行顺序同子类构造中有一个默认的父类构造super()无关,不是执行到隐藏的super()才开始初始化父类的,类的初始化是分层舒适化,即先初始化父类,再初始化子类,初始化每个类的过程中,进行类的初识化工作,先进行成员变量的初始化。

成员变量的初始化顺序是:默认初始化,即int为0这种 —》 显示初始化,例如给int类型显示初始化的值 —》 构造方法初始化,所以是这里执行到了构造方法。

但是一定要注意,父类初始化选择的构造方法却和子类中super选择的构造相关

例子:

class Person{    static {        System.out.println("执行Person静态代码块");    }    {        System.out.println("执行Person构造代码块");    }    public Person(){        System.out.println("执行Person无参构造方法");    }    public Person(String name){        System.out.println("执行Person构造方法"+ name);    }}class Student extends Person{    static {        System.out.println("执行Student静态代码块");    }    {        System.out.println("执行Student构造代码块");    }    public Student(String name){        super(name);        System.out.println("执行Student构造方法" + name);    }    public Student(){        super();        System.out.println("执行Student无参构造方法");    }}public class ExtendsStaticConstruct {    public static void main(String args[]){        Student student1 = new Student("lili");        System.out.println(" -------------------------------");        Student student2 = new Student();    }}

执行结果:

执行Person静态代码块

执行Student静态代码块

执行Person构造代码块

执行Person构造方法lili

执行Student构造代码块

执行Student构造方法lili


执行Person构造代码块

执行Person无参构造方法

执行Student构造代码块

执行Student无参构造方法


六、判断如下代码的输出:

程序1:


class Fu{    public int num = 10;    public Fu(){        System.out.println("fu");        }    }class Zi extends Fu{    public int num = 20;    public Zi(){        System.out.println("zi");        }    public void show(){        int num = 30;        System.out.println(num);        System.out.println(this.num);        System.out.println(super.num);        }    }class Test1_Extends {    public static void main(String[] args) {        Zi z = new Zi();        z.show();    }}

输出结果如下:

fu

zi

30

20

10


程序2:

class Fu1 {    static {        System.out.println("静态代码块Fu1");        }{        System.out.println("构造代码块Fu1");        }    public Fu1() {        System.out.println("构造方法Fu1");        }    }class Zi1 extends Fu1 {    static {        System.out.println("静态代码块Zi1");        }        {        System.out.println("构造代码块Zi1");        }    public Zi1() {        System.out.println("构造方法Zi1");        }

输出结果如下:

静态代码块Fu1

构造代码块Fu1

构造方法Fu1

静态代码块Zi1

构造代码块Fu1

构造方法Fu1

构造代码块Zi1

构造方法Zi1


七、编写如下类,实现继承:

这里写图片描述

代码如下:

public class Inheril {    public static void main(String[] args) {        grassAnimal ga = new grassAnimal("兔子", 1, "白色", 4, "萝卜");        ga.eat();        ga.sleep();        ga.introduction();        meatAnimal ma = new meatAnimal("狮子", 2, "黄色", 4, "熟肉");        ma.eat();        ma.sleep();        ma.introduction();        grassAnimal ga1 = new grassAnimal("小绵羊", 3, "黑色", 4, "青草");        ga1.eat();        ga1.sleep();        ga1.introduction();        meatAnimal ma1 = new meatAnimal("金钱豹", 4, "黄底黑斑", 4, "生肉");        ma1.eat();        ma1.sleep();        ma1.introduction();    }}class animal{    private String name;    private int id;    private String color;    private int foot;    private String food;    public  animal(String name,int id,String color,int foot,String food) {        this.name = name;        this.id = id;        this.color = color;        this.foot = foot;        this.food = food;    }    public void eat() {        System.out.println(name + "喜欢" + food);    }    public void sleep() {        System.out.println(name + "吃完了就要睡觉了");    }    public void introduction() {        System.out.println("大家好!我的编号是" + id + ",我叫做" + name + ",我有" +     foot + "条腿,我的毛发颜色是" + color);    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getColor() {        return color;    }    public void setColor(String color) {        this.color = color;    }    public int getFoot() {        return foot;    }    public void setFoot(int foot) {        this.foot = foot;    }    public String getFood() {        return food;    }    public void setFood(String food) {        this.food = food;    }}class grassAnimal extends animal{    public grassAnimal(String name,int id,String color,int foot,String food) {        super(name, id, color, foot, food);    }}class meatAnimal extends animal{    public  meatAnimal(String name,int id,String color,int foot,String food) {        super(name, id, color, foot, food);    }}

输出结果如下:

兔子喜欢萝卜

兔子吃完了就要睡觉了

大家好!我的编号是1,我叫做兔子,我有4条腿,我的毛发颜色是白色

狮子喜欢熟肉

狮子吃完了就要睡觉了

大家好!我的编号是2,我叫做狮子,我有4条腿,我的毛发颜色是黄色

小绵羊喜欢青草

小绵羊吃完了就要睡觉了

大家好!我的编号是3,我叫做小绵羊,我有4条腿,我的毛发颜色是黑色

金钱豹喜欢生肉

金钱豹吃完了就要睡觉了

大家好!我的编号是4,我叫做金钱豹,我有4条腿,我的毛发颜色是黄底黑斑