面向对象进阶学习笔记
小技巧:打main后Alt+/快速打出main方法,打syso后Alt+/快速打出pritln方法
面向对象的三大特征:继承、封装、多态
继承:
继承父类的所有方法与属性(除了父类的构造方法),但不见得可以直接访问(比如,父类私有的属性和方法)。
格式:Class 子类类名 extends 父类类名 { }
如果定义一个类时,没有调用extends,则它的父类是:java.lang.Object。
instanceof 运算符:二元运算符,左边是对象,右边是类;当对象是右面类或子类所创建对象时,返回true;否则,返回false。
格式:对象名 instanceof 类名
方法的重写override:
子类继承父类后,可以重写父类的方法。方法的重写是实现多态的必要条件。
格式: 方法名、形参列表相同。
Object类:
Object类位于lang包中,是所有Java类的根基类,也就意味着所有的Java对象都拥有Object类的属性和方法。如果在类的声明中未使用extends关键字指明其父类,则默认继承Object类。
Object类中定义有public String toString()方法,其返回值是 String 类型,默认会返回“类名+@+16进制的hashcode”。在打印输出或者用字符串连接对象时,会自动调用该对象的toString()方法。
toString()方法也可以被重写。
==:代表比较双方是否相同。如果是基本类型则表示值相等,如果是引用类型则表示地址相等即是同一个对象。
equals 方法:Object类中定义有public boolean equals(Object obj)方法,提供定义“对象内容相等”的逻辑。比较两个对象的hashcode,是同一个对象的引用时返回 true ,否则返回 false。该方法可以被重写。
super关键字:
可以通过super来访问父类中被子类覆盖的方法或属性。
若是构造方法的第一行代码没有显式的调用super(...)或者this(...);那么Java默认都会调用super(),含义是调用父类的无参数构造方法。这里的super()可以省略。
特别注意:调用构造方法格式:new 类名()每一个构造方法的第一句默认都是:super(),即调用父类的构造方法。所以,构造方法调用流程就是:先向上追溯到Object,然后再依次向下执行类的初始化块和构造方法,直到当前子类为止。
封装:
程序设计要追求“高内聚,低耦合”。 高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合是仅暴露少量的方法给外部使用,尽量方便外部调用。
封装的实现:给类里的属性和方法加访问控制符。
1. private 表示私有,只有自己类能访问
2. default表示没有修饰符修饰,只有同一个包的类能访问
3. protected表示可以被同一个包的类以及其他包中的子类访问
4. public表示可以被该项目的所有包中的所有类访问
类的属性的处理:
1. 一般使用private访问权限。
2. 提供相应的get/set方法(在方法中设置调用要求)来访问相关属性,这些方法通常是public修饰的,以提供对属性的赋值与读取操作(注意:boolean变量的get方法是is开头)。
3.可以自动生成get/set方法,右键source,generate setters and getters。
多态(polymorphism):
多态指的是同一个方法调用,由于对象不同可能会有不同的行为。
1. 多态是方法的多态,不是属性的多态(多态与属性无关)。
2. 多态的存在要有3个必要条件:继承,方法重写,父类引用指向子类对象。
3. 父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了。
理解:父类引用做方法的形参,实参可以是任意的子类对象,可以通过不同的子类对象实现不同的行为方式。

对象的转型(casting):向上转型后的父类引用变量只能调用它编译类型的方法,不能调用它运行时类型的方法。这时,我们就需要进行类型的强制转换,我们称之为向下转型。

