Java面向对象

封装

静态变量:

  • static是描述静态变量的方法,static String country;可以使变量从对象层级上升到类层级,整个类中只有一份,而且被全部对象共享。该变量随着类的加载而准备就绪,与是否创建对象无关。

静态方法

  • 静态方法可以不用创建对象,直接使用类名.的方式调用。

代码块与静态代码块

  • 代码块介于成员变量与成员方法之间,代码块内的内容随着对象的初始化而初始化。
  • 静态代码随着类的加载而加载,在类中只初始化一次。

静态代码块的初始化优先级最高

封装

封装的意义:

  • 通常情况下可以再测试类中给成员赋值一些合法但是不合理的内容,为了避免这些错误的发生,需要对成员变量进行封装,来隐藏成员变量的细节,保证成员变量的合法性,这个机制叫做封装。

封装的流程

  • 使用private关键字修饰成员变量进行私有化操作。
  • 提供公有的get和set方法来访问私有成员变量,并在方法体内部进行合理化判断。
  • public关键字修饰后的变量或者方法是公有属性。
  • 没有修饰符修饰的变量或方法叫做默认的访问权限,级别介于private与public之间。

实例:在Singleton类中定义一个对象,使得SingletonTest中main方法只能得到该类的一个对象

  1. 在Singleton中定义一个private修饰的私有Singleton构造方法。
  2. 声明本类型的引用指向本类型的对象,使用private和static修饰。
  3. 提供公有的get方法返回这个对象,使用public和static关键字修饰,使得能够在测试中使用类名.方法的方式来访问。Singleton s1 = Singleton.getInstance;

单例设计模式

  • 在某些特殊场合中,一个类对外提供且只提供一个对象时,这样的类叫做单例类,而设计单例的流程和思想被称作单例设计模式。
  1. 私有化构造方法,使用private关键字修饰。
  2. 声明本类类型的引用指向本类类型的对象,并使用private和static关键字共同修饰。
  3. 提供公有的get方法返回这个对象,并使用public和static关键字共同修饰。
  • 单例设计模式分为饿汉式和懒汉式。

饿汉式

  • 类的开始立刻初始化对象

懒汉式

  • 类的开始创建一个空引用,后续判断是否为空,若为空在指向对象。
  • 在调用方法时才开始执行判断。

继承

继承的概念

  • 当多个类之间有相同的特征和行为时,可以将相同的内容提取出来组成一个公共类,让多个类吸收公共类中已有的特征和行为而在多个类中只要编写自己独有的特征和行为的机制叫做继承。
  • java中使用extends关键字来表示继承。extends(扩展)后面的类叫做父类,超类,基类。前面的类叫做子类,派生类,孩子类。
  • 还用继承提高了代码的复用性,可维护性与扩展性,是多态的前提条件。

继承的特点

  • 子类不能继承父类的构造方法与私有方法。私有成员变量可以被继承但是不能直接访问。
  • 无论使用何种方式构造子类的对象时,都会自动调用父类的无参构造方法来初始化从父类中继承的成员变量,相当于在构造方法的第一行增加代码super()的效果。
  • 使用继承必须满足逻辑关系 : 子类 is a 父类,也就是不能滥用继承。
    Java中只支持单继承,不支持多继承,也就是说一个子类只能有一个父类,但是一个父类可以有多个子类。

方法的重写

  • 当父类中继承的方法不满足子类的需求时,就需要在子类中重新写一个和父类一样的方法来覆盖从父类中继承下来的版本,该方法就叫做方法的重写(Override)。
    @Override是注解,如果下面的代码没有构成重写则报错。
    子类重写方法后,同类下调用的都是重写后的版本,

方法重写的原则

  • 要求方法名相同,参数列表相同以及返回值类型相同。Java5以后可以返回子类的类型。
  • 要求方法的访问权限不能变小,可以变大或者相同。
  • 要求方法不能抛出更大的异常。

权限修饰符

修饰符 本类 同包中的类 子类 其他类
public 可以访问 可以访问 可以访问 可以访问
protected 可以访问 可以访问 可以访问 不能访问
默认 可以访问 可以访问 不能访问 不能访问
private 可以访问 不能访问 不能访问 不能访问

final关键字

  • final关键字可以修饰类,成员方法以及成员变量。
  • final关键字修饰的类表示在该类无法被继承,防止滥用继承。
  • final关键字修饰的方法可以被继承但是不可以被重写。防止不小心重写方法。
  • final关键字修饰的变量必须初始化并且不可被修改。初始化方法有三种,显示初始化,构造块初始化,构造方法体初始化。
  • 创建一个常量,通常与public static共同使用,常量的命名规范是所有字母都要大写,不同的单词之间采用下划线链接。

多态

多态的概念

  • 同一种事物表现得多种形态。

多态的语法格式

  • 父类类型 引用变量名 = new 子类类型();
    多态中会使用子类重写后的方法。编译阶段使用父类的方法。

多态的特点

  • 当父类类型的引用指向子类类型的对象时,父类类型的引用可以直接调用父类独有的方法。
    如果父类类型的引用直接调用子类的独有方法会报错,因为在编译阶段是使用父类的方法。
  • 对于父子类都有的非静态的方法,编译阶段使用父类的版本,运行阶段使用重写后的版本(动态绑定)
  • 静态方法的调用只取决于继承自那个类,与指向对象的类型无关。

多态的实际意义

  • 多态的实际意义在于屏蔽不同子类的差异性实现通用的编程带来不同的效果。

