Java面向对象基础

1 对象和类


  • 类:类是一个模板,它描述一类对象的行为和状态。
  • 对象:对象是类的一个实例,有状态和行为。(软件对象的状态就是属性,行为通过方法体现。方法操作对象内部状态的改变,对象的相互调用也是通过方法来完成。)
  • 创建对象:声明+实例化+初始化 Dog dog = new Dog("andy");
  • Import语句:Import语句就是用来提供一个合理的路径,使得编译器可以找到某个类。

2 封装

  • 封装(Encapsulation)是指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。防止该类的代码和数据被外部类定义的代码随机访问。要访问该类的代码和数据,必须通过严格的接口控制。

3 继承

  • 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

  • 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。父类更通用,子类更具体。子类会具有父类的一般特性也会具有自身的特性。

  • 格式:class 子类 extends 父类 { }

  • Java 不支持多继承,但支持多重继承。(多继承:子类有多个直接父类;多重继承:C继承B,B继承A)

  • 继承的特性:

    子类拥有父类属性、方法(除构造方法)。
    子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
    子类可以用自己的方式实现父类的方法。
    Java 的继承是单继承,但是可以多重继承,这是 Java 继承区别于 C++ 继承的一个特性。
    提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。

  • java.lang.Object是所有类的祖先类,当一个类没有继承的两个关键字(extends, implements),则默认继承object。

    implements 类继承接口关键字,可以多继承。
    public class C implements A,B { }

  • super:引用当前对象的父类。

  • final:修饰类时,该类不能被继承;修饰方法时,该方法不能被子类重写。

  • 构造器:子类不可以继承父类的构造方法,只可以调用(显示或隐式)父类的构造方法。

    • 子类中所有的构造函数都会默认访问父类中的空参数构造函数,因为子类的构造函数内第一行都有默认的super()语句,super()表示子类在初始化时调用父类的空参数的构造函数来完成初始化。
      一个类都会有默认的空参数的构造函数,若指定了带参构造函数,那么默认的空参数的构造函数,就不存在了。这时如果子类的构造函数有默认的super()语句,那么就会出现错误,因为父类中没有空参数的构造函数。因此,必须在子类的构造函数中通过this或super(参数)指定要访问的父类中的构造函数。
      子类不可以继承父类的构造方法
    • 子类默认调用父类构造函数调用的原因是,父类可能有私有字段需要由其构造函数初始化。
      java中的父类和子类的构造函数
    • 这也是为什么final不能修饰构造函数,因为构造方法不是被继承的,所以用final修饰无意义。

4 重写与重载

  • 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变(java7中返回类型可以是父类返回值的派生类)。子类能够根据需要实现父类的方法。
  • 重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。

    例如: 父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,因为 Exception 是 IOException 的父类,只能抛出 IOException 的子类异常。

	Animal b = new Dog();   //Dog类继承Animal类
	b.move();  //Animal类中有move()方法,则b.move()可以执行,但是执行Dog类中的move()方法
	b.bark();  //如果bark()方法只在Dog类中而Animal类中没有,则会编译错误,因为首先会检查b的引用类型Animal
  • 在编译阶段,只是检查参数的引用类型。然而在运行时,Java虚拟机(JVM)指定对象的类型并且运行该对象的方法。

  • 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected。

  • 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。

    • 按照异常需要处理的时机分为编译时异常(也叫强制性异常)也叫 CheckedException 和运行时异常(也叫非强制性异常)也叫 RuntimeException。
    • Java 认为 Checked异常都是可以被处理的异常,所以 Java 程序必须显式处理 Checked 异常。如果程序没有处理 Checked 异常,该程序在编译时就会发生错误无法编译。这体现了 Java 的设计哲学:没有完善错误处理的代码根本没有机会被执行。
    • 对 Checked 异常处理方法有两种:
      1 当前方法知道如何处理该异常,则用 try…catch 块来处理该异常。
      2 当前方法不知道如何处理,则在定义该方法是声明抛出该异常。
    • 运行时异常只有当代码在运行时才发行的异常,编译时不需要 try catch。Runtime 如除数是 0 和数组下标越界等,其产生频繁,处理麻烦,若显示申明或者捕获将会对程序的可读性和运行效率影响很大。所以由系统自动检测并将它们交给缺省的异常处理程序。当然如果你有处理要求也可以显示捕获它们。
    • https://www.cnblogs.com/jyy599/p/12081415.html
  • 重载:是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。(无法以返回值类型作为重载函数的区分标准。)

  • 方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。

5 多态

  • 多态是同一个行为具有多个不同表现形式或形态的能力。就是同一个接口,使用不同的实例而执行不同操作。(同一个事件发生在不同的对象上会产生不同的结果。)

  • 多态的实现:重写、接口、抽象类和抽象方法;

    存在的必要条件,要有继承、重写、父类引用指向子类对象

  • 多态实现的方法:动态绑定。在执行期间确定所引用对象的实际类型,根据实际类型调用相应的方法。
    理解java的三大特性之多态

6 抽象类

  • 抽象类不能被实例化。除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。必须被继承才能被使用。
  • 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
  • 继承抽象方法的子类必须重写该方法。否则,该子类也必须声明为抽象类。最终,必须有子类实现该抽象方法,否则,从最初的父类到最终的子类都不能用来实例化对象。
  • 构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。

7 接口

  • 接口并不是类,编写接口的方式和类很相似。类描述对象的属性和方法。接口则包含类要实现的方法。
  • 除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。接口无法被实例化,但是可以被实现。
  • 接口中所有的方法必须是抽象方法。(隐式抽象的,不用写abstract;隐式的指定为public abstract,其他修饰符会报错)
  • 接口不能包含成员变量,除了 static 和 final 变量。(接口中的变量会被隐式的指定为 public static final 变量)
  • 类在实现接口的方法时,不能抛出强制性异常,只能在接口中,或者继承接口的抽象类中抛出该强制性异常。
  • 一个接口能继承另一个接口,使用extends关键字。允许多继承。
  • 标记接口:是没有任何方法和属性的接口,它仅仅表明它的类属于一个特定的类型。

    用来建立一个公共的父接口,如EventListener。例如:当一个接口继承了EventListener接口,Java虚拟机(JVM)就知道该接口将要被用于一个事件的代理方案。

8 包

  • 用于区别类名的命名空间,访问控制,使定位相关类更加方便。

    把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
    同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的。
    包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。

  • 创建包:package pkg1.pkg2...; 位于源文件第一行。

  • 导入包:import,位于package之后,类定义之前。

  • 通常,一个公司使用它互联网域名的颠倒形式来作为它的包名.例如:互联网域名是 nowcoder.com,所有的包名都以 com.nowcoder 开头。包名中的每一个部分对应一个子目录。

  • 可以分开来安排源码(.java)和类的目录(.class)。类目录的绝对路径叫做 class path。设置在系统变量 CLASSPATH 中。默认情况下,编译器和 JVM 查找当前目录。JAR 文件包含 Java 平台相关的类,所以他们的目录默认放在了 class path 中。

【参考文档】https://www.nowcoder.com/tutorial/10001/4c968225fbaa4e5ba4830edb0b8288cc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值