final关键字:
1. 修饰变量: 被他修饰的变量不可改变。一旦赋了初值,就不能被重新赋值。
2. 修饰方法:该方法不可被子类重写。但是可以被重载。
3. 修饰类: 修饰的类不能被继承。比如:Math、String等。
抽象方法和抽象类:
抽象方法: 使用abstract修饰,没有方法体,只有声明。定义的是一种“规范”,就是告诉子类必须要给抽象方法提供具体的实现。
抽象类:包含抽象方法的类就是抽象类,有抽象方法的类只能定义成抽象类。通过abstract方法定义规范,然后要求子类必须定义具体实现。通过抽象类,我们就可以做到严格限制子类的设计,使子类之间更加通用。 抽象类不能实例化,即不能用new来实例化抽象类。 抽象类可以包含属性、方法、构造方法。但是构造方法不能用来new实例,只能用来被子类调用。抽象类只能用来被继承。抽象方法必须被子类实现。
编写代码注意事项:
1.写无返回方法一定要写void,后面要带()。
2.new对象时,最后的类名后面也要(),
3.为对象调用方法时,方法后面要带()。
接口:
全面地专业地实现了:规范和具体实现的分离。接口中所有方法都是抽象方法。接口和实现类不是父子关系,是实现规则的关系。
格式:[访问修饰符] interface 接口名 [extends 父接口1,父接口2…] {
常量定义; 方法定义;}接口详细说明:1. 访问修饰符:只能是public或默认。2. 接口名:和类名采用相同命名机制。3. extends:接口可以多继承。4. 常量:接口中的属性只能是常量,总是public static final 修饰。不写也是。5. 方法:接口中的方法只能是 public abstract,省略的话也是。6.一个接口可以继承多个父接口,即多继承。7.接口不能创建实例,但是可用于声明引用变量类型。
实现类详细说明:1.子类通过implements来实现接口中的规范。2.一个类实现了接口,必须实现接口中所有的方法,并且这些方法只能是public的。3.一个类可以同时实现多个接口。
内部类:
有些情况下,我们把一个类放在另一个类的内部定义,称为内部类(innerclasses)。内部类可以使用public、default、protected 、private以及static修饰。而外部顶级类(我们以前接触的类)只能使用public和default修饰。对于一个名为Outer的外部类和其内部定义的名为Inner的内部类。编译完成后会出现Outer.class和Outer$Inner.class两个类的字节码文件。
内部类分类:
1.成员内部类:非静态内部类:(无static修饰) 如果有一个非静态内部类对象那么一定存在对应的外部类对象。非静态内部类可以直接访问外部类的成员,但是外部类不能直接访问非静态内部类成员。非静态内 部类不能有静态方法、静态属性和静态初始化块。
内部类访问外部类属性格式:外部类名.this.变量名。
内部类访问内部类属性格式:this.变量名。
内部类访问内部类局部属性格式:变量名。
在main方法中创建内部类对象格式:外部类名.内部类名 对象名 = new 外部类名(). new 内部类名()
静态内部类:(static修饰) 当一个静态内部类对象存在,并不一定存在对应的外部类对象。 因此,静态内部类的实例方法不能直接访问外部类的实例方法。
在main方法中创建内部类对象格式:外部类名.内部类名 对象名 = new 外部类名.内部类名()
2.匿名内部类:适合只需要使用一次的类。
3.局部内部类:定义在方法内部,作用域只限于本方法。
String类:
String位于java.lang包中,Java程序默认导入java.lang包下的所有类,所以不需要用import导入。
符号"+"把两个字符串按给定的顺序连接在一起,并且是完全按照给定的形式。当"+"运算符两侧的操作数中只要有一个是字符串(String)类型,系统会自动将另一个操作数转换为字符串然后再进行连接。
创建一个string类的对象有两种方法:1. String 对象名 = “字符串内容”
2. String 对象名 = new String (“字符串内容”)
创建对象时,字符串内容会被放入常量池中。当用 == 比较两个均由方法1创建的对象时,认为是同一个对象。但是若用 == 比较两个分别有方法1,方法2创建的对象时,认为不是同一个对象。因此,当比较字符串内容时,应选择equals方法。
API文档相当于一本字典,光标移到方法上即可查看相关说明,要学会用这种方法自学。
String类常用的方法:



浙公网安备 33010602011771号