面向对象进阶学习笔记

小技巧:打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类常用的方法:

 

posted @ 2020-03-14 12:15  菅兮徽音  阅读(166)  评论(0)    收藏  举报