# 第三章:继承

本文详细介绍了Java的面向对象特性,包括类的继承、反射机制以及多态的概念和应用。强调了单继承、构造方法、成员变量和方法的继承规则。同时,讨论了多态的优势和弊端,以及如何通过强制类型转换解决多态下的特定方法调用问题。此外,还提到了抽象类、equals方法、泛型数组列表ArrayList和枚举类的使用。最后,探讨了阻止类继承的方法和设计良好的继承结构的技巧。
摘要由CSDN通过智能技术生成

基本思想:

  • 可以基于已有的类创建新的类,这个新的类可以使用父类的方法,而且可以扩展一些新的方法和字段。
  • 反射:程序运行期间更多的了解类以及其属性的能力

格式

public class sonClass extends fatherClass{

}
  • 子类可以继承父类得那些内容

    • 构造方法:public——不能,private——不能
    • 成员变量:public——能,private——能
    • 成员方法:public——能,private——不能
  • java只支持单继承,不支持多继承,但支持多层继承

多态

  • 定义:同类型的对象,表现出的不同形态

  • 表现形式:

    父类类型 对象名称 = 子类对象
    
  • 多态的前提:

    1. 有继承/实现(接口)关系
    2. 有父类引用指向子类对象 //FatherClass obj = new sonClass()
    3. 有方法重写
  • 多态调用成员的特点

    • 变量调用:编译,调用都看左边
      • 编译看左边的意思是:javac编译代码时,会看左边的父类中有没有这个变量,有就编译成功,没有则失败
      • 运行看左边:java运行代码的时候,实际获取的就是左边父类中成员变量的值
    • 方法调用:编译看左边,运行看右边
      • 编译看左边:javac编译代码时,会看左边的父类中有没有这个方法,如果有,编译成功
      • 运行看右边:java运行代码时,实际上运行的是子类中的方法
  • 多态的优势

    • 在多态形式下,右边对象可以实现解耦合,便于扩展和维护
    • 定义方法的时候,使用父类型作为参数,可以接收所有子类对象,
  • 多态的弊端

    • 不能调用子类的特有功能,就是子类里如果有一个方法,但是父类没有,此时new出来的对象是不可以用子类的方法的

      class Father{
      	public void fatherFN(){
      		System.out.println("父类方法")
      	}
      }
      class Son extends Father{
      	@Override
      	public void father(){
      		System.out.println("重写父类方法")
      	}
      	public void sonFN(){
      		System.out.println("子类特有方法")
      	}
      }
      
      public class Test{
      	public static void main(String[] arg){
      	Father obj = new Son();
      	obj.sonFN();//此时会报错
      	}
      }
      
      解决方案1:把obj强制转换回Son类型
      	Son obj2 = (Son) obj
      

阻止类的继承

  • 使用final 关键字声明类,即可表明此类不可继承,里面的方法也会变成不可继承的,但是字段不会。

抽象类

  • 格式

    //抽象类
    public abstract class Person{
    	public abstract void PersonFn(){}
    }
    
  • 注意事项

    • 抽象类不能实例化
    • 抽象类不一定有抽象方法,有抽象方法的类一定是抽象类
    • 可以有构造方法
    • 抽象类的子类
      • 要么重写抽象类中的所有抽象方法
      • 要么是抽象类
  • equals:对象比较方法,判断对象引用是否相等

泛型数组列表 ArrayList

  • 声明:

    ArrayList<Employee> saffName = new ArrayList<Employee>(100);//100可选,表示初始容量
    
  • 添加元素:

    //Employee 表示和上面的employee是同一类型
    saffName.add(new Employee("..."))
    
  • 分配空间

    saffName.ensureCapacity(100)
    
  • 获取长度

    saffName.size();
    
  • 确定数组长度,不再发生变化

    saffName.trimToSize();
    此方法应该在确定不再向数组添加元素的时候才用
    
  • ArrayList<>,元素不可以是基本类型,但是可以是包装后的基本类型

    • java方法的参数总是按值传递

对象包装器

  • int——Integer类
  • long —— Long类
  • float——Float类
  • double——Double类
  • short——Short类
  • byte——Byte类
  • char——Character类
  • boolean——Boolean类
  • 前六个派生于于公共的超类Number

枚举类

  • 当需要定义一组常量的时候,强烈建议使用枚举类

  • 定义:类的对象只有有限个,确定的。我们称此类为枚举类

  • 示例:

    package com.shuaige.Person;
    
    public enum Size {
        SMALL("S"),MEDIUN("M"),LARGE("L"),EXTRA_LARGE("XL"),HELLOWORLD("HELLO");
        private String abbreviation;
        private Size(String abbreviation){
            this.abbreviation = abbreviation;
        }
        public String getAbbreviation(){
            return abbreviation;
        }
    }
    
    • 声明一个类,他刚好有四个实例,不可能构造新的对象
    • 枚举类的构造器总是私有的
  • 枚举类的方法

    • toString()

      Size.SMALL.toString();//返回'S'字符串
      
    • valueOf()

      Size s = Enum.valueOf(Size.class,"SAMLL")
      //将s设置成Size.SMALL
      //其中Size.class是用来获取Size类的class对象的
      
    • values()

      Size[] arrList = Size.values();
      //返回枚举类中的元素,并组成一个数组
      
    • ordinal()

      Size.MEDIUN.ordinal();//返回该元素所处位置的下标(索引)
      

继承的设计技巧

  • 将公共操作和字段放在父类中
  • 不要使用受保护的字段
  • 除非所有继承的方法都有意义,否则不要用继承
  • 在覆盖方法时,不要改变预期的行为
  • 使用多态,而不要使用类型信息
  • 不要滥用反射
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值