JAVA学习笔记之继承,多态和接口

JAVA学习笔记之继承,多态和接口

<1>继承

         1如何表达这个关系呢?

                  通过extends关键字可以实现类与类的继承

                  格式:

                          class子类名 extends 父类名 {

                         

                          }

         父类:基类,超类

         子类:派生类

         继承的特点:

                  A:Java只支持单继承,不支持多继承。

                  B:Java支持多层()继承(继承体系)

 

         2什么时候使用继承呢?

                  我们可以从多个事物中根据属性将其用相同的食物概括的时候,及两者属于“is a”的关系时

 

         3继承间的成员变量关系:

                  A:名字不同,非常简单。

                  B:名字相同

                          首先在子类局部范围找

                          然后在子类成员范围找

                          最后在父类成员范围找(肯定不能访问到父类局部范围)

                          如果还是没有就报错。(不考虑父亲的父亲…)

                          就近原则。

4继承间构造方法的关系:

                  子类中所有的构造方法默认都会访问父类中空参数的构造方法(super()),且这句话必须在子类构造方法的第一条语句,当你自己写出时;如果是没写,则默认。

原因:因为子类会继承父类中的数据,可能还会使用父类的数据。

                  所以,子类初始化之前,一定要先完成父类数据的初始化。

                  每个子类的构造方法的第一行,有一条默认的语句:

                          super();

                  注意:仅仅是完成数据的初始化,创建对象目前必须用new申请空间。

下面给出继承示例的相关代码:

packagecom.edu_04;

 

public class Animal {

    //成员变量

    private String type;

    private String name;

    private int age;

   

    //set,get方法

    public String getType() {

        return type;

    }

    public void setType(String type) {

        this.type = type;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public int getAge() {

        return age;

    }

    public void setAge(int age) {

        this.age = age;

    }

   

    //有参无参构造

    public Animal(){System.out.println("这是Animal的无参构造");}

    public Animal(String type,String name,int age){

        System.out.println("这是Aniaml的有参构造");

        this.type = type;

        this.name = name;

        this.age = age;

    }

   

    public void eat(){

        System.out.println("动物喜欢吃粮食");

    }

}

packagecom.edu_04;

 

public class Dog extends Animal{

//  建立Dog的有参无参构造

    public Dog(){System.out.println("这是Dog的无参构造方法");}

    public Dog(String type,String name,int age){

        super(type,name,age);

        System.out.println("这是Dog的有参构造方法");

        setAge(age);

        setName(name);

        setType(type);

    }

   

   

}

public class Test {

public static void main(String[] args) {

    Dog d= new Dog();

    d.setAge(10);

    d.setName("lixiaojuan");

    d.setType("金毛");

    System.out.println(d.getName()+"  "+d.getType()+"  "+d.getAge());

   

    System.out.println("---------------------------");

    Dog d2 = new Dog("藏獒","lixiaojuan",10);

    d2.eat();

   

}

}

<2>多态

         ·基本概念:同意对象在不同时刻的不同表现形式;如水的不同形态,液态水,水蒸气,冰,但这里有些许不同,不同形态的对象,代码所实现的功能不同。

·多态的前提:

                  A:有继承关系        

                  B:有方法重写(不是必要条件,但是只有有了方法重写多态才有意义)

                  C:有父类引用   指向  子类对象

                          Fu f= new Fu();

                          左边:Fu类型的引用

                          右边:Fu类型的对象

                                   Zi z = new Zi();

                                   Fu f = new Zi();                 

·成员访问特点

                  A:成员变量

                          编译看左边,运行看左边

                  B:构造方法

                          子类构造默认访问父类的无参构造

                  C:成员方法(重点理解)

                          编译看左边,运行看右边

 

                          为什么变量和方法不一样呢?

                                   方法重写。

                  D:静态成员方法

                          编译看左边,运行看左边

                          因为静态的内容是和类相关的,与对象无关。

·抽象类

         ··抽象类特点:

                  A:抽象类和抽象方法必须用abstract关键字修饰

                  B:抽象类不一定有抽象方法,有抽象方法的类一定是抽象类

                  C:抽象类不能实例化

                          那么,如果实例化并使用呢?

                          按照多态的方式,由具体的子类实例化。其实这也是多态的一种,抽象类多态。

                  D:抽象类的子类

                          要么是抽象类

                          要么重写抽象类中的所有抽象方法

 

         ··抽象类的作用:

                  强制要求子类必须要重写某些方法。

         ··抽象类的成员:

                  成员变量:可以是变量,也可以是常量。

                  构造方法:有构造方法

                          不能实例化,构造方法有什么用呢?

                          用于子类访问父类数据的初始化。

                  成员方法:既可以是抽象的,也可以是非抽象的。

抽象类及多态的示例代码:

class Fu{

