面向对象3

面向对象的特征--继承

概念

什么是继承?

通俗地来讲呢,就是子类继承父类。运用extends关键字来实现继承。

为什么用继承?

子类继承父类以后,子类就可以使用父类所有地功能,不需要重复定义了,大大提高了代码地复用性,这就叫做代码重用。

而子类在自己内部也可以扩展自己特有地功能,不影响其他类,这就叫做代码扩展。

具体语法:

基类(把共有的属性和行为定义在基(父)类中,让其他类去继承即可),从而派生出新的类。

注:子类extends父类,就拥有了父类的行为和属性,但是子类不能访问父类私有的。

继承中的传递性:可以实现多层继承,但是不允许一个类直接继承多个类。

object类是Java中所有类的基类,当一个类没有使用extends继承其他类时,这个类就默认继承object类。

继承的要求:要满足is-a关系,这是代码重用的根基。

继承中的构造方法

创建子类对象,调用子类的构造方法时,会先调用父类的构造方法;默认调用无参构造方法。

使用super();关键字来调用父类的构造方法,必须要放在构造方法体的第一行,因为先要确保父类中的属性初始化;

 public Animals(String name,int age){
        super();//必须在构造方法体中的第一行
        System.out.println("Animals类中的有参构造方法");
        this.name = name;
        this.age= age;
    }

使用super表示父类,对父类中的成员(构造方法,成员变量,成员方法)进行访问;

注:使用super调用父类构造方法时,不会创建父类对象,只会把父类中的信息加载到子类中进行存储。

创建对象时,类的初始化顺序是,会先对父类初始化,然会才是子类。

this与super

this表示访问自己类中的成员;

super表示访问父类中的成员。

方法重写

应用场景:当父类中的方法实现(功能)不能满足子类的需求时,可以在子类中对父类的方法进行重写。

方法重写的要求:方法的结构与父类保持一致,方法名,参数,返回值均保持一致,且访问权限大于等于父类权限。

父类中的方法,原封不动的在子类中进行定义,称为子类重写父类方法;@Override是注解标签,表示此方法是从父类中重写而来的,在编译期间就会进行语法上的校验。

注:构造方法,静态方法不能重写,成员变量不存在重写。

抽象类

首先先了解以下抽象方法,在Java中有一种方法没有方法体(没有具体的实现),主要用来定义功能,定义规范,且用abstract关键字修饰的方法就是抽象方法。

public abstract void eat();

而一个类中有不完整的,没有实现的抽象方法,那么这个类也就必须是一个抽象类,用abstract修饰。

抽象类除了不能创建对象外,类的其他功能都有;抽象类一般作为基类,被其它类继承,然后让子类去重写它里面所有的抽象方法去实现功能,否则也要将其定义为抽象类。

面向对象的特征--多态

概念

多态:同一种事物,在不同时刻表现出不同状态

存在条件:1.要有继承(包括接口的实现,前提条件),2.要有重写(前提条件),3.父类引用指向子类对象;

Animal d = nwe Dog();//向上转型,子类转为父类类型,这样父类类型就可以表示任意子类类型

注:由于有了继承关系,才可以用父类类型指向子类对象

多态语法下使用父类类型进行访问时特点:

  • 非静态方法:编译看左边,执行看右边;

  • 静态成员方法:编译和运行都看左边;

  • 成员变量:编译和运行都看左边。

优点:子类默认向上转为父类类型,提高程序扩展性;

缺点:上升为父类类型后,不能访问子类中的特有方法

解决方法:将父类类型向下转型为子类类型

Dog dog = (Dog)animal;//向下转型

注:向下转型需要注意判断类型是否是指定类型,否则会出现不能转换的问题;使用instanceof关键字判断animal运行时,所表示的对象类型是否为指定类型;

if(Animal instanceof Dog){
Dog dog = (Dog)animal;//向下转型
}

final关键字

  • 修饰类:是不能被其他类继承的,Java中提供的许多类,都是被final修饰的;

  • 修饰方法:不能被子类重写;

  • 修饰局部变量(包括形参):一旦被赋值,值就不能改变;

  • 修饰成员变量:

static final int n = 0;//在定义之初就将值给定,值就不能改变;直接在类能赋值,只用1份。
final int n;//在类中进行定义时,不进行赋值操作,必须在构造方法中进行初始化赋值操作,表示             //  在每个对象中都有一份常量。
//有参构造方法
public A(int count){
     n = count;
}

接口

使用interface关键字来定义接口,用来定义功能,规则和规范,它是一种更彻底的抽象。所有接口与抽象类一样是不能创建对象的,不同的是接口也不能有成员变量,构造方法;成员方法是抽象的,默认的,静态的。

接口可以定义那些内容呢?

可以定义抽象方法,静态常量,默认方法(通过子类对象进行访问),静态方法(通过接口名访问);

public interface MyInterface {
    
     //public static final  int a =  10;
                    int a =  10; //静态常量
    
      //public abstract void eat();
                    void eat();//抽象方法

        /*
           默认方法,通过子类对象进行方法
         */
        public default  void test1(){
            System.out.println("default test1");
        }

        /*
           静态方法, 通过接口名访问
         */
        public static  void test2(){
          System.out.println("static test2");
        }
       }

接口与类之间:类实现(implement)接口,要么重写接口中所有的抽象方法,要么将此类声明为抽象类。

接口也接口之间:Java中的接口可以一次继承多个接口。

总结:

接口的特性

  • 接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字

  • 接口中方法可以是抽象的,静态的,默认的

  • 接口中声明的属性默认为 public static final 的

  • 接口不是被类继承了,而是要被类实现

  • 接口不能创建对象

  • 与继承关系类似,接口与实现类之间存在多态性(满足多态的三个条件)

 Fly  fly = new Bird();//与继承关系类似,接口与实现类之间存在多态性
  • 一个接口能继承其它多个接口

  • 当类实现接口的时候,类要实现接口中所有的抽象方法。否则,类必须

  • 声明为抽象的类

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值