重学 Java第6天 面向对象

207 阅读8分钟

Java 面向对象编程

封装:通过 Java的类来实现数据和操作方法的封装,对外界可以将每一个Java类都视为一个黑箱,只需要调用该黑箱提供的方法才能进行访问
继承:通过类的继承,便于将统一的功能集中在父类中,实现代码的重用和可维护性
多态:通过重载、重写与覆盖,实现不同类的不同形态特征
封装(encapsulation[inˌkaps(y)əˈlāSH(ə)n]) —— 类
把封装的类进行实例化,可以生成多个对象,这些对象通过消息传递进行交互,最终完成复杂的任务
消息传递:激活指定的某个对象的方法,以改变器状态或让他产生一定的行为

一个类的使用过程,包括封装类、生成实例、使用实例进行操作3个过程
类的封装
一个类就是变量和相关方法的集合,其中变量表明对象的状态,方法表明对象所具有的行为

封装的特点:
  事务的内部实现细节隐藏起来
  对外提供一致的公共的接口——间接访问隐藏数据
  可维护性
对象的生成
封装的类不是对象,要使用该封装类进行操作,必须先生成该类的一个实例——对象。对象的生成包括声明、实例化和初始化3方面的内容
  
ClassName objectName声明了一个类型 ClassName 的对象。其中 ClassName是组合类型(包括类和接口)。对象的声明并不为对象分配内存空间
运算符 new 为对象分配内存空间,实例化一个对象。new 调用对象的构造方法,返回对该对象的一个引用(即该对象所在的内存地址)。用 new 可以为一个类实例化多个不同的对象
生成对象的最后一步是执行构造方法,进行初始化。由于对构造方法可以进行重写,所以通过给出不同个数或类型的参数会分别调用不同的构造方法
对象的使用
对象的使用包括引用对象的成员变量和方法,通过运算符可以实现对遍历的访问和方法的调用,变量和方法可以通过设定一定的访问权限来允许或禁止其他对象对它的访问
继承(inheritance[inˈherədəns])——抽象类
继承的概念——超类和子类
Java术语中,被继承的类叫超类(superclass),继承超类的类叫子类(subclass)
  
Java不支持多超类的继承
子类不能访问私有属性和方法
尽管子类包括超类的所有成员,但它不能访问超类中被声明成private
  
一个被定义成 private 的类成员为此类私有,它不能被该类外的所有代码访问、包括子类
父类和子类的相互转换
在Java中,我们可以将子类的引用赋给父类的对象,那么这时子类中那些不是从父类继承来的成员将不可见,我们可以再通过强制类型转换将这个父类再转换成子类类型,那些成员又变得可见了,由此可见,将子类引用赋给父类对象时,Java虚拟机并没有将那些非继承成员丢弃
使用 this 和 super
this
  引用当前类的变量或方法
  this.变量名
  this.成员函数提名(实参)
  
super
  它引用当前对象的直接父类中的成员\(用来访问直接父类中被隐藏的父类中成员数据或函数,积累与派生类中有相同的成员定义时)
  super.变量名
  super.成员函数据名(实参)
  
this(参数)
  引用当前类的构造函数
多态(polymiorphism)——方法的覆盖(override)、重载(overload)、重写(overwrite)
覆盖——继承了父类的同名无参函数
  为子类从父类继承一个无参方法,而又定义了一个同样的无参方法,则子类新写的方法覆盖父类的方法,称为覆盖
  对于方法的访问限制修饰词,子类方法要比父类的访问权限更高
  
重载——继承了父类的同名有参函数
  当子类继承了父类的一个同名参数,且方法参数不同,则称为重载,子类可以重新实现父类的某些方法,使其具有自己的特征
  
重写——当前类的同名方法
  通过方法重写,一个类可以有多个具有相同名字的方法,由传递给它们的不同个数和类型的参数来决定使用哪种方法。因此,重写的名称是当前类中的同名函数,不是父类中的函数名
