Java面向对象高级

继承

  创建子类前必须先创建父类,因此子类的构造方法中必须要使用super关键字先调用父类的构造方法,否则报错。当父类有无参构造方法时(父类中已经写了一个无参构造方法,或者一个构造方法也不写,系统自动生成无参构造方法)系统会默认先调用super(),所以super()可以不写。因此,写构造方法时先用super关键字调用父类的方法更能体现规范的。

子类实例化内存分析

  创建子类对象时会先创建父类对象并用super记录父类对象的引用。

super关键字

  使用super关键字可以访问父类非private修饰的构造方法、属性和方法。

重载和重写的区别

  1.发生的位置。
    重载:一个类中
    重写:子父类中
  2.参数列表限制。
    重载:必须不同
    重写:必须相同(其子类也看做相同)
  3.返回值类型
    重载:与返回值类型无关
    重写:返回值类型必须一致(子类也看做相同)
  4.访问权限
    重载:与访问权限无关
    重写:子类方法的访问权限大于等于父类
  5.异常处理
    重载:与异常无关
    重写:异常范围可以更小

final关键字

  final修饰的类不能被继承;final修饰的方法不能被重写;final修饰的变量是常量,不能被修改,而且必须被初始化。

抽象类

  如果一个类有部分不能确定的地方,我们可以把类设计成抽象类,把能确定的部分先写好,不能确定的部分设计为抽象方法。抽象类不能被实例化;抽象类不能用final修饰;抽象类可以有构造方法(即使不编写构造方法也有一个默认的无参构造方法);不能使用new实例化,但实例化子类时也会被jvm实例化。

接口

  如果一个类的方法全部是抽象方法,属性全是全局常量(用public static final修饰),那么此时可以将这个类定义为接口。
  面向接口编程思想:这种思想是接口是定义(规范、约束)与实现的分离。优点:
    1.降低程序的耦合度(模块与模块之间的粘性,如果模块之间的粘性过大,就有可能一方出问题的时候另一方也跟着出问题):假设一个程序有10个模块,10个模块需要协同(有共同的约束),写到第6个模块时发现约束需要修改,麻烦就来了,前面的代码都没有考虑后续的东西。
    2.易于程序的扩展:如果某一个模块需要升级,把模块拿下来再改,通过定义接口的方式更灵活一些;
    3.有利于程序的维护。假设4个类都已经写好了,现在需要把4替换掉,而1,2,3都用到了4,因此1,2,3都需要改一改,可能导致一个小的删除引发了很多bug。面向接口编程思想就不会出现这样的问题,因为接口关注的是抽象部分,一个项目在没有写之前通过抽象的方式把规范约束都给定义出来了,程序有哪些功能通过接口描述出来了,有哪些方法也通过接口描述出来了,相当于从宏观的角度已经把程序设计好了,但是程序流程中没有任何一行已经实现的代码。规范制定好之后再按照规范严格的实现出来,写出的项目就会按照规范来走。当某一个环节出错了我们需要换掉它,我们只需要再按照规范写一份新的实现方式,把不合适的实现方式替换掉。类与类之间进行交互的时候应该使用接口进行交互。
  接口的简写:1.全局常量简写。可以省略public static final关键字,例如public static final int a=1;;可以简写为int a=1; 2.抽象方法的简写。可以省略public abstract关键字,例如public abstract void print();可以简写为void print();

接口和抽象类的区别

  1.抽象类被继承,接口被实现。
  2.接口只能声明抽象方法,抽象类中可以声明抽象方法,也可以写非抽象方法。
  3.接口中的变量只能是静态常量,抽象类中的变量是普通变量。
  4.抽象类使用继承来使用,无法多继承;接口使用实现来使用,可以多实现。
  5.抽象类中可以包含static方法,但是接口不允许(静态方法不能被子类重写,因此接口中不能声明静态方法)。
  6.接口中不能有构造方法和main方法,但是抽象类中可以有。

多态

  概念:对象的多种表现形态。
  体现:1.子类是父类的一种形态。2.方法的重载和重写也是多态的一种,不过是方法的多态,相同方法名的多种形态。
  多态的使用:对象的类型转换。1.向上转型:子类实例变为父类实例。2.向下转型:父类实例变为子类实例。

