Java面向对象


  1. 对象,是具体的事物,类,是对对象的抽象
  2. 方法的回顾及加深:

(1) 修饰符 返回值 方法名(参数类型 参数名){方法体;return 返回值;}

(2) Break可以跳出switch,结束循环;return;可以结束方法

(3) 调用方法:a.静态方法:类名.方法名()b.非静态方法:对象.方法名()

(4) 静态方法无法调用非静态方法,因为静态方法是和类一起加载的,依附于类;而非静态方法是实例化后,即有对象产生后才存在,依附于对象

  1. 以类的方式组织代码,以对象的方式封装数据
  2. 类里只有两个东西,一个是属性,一个是方法,并且方法是用来改变属性的
  3. IDEA中,在想输出的东西后面加上.sout即可快速写出System.out.println(...);
  4. 构造方法:

(1) 和类名相同,不需要写返回值

(2) 又名构造器,即使不写构造器,也会存在一个默认的构造器,但是如果写了一个构造器,之前默认的构造器会消失,为了子类考虑,任何父类必须有无参构造,也就是说一定要写

(3) 创造对象必须用new,本质上就是在调用一个构造器

(4) 构造器是用来初始化属性的

(5) IDEA中,alt+insert,再选择constructor可以快速创建各种构造器

  1. 栈中存放方法和引用变量名,堆中存放具体对象和方法区(各种类(包含非静态方法)和静态方法)
  2. 引用类型:对象是通过引用来操作的,即用栈中的引用变量名操作堆中的具体数据
  3. 默认初始化:

(1) 数字:0,0.0

(2) Charu0000

(3) Booleanfalse

(4) 引用:null

  1. 封装:

(1) 封装是对于属性而言的

(2) 属性私有,修饰词private

(3) 操作属性用publicget/set方法(用第四步方法创建)

(4) IDEA中,alt+insert,再选择getter and setter可以快速创建get/set方法

  1. 继承:

(0) 当一个类没有声明构造方法时,Java提供默认构造方法,调用super()执行父类无参构造方法。但是,当父类有自己的构造方法时,Java不再提供父类的无参构造方法,子类也就没有默认构造方法了,因此,一个类通常需要声明无参构造方法,即使自己不用,也要为子类准备着

(0.5) 若子类构造方法中没有调用super()或者this(),Java默认执行super()。也就是,在子类构造方法中,若无特殊需求,则只需给子类专有变量赋值即可

(1) 子类继承父类,extends意思是扩展:public class Student extends Person{}

(2) 修饰符是final的类无法被继承

(3) 子类可以继承父类的public的属性和方法,私有的(private)无法被继承

(4) IDEA中,ctrl + h可以打开类的继承树结构界面

(5) 所有的类都直接或者间接继承object

(6) Java中类只有单继承,没有多继承,即只有一个父类

(7) 子类构造器假如没有super(...),那么第一句默认执行父类无参构造器(如果父类没有无参构造器则报错),假如写super(...),也要放在第一句,其中...是父类有参构造器的实参,也可以没有,那就和默认的一样,可以省略

① 不能在子类构造器中既写this(),又写super(),因为this中就有super,如果都写了,那就是两个super

② Super既可以出现在子类的构造器中,也可以出现在子类的其他方法中

③ Super()可以理解为父类构造器,super可以理解为父类对象的引用,this是当前对象的引用

(8) 重写都是方法的重写(就是子类重写父类方法,代码表现为方法名相同,参数列表也相同。static静态方法即使方法名相同,也不是重写,重写只针对非静态方法,继承过来然后覆盖,而static无法继承,也就无法覆盖重写),和属性无关(假设A继承了B

① 父类引用B b可以指向子类对象new A(),假如是static静态方法,方法调用只和左边定义类型有关,假如是非静态方法,子类重写了父类方法,b调用方法先去子类里找

② 假如方法是privatefinalstate修饰的,那么都不能重写

③ IDEA中,alt+insert,再选择override method可以在子类中快速创建重写方法

④ 修饰符:范围可以扩大但不能缩小:public>protected>default>private

⑤ 抛出的异常:范围可以缩小但不能扩大

⑥ 原因:父类方法无法满足子类需求

  • 子类重定义父类成员,虽然覆盖或者重载,实际上只是隐藏了同名的成员,父类同名成员依旧存在,在子类的实例成员方法中,可用super.……访问父类隐藏的成员
  • Super.成员变量  Super.成员方法(参数列表)   (Super将当前对象作为其父类的一个实例引用)

  • 覆盖方法:究竟执行覆盖方法中的哪一个,取决于调用该方法的对象所属的类是父类还是子类

  • 当创建一个类的实例时,也隐含地创建了其父类的一个实例,因此,子类构造方法必须调用其父类的一个构造方法
  1. 多态:

(1) 是方法的多态,与属性无关

(2) 一个对象的实际类型是确定的,但是指向他的引用可以有很多(比如父类引用指向子类对象)

(3) 对象能执行哪些方法,主要看左边定义类型(父类引用指向子类对象)

① 子类型:能调用的方法都是自己的或者继承过来的

② 父类型:能调用的方法都是父类的,假如子类重写,那就调用重写的,不能调用子类独有的方法

(4) 子类转化为父类(例如A a = new A();B b = a),可能会丢失自己本来的一些方法

  1. a Instanceof B是判断a对象是否是B类或者B类子类的实例,是则返回true
  2. 假如B b = new A();那么就可以强制装换A a = (A)b;
  3. Static

(1) 静态属性属于类,各个实例可以共享

(2) 每个方法都可以调用静态和非静态方法,但是静态方法不能调用非静态方法(因为静态方法和类一起加载,此时非静态方法还未出世,如何调用)

  1. 抽象类

(1) Abstract修饰类就是抽象类,修饰方法就是抽象方法

(2) 抽象类不能被new,只是对子类的约束,但是有构造方法,是给子类用的

(3) 抽象方法只有定义,没有实现,是为了约束子类,假如子类不是抽象类就要实现所有抽象方法,否则子类也要定义为抽象类

(4) 有抽象方法的必须声明为抽象类,抽象类里也可以有普通方法

(5) 作用:约束子类

(6) 局限:Java的类是单继承,所以没有接口的多继承好用

  1. 接口

(1) 类是单继承,接口是多继承

(2) 关键字interface,类继承接口用Z implements ABC...

(3) 比较

① 普通类:只有具体实现

② 抽象类:具体实现+规范(抽象方法)

③ 接口:只有规范(约束和实现分离的一种机制)

(4) 接口里的方法不需要也不能有实现,表现为不能有{}

(5) 方法默认修饰符public abstract,可以省略,所以可以简写为:返回值 方法名(参数列表);常量默认修饰符public static final,可以简写为:数据类型 变量名 = 值(常量虽然可以定义,但很少使用)

(6) 类继承了接口,就要实现接口中的方法

(7) IDEA中,alt+insert,再选择implement method可以在继承接口的类中快速创建接口里的方法

(8) 接口没有构造方法

  1. 内部类:就是在一个类的内部再定义一个类,具体以后再聊

相关