    int age;

   

    int num = 30;

    public Fu(){

        System.out.println("这是fu的无参构造器");

    }

    public Fu(int age){

        System.out.println("这是Fu的有参构造");

        this.age = age;

    }

   

    public void show(){

        System.out.println("fushow方法");

    }

   

    public void method(){

        System.out.println("fumethod方法");

    }

}

 

class Zi extends Fu{

    int age;

    int num = 20;

    public Zi(){

        System.out.println("这是Zi的无参构造器");

    }

    public void show(){

        System.out.println("Zishow方法");

    }

    public void method(){

        System.out.println("zimethod方法");

    }

}

 

public class DuoTaiDemo {

public static void main(String[] args) {

    Fu f = new Zi();//父类引用指向子类对象

    System.out.println(f.num);

    System.out.println("-------------");

    f.show();

    System.out.println("-------------");

    f.method();

}

}

 

public abstract class Animal {

    private String type;

    private String name;

   

    public Animal(){}

    public Animal(String type,String name){

        this.setType(type);

        this.setName(name);

    }

    public String getType() {

        return type;

    }

    public void setType(String type) {

        this.type = type;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

   

    public abstract void eat();

}

public class Cat extends Animal{

    public Cat(){}

    public Cat(String type,String name){

        setType(type);

        setName(name);

    }

   

    public void eat(){

        System.out.println("猫爱吃鱼");

    }

    public void catchMouse(){

        System.out.println("猫会捉老鼠");

    }

}

public class Test {

public static void main(String[] args) {

    Animal a = new Dog();

    a.eat();

    Dog d = (Dog)a;

    d.lookDoor();

   

    System.out.println("-------------------");

    Animal a2 = new Cat("xiaojaun","加菲猫");

    a2.eat();

    Cat c = (Cat)a2;

    c.catchMouse();

    System.out.println(c.getName() + "   " + c.getType());

    //子类c继承了父类a2的成员

}

}

<3>接口

    ·当我们可以从多个对象中可以提取出相同的特点时,我们便可以用接口表示这一特点

    ·基本概念:类实现接口代表着这个类自身功能的一种扩展

    ·接口的特点:

        A:定义接口要用关键字interface表示

            格式:interface 接口名 {}

        B:类实现接口用implements表示   

            格式:class 类名 implements 接口名 {}

        C:接口不能实例化

            那么,接口如何实例化呢?

            按照多态的方式,由具体的子类实例化。其实这也是多态的一种,接口多态。

        D:接口的实现类

            要么是抽象类

            要么重写接口中的所有抽象方法

    ·接口的成员特点:

        A:成员变量

            只能是常量。

            默认修饰符:public static final

        B:构造方法

            没有构造方法

        C:成员方法

            只能是抽象方法。

            默认修饰符:public abstract

    ·类与类:

        继承关系。只能单继承,可以多层()继承。

   

    ·类与接口:

        实现关系。可以单实现,也可以多实现。

        还可以在继承一个类的同时实现多个接口。

 

    ·接口与接口:

        继承关系。可以单继承,也可以多继承。

相关理解性代码如下:

public class Person {

    private String name;

    private String gender;

    //建立有参无参构造

    public Person(){}

    public Person(String name,String gender){

        this.setName(name);

        this.setGender(gender);

    }

    //建立相应的get()set()方法

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public String getGender() {

        return gender;

    }

    public void setGender(String gender) {

        this.gender = gender;

    }

    public void love(){

        System.out.println("人知道爱");

    }

}

public class Student extends Person{

    public Student(){}

    public Student(String name,String gender){

        setName(name);

        setGender(name);

    }

   

    public void task(){

        System.out.println("学生会写作业");

    }

    public void show(){

        System.out.println(this.getName() + " " + this.getGender());

    }

}

public interface SmokingInter {

    public abstract void somke();

}

public class SomkingStudent extends Student implements SmokingInter{

    public SomkingStudent(){}

    @Override

    public void somke() {

        // TODO Auto-generated method stub

        System.out.println("这个学生会抽烟");

    }

 

}

public class Test {

public static void main(String[] args) {

    Person p = new Student();

    p.love();

    Student s = (Student)p;

    s.task();

   

    System.out.println("--------------------");

    SomkingStudent ss = newSomkingStudent();

    ss.love();

    ss.task();

    ss.somke();

}

}

public class Teacher extends Person{

    public Teacher(){}

    public Teacher(String name,String gender){

        setName(name);

        setGender(gender);

    }

   

    public void Speak(){

        System.out.println("这个老师能讲课");

    }

}

public class SmokingTeacher extends Teacher implements SmokingInter{

 

    @Override

    public void somke() {

        // TODO Auto-generated method stub

        System.out.println("这老师抽烟");

    }

 

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值