多态的使用场景

  • 通过参数传递形成了多态
  • 直接在方法体中使用抽象类的引用指向子类类型的对象

数据类型转换

  • 如果父类仍然需要调用子类的独有方法,需要将父类类型的引用强制转换为子类类型的引用。(可能会抛出异常,父类转换子类会为任意非null值生成ClassCastException)
  • 引用数据类型必须发生在父子类之间。必须发生继承关系
  • 若转换的目标类型并不是该引用真正指向的数据类型则编译通过,运行阶段抛出类型转换异常。
    为了避免上述错误的发生,需要判断,if(引用变量 instanceof数据类型)

抽象方法的概念

  • 抽象方法指不能具体实现的方法并且使用abstract关键字修饰,也就是没有方法体。
  • 访问权限 abstract 返回值类型 方法名(形参列表);

抽象类的概念

  • 抽象类主要指不能具体实例化的类并且使用abstract关键字修饰,也就是不能创建对象。因为抽象方法没有方法体,调用该方法没有意义,所以对创建对象作出限制。
  • 只有抽象类才能包含抽象方法。因此真正意义上的抽象类应该是具有抽象方法并且使用abstract关键字修饰的类。
    抽象类中可以有成员变量,构造方法,成员方法。
  • 抽象类的意义在于被继承。
  • 当一个类继承抽象类后必须重写抽象方法,否则该类也变成抽象类,也就是抽象类对子类具有强制性和规范性,因此被称为模板设计模式。

抽象类与接口的区别

  • 抽象类中可以有成员方法,接口中只能有抽象方法
  • 抽象类中增加方法时子类可以不用重写,接口中增加方法时实现类需要重写(java8之前的版本)。
    从java8开始增加新特性,接口中允许出现非抽象方法和静态方法,但非抽象方法需要使用default关键字修饰。
  • 从Java9开始增加新特性,接口中允许出现私有方法。

接口

  • 接口是比抽象类还抽象的类,所有的方法都是抽象方法。
    定义关键字是interface。 只能拥有常量,默认使用public,static,final共同修饰。
  • 从jdk1.9\Java9开始,允许接口中出现私有方法。
  • 使用implements实现多个接口
名称 关键字 关系
类与类之间的关系 使用extends表达继承关系 单继承
类与接口之间的关系 使用implements关键字表达实现关系 多实现
接口与接口之间的关系 使用extends表达继承关系 多继承

特殊类

内部类

  • 当一个类的定义出现在另外一个类的类体中时,那么这个类叫做内部类,而这个内部类所在的类叫做外部类。

实际意义

  • 当一个类的存在价值仅仅是为了服务某一个类,那么可以将这个类定义为内部类,这样可以隐藏该类的实现细节,并且可以方便访问外部类的私有成员而不用使用get和set方法。

内部类的分类

  • 普通内部类,可以定义成员变量,成员方法以及构造方法等,可以使用final或者abstract关键字修饰。可以使用private或者protected关键字修饰。创建对象需要使用外部类的对象来创建对象。如果内部类访问外部类中与本类内部同名的成员变量或者方法时,需要使用this关键字。

  • 静态内部类 使用static修饰,属于类层级。不能直接访问外部类的非静态成员,静态内部类可以直接创建对象,如果静态内部类访问外部类中与本类内同名的变量或方法时,需要使用类名.的方式访问。

  • 局部内部类,将类的定义放在方法体内部。只能在该方法内部使用,可以再内部直接创建对象,不能使用访问控制符与static等修饰符。可以使用外部方法的局部变量,但必须是final的。由于声明的周期不一致所致。从Java8开始,局部变量如果没有修饰且被内部类使用,则默认为final的。

  • 匿名内部类 没有名字的内部类重点
    接口/父类类型 引用变量名= new 接口/父类类型(){方法的重写};
    Java8出现了lamda表示式简化上述代码 (参数列表)-> {方法体}

  • 语法规则
    访问修饰符 class 外部类的类名{
    访问修饰符 class 内部类的类名{
    内部类的类体;
    }
    }

访问修饰符 class 外部类的类名{
访问修饰符 返回值类型 成员方法名(形参列表){
class 内部类的类名{
​ 内部类的类体;
​ }
​ }

​ }

回调模式

回调模式的概念

  • 回调模式是指如果一个方法的参数是接口类型,则在调用该方法时,需要创建并传递一个实现此接口类型的对象;而该方法在运行时会调用到参数对象中所实现的方法(接口中定义的)。

枚举

  • 基本概念:事物的取值只有固定的几个值,此时描述这些事物的所有值可以一一列举出来,而列举出来的类型就叫做枚举类型。枚举类型是Java5开始增加的一种引用数据类型,使用enum关键字定义。
  • 枚举值就是当前类的类型,也就是指向本类的对象,默认使用public static fianl共同修饰,因此采用枚举类型.的方式调用。
  • 枚举类中可以自定义构造方法,但是构造方法的修饰符必须是private,默认也是私有的。
public enum DirectionEnum{
	UP("向上"),DOWN("向下"),LEFT("向左"),RIGHT("向右");
       private final String desc;  //用于描述方向字符串的成员变量
    //私有化构造方法
       private DirectionEnum(Sring desc){
           this.desc = desc;
       }
    //提供公有的get方法返回内部的数值
       public String getDesc(){
           return desc;
       }

}

posted @ 2020-10-22 07:28  ColaIce  阅读(186)  评论(0)    收藏  举报