面向过程和面向对象编程思想
面向过程 POP :所有事情的按步骤执行,注重执行的细节。 面向对象 OOP :所有事情在需要时让各个对象执行,注重创建解决问题的对象。 在面向对象中,给对象设计的方法,其实就是面向过程的。 对象 Object 某个类的具体实例,用于执行其类中的方法。 类 Class 是一系列拥有相同属性和行为的对象的集合。是对象的模板。 成员变量、局部变量、静态常量 成员变量:定义在类中的变量,使用范围在该类中,也称为这个类的属性,它有默认值,在对象创 建时创建,通过对象访问。 静态常量:特殊的成员变量,使用范围在该类中,用 static 和 final 修饰,它通常需要在定义时赋 值,在类加载时就创建,通过类名方法。 局部变量:定义在方法中的变量,使用范围在该方法中,它没有默认值,在赋值后才能使用,在方 法调用时创建。 [ 修饰符 ] class 类 { // 属性,定义变量 // 行为,定义方法 } 类名 对象名 = new 构造方法 ([ 参数 ]); 构造方法 是一种特殊的方法,方法名和类名一致,没有返回值部分。 没有返回值部分,方法名必须和类名一致 在使用 new 关键字创建对象时自动调用对应的构造方法 每个类在定义后,隐藏有一个默认的无参数的构造方法 如果自己写了一个构造方法后,默认隐藏的无参数的构造方法就会失效 构造方法通常用于初始化成员变量 构造方法之间都是重载关系,构造方法不能重写 构造方法执行时,不一定会创建对象。如抽象类中有构造方法,但该构造方法只在创建其子类对象 时自动调用。 面向对象的三大特性 封装 将类中的属性使用 private 修饰后,就可以不允许非当前类进行访问,以此达到保护核心代码的目的。 封装的步骤: (private 的使用 ) 1. 给类中的所有属性添加 private 修饰符 2. 给每个属性定义 setXX() 方法用于赋值 3. 给每个属性定义 getXX() 方法用于读取属性 继承 类 A extends 类 B ,类 A 就是类 B 的子类。类 A 就能直接使用类 B 中非私有成员。 或接口 A extends 接口 B 。 class Person { // 成员变量 String name ; // 默认 null // 静态常量 final static String country = " 中国 " ; // 定义方法 void info (){ // 局部变量 , 需要赋值才能使用 int age = 20 ; System . out . println ( " 我是 " + country + " 人,名叫 " + name + " ,今年 " + age + " 岁 " ); } } [ 访问修饰符 ] 类名 (){ } 重写 override 子类继承父类后,对父类中的某个非私有方法进行重写,达到拓展或重做的目的。 重写必须要求方法名、方法返回值、方法参数列表必须相同 访问权限不能比父类更严格 不能抛出比父类更大的异常 重载 overload 在一个类中,某个方法在不同的参数下,表现不同的效果。同名不同参。 方法名必须相同 方法参数列表必须不同 ( 类型和数量 ) 与返回值无关 多态 在继承中,子类的对象,可以保存到父类的变量中。再调用方法时,调用的是子类重写后的方法。 this 和 super 都可以当做对象或构造方法使用。 父类 对象 = new 子类 (); interface USB { void start (); } class Mouse implements USB { void start (){ // 重写方法 } } class Computer { void powerOn ( USB usb ){ usb . start (); } } class Main { public static void main ( String [] args ){ // 接口不能创建对象 //new USB(); // 创建子类对象,保存到父类 / 父接口的变量中 USB usb = new Mouse (); // 在需要使用父类 / 父接口对象时,实际传递子类对象 new Coumpter (). powerOn ( usb ); } } 当做对象: this 表示当前类的对象, super 表示当前类的父类对象 this 或 super 当对象时,只能用在非静态方法中。 当做构造方法: this() 表示当前类的无参构造方法, super() 表示当前类的父类的无参构造方法 this 或 super 当构造方法时,只能放在另一个构造方法的第一行。 每个继承关系中,如果父类和子类都没有重载构造方法时,子类里都有一个默认无参的构造方法,其中 在调用父类的无参的构造方法 如果重载了父类的构造方法,在子类的构造方法中,一定要调用父类的某个重载的构造方法 Object 类 是所有类的根类。任何类都直接或间接的继承了该类,但没有显式地写出来。所有类都可以调用或重写 Object 类中的方法。 toString() 在输出某个对象时自动调用的方法,默认 Object 中输出的是 “ 对象所在类的全限定名 @ 十六进制 哈希码 ” , 通常自己定义的类需要重写该方法,用于输出该对象中的属性。 equals() 是比较两个对象是否相同的方法,默认 Object 中使用 == 比较,所以自定义类后,如果要比较该 类的对象,一定要重写 equals 方法和 hashcode 方法,根据指定参数比较两个对象是否相同。 向上转型 子类对象保存到父类的变量中。 向下转型 class Father { } class Son extends Fahter { // 这段代码是隐藏的 Son (){ super (); } } class Father { Father ( String str ){} } // 继承时就会报错 class Son extends Fahter { // 子类的构造方法中,一定要调用父类的某个构造方法 Son (){ super ( "xxx" ); } } Person p = new Person (); Object obj = p ; 父类对象强行保存到子类的变量中。 final 用于修饰属性、方法和类 修饰属性:变量变为常量,不能改变其值。 修饰方法:方法不能被重写。 修饰类:类不能被继承。 abstract 用于修饰类和方法,表示抽象的。 修饰方法,该方法称为抽象方法,没有方法体,同时该方法所在类一定也要使用 abstract 修饰成为抽象 类。 抽象方法只能出现在抽象类中,不能出现在普通类中。 抽象类中可以没有抽象方法 抽象类中有构造方法,但该构造方法不能使用 new 调用,所以抽象类不能创建对象 抽象类中的构造方法,在创建其子类对象时自动调用 抽象类通常需要被继承,继承后子类一定要重写抽象类中的所有抽象方 interface 用于定义接口的关键字。代替原本的 class 如果某个抽象类中,全是抽象方法时,可以将该抽象类定义为一个接口。 接口是一个完全抽象类。其中的方法都是公共的 public 抽象 abstract 方法,其中的属性都是公共的 public 静态 static 常量 final 。在 jdk1.8 后,接口中可以定义默认 default 方法和静态 static 方法。 接口中的方法都是被 public abastract 修饰,可以不用写出来 接口中的属性都是被 public static final 修饰,可以不用写出来 jdk1.8 后,可以在接口中定义 default 方法和 static 方法 接口通常需要一个类去实现,该类使用 implements 关键字实现接口。 实现了接口的实现类,要重写其中所有抽象方法 接口没有构造方法,不能实例化对象 static 可以修饰方法和属性,表示该方法或属性是静态的,在类加载时保存到内存中,无需对象参数,直接通 过类名就能访问。 如果某个属性或方法被高度重用时,可以将其定义为静态的,之后直接通过类名调用。 Object obj = new Object (); Person p = ( Person ) obj ; 还可以在类中定义静态代码块 static{} 。在类加载时自动执行的代码块。