必须被继承的类——抽象类
抽象类的定义
  在abstract class方式中,可以有自己的数据成员,也可以有非abstract的成员方法,也可以有抽象方法,抽象方法只有函数定义部分,没有函数体,函数的具体实现要在子类中编写
  
抽象类的继承
  抽象类是一种特殊的父类,必须通过继承才能够使用,继承的方法与普通的类没有什么区别,使用extends 关键字,不同的是,它必须实现所有的abstract 方法
不能被继承的类——最终类
final 类的定义
  final 类不能被继承,没有子类,final类中的方法默认是finalfinal 方法不能被子类的方法覆盖,但可以被继承
  final 成员变量表示常识,只能被赋值一次,赋值后值不再改变
  final 不能用于修饰构造方法
  
父类的 private 成员方法是不能被子类方法覆盖的,因此 private类型的方法默认是 final类型的
  
final 方法的定义
  如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final 方法
  · 把方法锁定,防止任何继承类修改它的意义和实现
  · 高效,编译器在遇到调用final 方法时会转入内嵌机制,大大提高执行效率
  
关于 final成员赋值的规定
  final成员能且只能被初始化一次
  final成员必须在声明时或者在构造方法中被初始化,而不能在其他的地方被初始化
多重继承——接口类
接口的含义
Java中的接口是一系列方法的声明,是一些方法特征的集合,接口只有方法的特征没有方法的实现,因此这些方法可以在不同的方法被不同的类实现,而这些实现可以具有不同的行为
  
  Java接口——Java语言中存在的结构,有特点的语言和结构
  接口——一个类所具有的方法的特征集合,是一个逻辑上的抽象
  
  一个类只有一个直接父类,但可以实现多个接口
接口的创建与实现
interface关键字用来一个接口,它可以产生一个完全抽象的类,并且不听任何具体体现
  接口中的方法可以有参数列表和返回类型,但不能有任何方法体
  接口中可以包含字段,但是会被隐式地声明为staticfinal
  接口中的字段只是被存储在该接口的静态存储区域内,而不属于该接口
  接口中的方法可以被声明public或不声明,但是结果都会按照public类型处理
  实现一个接口时,需要将被定义的方法声明为public类型,否则会默认访问类型,Java编译器不允许这种情况
  如果没有实现接口中所有方法,那么创建的仍然是一个接口
  扩展一个接口来生成新的接口应使用关键字 extends,实现一个接口使用 implements
  接口的定义和类的定义很相似,只是关键字不同,关键字为 interface
  	public interface 接口名 {}
	Java接口的方法只能是抽象的和公开的,Java接口不能有构造器。Java接口本身没有任何实现,因为	Java接口不涉及表象,而只描述public行为,所以Java接口比Java抽象类更抽象化
    public interface 接口名 {
    	public 返回值类型 方法名(Params params);
  	}
	Java接口可以是 public的,静态的和final 属性
    public interface 接口名 {
    	public static int a = 1;
    	public final int b = 2;
  	}
	要使用一个接口,在定义一个类时,必须使用implements来声明接口类
    public class MyClass implements 接口 {
      public Type func(Params params);
    }


可以通过implements 关键字实现多个接口,那么该类必须实现这些接口的所有接口方法
接口与抽象类的区别
抽象类可以提供实现方法,而接口不能提供
抽象类只能继承一个,而可以实现多个接口

Java接口在最上面,然后紧跟着抽象类,这就将两者的最大优点发挥到极致了。这个模式就是 默认适配者模式
  
如果要创建不带任何方法定义和成员变量的基类,那么就应该选择这个接口而不是抽象类
如果知道某个类应该是基类,那么第一个选择的应该是让它成为一个接口,只有在必须要有方法定义和成员变量的时候,才应该选择抽象类。因为抽象类中允许存在一个或多个被具体实现的方法,只要方法没有被全部实现该类就仍是抽象类