Java面向对象

封装

静态变量:

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

静态方法

  • 静态方法能够不用建立对象,直接使用类名.的方式调用。

代码块与静态代码块

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

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

封装

封装的意义:

  • 一般状况下能够再测试类中给成员赋值一些合法可是不合理的内容,为了不这些错误的发生,须要对成员变量进行封装,来隐藏成员变量的细节,保证成员变量的合法性,这个机制叫作封装。

封装的流程

  • 使用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的。ide

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

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

访问修饰符 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;
       }

}code

相关文章
相关标签/搜索