Object类

  Object类是所有类的父类。使用Object可以接收任意引用数据类型。Object类中的常用方法有toString方法、equals方法。

内部类

  在另一个类里面或一个方法里面定义的类称为内部类。内部类有4种:成员内部类、局部内部类、匿名内部类、静态内部类。
  1.成员内部类:在另一个类的内部定义。特点:可以无条件访问外部类所有成员属性和成员方法(包括private修饰的和static修饰的)。  当成员内部类的属性和方法与外部类的属性和方法重名时,调用形式为:外部类.this.成员变量,外部类.this.成员方法。  外部使用成员内部类的形式:外部类.内部类名 内部类对象名=外部类对象实例.new 内部类名();。
  2.局部内部类:在方法中定义的类。特点:只能在方法内创建这个类的对象并使用;局部内部类只能使用final修饰的局部变量,因为方法运行过后非final修饰的局部变量会被销毁。经验证后发现,有时使用非final修饰的变量也没问题,但只要外部对该变量做出修改,编译器就会报错(现在我终于知道新创建的线程使用外部变量时有时会报错有时不报错的原因了)。
  3.匿名内部类:定义一个没有类名的类并创建它的示例,要求这个类必须由继承一个类或实现一个接口。形式:new 父类构造方法() | 接口(){}。特点:匿名内部类中不能定义构造函数;匿名内部类中不能存在任何的静态成员变量和静态方法;匿名内部类属于局部内部类;匿名内部类不能是抽象的,它必须实现继承的类或实现的接口的所有抽象方法。
  4.静态内部类:和成员内部类类似,也是在另一个类内部定义,区别在于有static关键字修饰。特点:可以访问外部类中static修饰的成员属性和成员方法。外部使用静态内部类:外部类名.内部类名 对象名=new 外部类名.内部类名();,这和成员内部类的区别在于不用事先创建一个外部类对象。

8种基本数据类型和包装类

  short、int、long、float、double、char、boolean、byte分别对应Short、Integer、Long、Float、Double、Char、Boolean和Byte。
  包装类的好处:1.可以作为对象看待。2.提供对基本数据类型操作的方法。

方法的可变参数

  JDK1.5之前,一个方法中定义完了参数,则在调用的时候必须传入与其一一对应的参数,JDK1.5之后,可以根据需要传入任意多个参数。使用格式例:int…nums表示nums是可变参数,调用时可以传入0-n个参数。在方法的内部,以数组的形式接收。注意:可变参数只能出现在参数列表的最后。

异常处理

  1.什么是异常?异常是在程序中导致程序运行终端的指令流(由jvm产生)。
  2.异常的体系结构。
在这里插入图片描述
  3.throws和throw。throws关键字主要在方法的声明上使 用,表示方法中不处理异常,而交给调用处处理。throw关键字表示在程序中人为的抛出一个异常。
  4.RuntimeException运行时异常。运行时异常不需要捕获。因为这是由于程序员的错误,应该从逻辑的角度上去处理。例如空指针异常,总不能每次调用对象方法时都捕获异常。非运行时异常应该捕获。
  5.try-catch-finally 中哪个部分可以省略? catch和finally可以省略其中一个 , catch和finally不能同时省略 注意:格式上允许省略catch块, 但是发生异常时就不会捕获异常了,我们在开发中也不会这样去写代码.
  6.try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?答:finally中的代码会执行 详解:执行流程: 1. 先计算返回值, 并将返回值存储起来, 等待返回 2. 执行finally代码块 3. 将之前存储的返回值, 返回出去; 需注意:1. 返回值是在finally运算之前就确定了,并且缓存了,不管finally对该值做任何的改变,返回的值都不 会改变 2. finally代码中不建议包含return,因为程序会在上述的流程中提前退出,也就是说返回的值不是try或 catch中的值3. 如果在try或catch中停止了JVM,则finally不会执行.例如停电- -, 或通过如下代码退出 JVM:System.exit(0)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值