Java基础相关
面向对象
OOA面向对象分析
OOD面向对象设计
OOP面向对象编程(面向对象程序设计)
面向对象三大特征
-
封装:
- 类:封装的是对象的属性和行为
- 方法:封装的是具体的业务逻辑实现
- 访问控制修饰符:封装的是具体的访问权限
-
继承:
-
作用:代码复用
-
超类:所有派生类所共有的属性和行为
-
接口:部分派生类所共有的属性和行为
-
派生类:派生类所特有的属性和行为
-
单一继承、多接口实现,传递性
-
-
多态:
- 行为多态:所有抽象方法都是多态的(通过方法的重写来实现)
对象多态:所有对象都是多态的(通过向上造型来实现) - 向上造型、强制类型转换、instanceof判断
- 行为多态:所有抽象方法都是多态的(通过方法的重写来实现)
继承
继承于某一个类,就可以直接获得这个类的属性和方法,可以提高程序的复用性;
将不同类中,重复的属性和行为,单独写到一个超类中,再让这些类,继承这个超类。
- Java采用extends关键字实现继承,实现继承的类叫子类(派生类),被继承的类叫父类(超类);
- 任何类都只能有一个直接的父类,和无数个间接的父类,多个类可以继承于同一个父类;
- 若一个类没有显示指定父类,则这个类默认继承于java.lang.Object;
- 父类型引用指向子类对象为向上造型,但通过父类的引用只能访问父类所定义的成员,而不能访问子类所扩展的部分,
另外,从父类角度看,父类派生了子类,但从子类角度看,是子类扩展(extends)了父类
作用:
- 作用:代码复用
- 通过extends来实现继承
- 超类/父类:派生类所共有的属性和行为
- 派生类/子类:派生类所特有的属性和行为
- 派生类可以访问:派生类的+超类的,但超类只能访问超类的
- 一个超类可以有多个派生类,一个派生类只能有一个超类-----单一继承
- 继承具有传递性
Java规定:构造派生类之前必须先构造超类
在派生类的构造方法中,若自己没有调用超类的构造方法
----则编译器默认super()调用超类的无参构造方法
在派生类的构造方法中,若自己调用了超类的构造方法
----则不再默认提供
注意:super()调用超类构造方法,必须位于派生类构造方法的第一行
方法重写
在子类中,定义与父类同名的方法,用来覆盖父类中这个方法的逻辑,叫做重写。
方法的重写是指,子类中的方法与父类中的方法有完全相同的方法签名,即返回值类型,方法名,参数都完全相同。子类方法的访问级别不能低于父类方法的访问级别
重写的规范
- 子类方法的名称、参数列表与父类相同;
- 子类方法的返回类型与父类相同或更小;
- 子类重写父类的方法如果返回值类型是基本类型的话,要求相同。
- 子类方法声明的异常与父类相同或更小;
- 子类方法的访问权限与父类相同或更大。
重写与重载
- 重载发生在同一个类的多个同名方法之间,让代码便于调用;
- 重写发生在子类与其父类的同名方法之间,让代码易于复用。
- 父类与子类之间也存在重载,即在子类中定义出与父类名称相同、参数列表不同的方法
this
this:指代当前对象,哪个对象调用方法它指的就是哪个对象
只能用在方法中,方法中访问成员变量之前默认有个this.
this的用法:
1.普通的直接引用
2.形参与成员名字重名,用 this 来区分:
this.成员变量名-----------访问成员变量(成员变量与局部变量同名时,
访问成员变量时this不能省略)
this.方法名()-------------调用方法(一般不用)
this()-------------------调用构造方法(一般不用)
super
super 可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类。
- 通过super关键字,调用父类的成员变量;
- 通过super关键字,调用父类的成员方法;
- 通过super关键字,调用父类的构造方法。
- super指代当前对象,用于调用该对象在父类中的成员;
- 通过super调用构造方法时,并不会创建一个新的对象;
- 父类构造方法会在子类构造方法之前调用,并且总会被调用一次。
super 的用法:
1.普通的直接引用
与 this 类似,super 相当于是指向当前对象的父类,这样就可以用 super.xxx 来引用父类的成员。
2.子类中的成员变量或方法与父类中的成员变量或方法同名
可以调用父类的方法
super 和 this的异同
- super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句)
- this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句)
- super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名 super.成员函数据名(实参) this:它代表当前对象名(在程序中易产生二义性之处,应使用 this 来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用 this 来指明成员变量名)
- 调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用 super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。
- super() 和 this() 类似,区别是,super() 从子类中调用父类的构造方法,this() 在同一类内调用其它方法。
- super() 和 this() 均需放在构造方法内第一行。
- 尽管可以用this调用一个构造器,但却不能调用两个。
- this 和 super 不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有 super 语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。
- this() 和 super() 都指的是对象,所以,均不可以在 static 环境中使用。包括:static 变量,static 方法,static 语句块。
- 从本质上讲,this 是一个指向本对象的指针, 然而 super 是一个 Java 关键字。
多态
在程序运行时,相同类型的变量可以呈现出不同的行为特征,这就是多态!
多态的作用 :提高程序的扩展性!
多态的意义:
- 同一类型的引用在指向不同的对象时,有不同的实现------所有抽象方法都是多态的.行为的多态:cut()、step()、getImage()…
- 同一个对象在被造型为不同的类型时,有不同的功能------所有对象都是多态的概念
向上造型/自动类型转换:
- 超类型的引用指向派生类的对象
- 能造型成为的类型有: 超类+所实现的接口
- 能点出来什么,看引用的类型
- 父类型引用指向子类对象为向上造型,但通过父类的引用只能访问父类所定义的成员,而不能访问子类所扩展的部分,
强制类型转换,成功的条件只有如下两种
- 引用所指向的对象,就是该类型
- 引用所指向的对象,实现了该接口或继承了该类
强转时若不符合如上条件,则发生ClassCastException类型转换异常
建议:在强转之前先通过instanceof来判断引用指向的对象是否是该类型
引用
Human human = new Human();
创建了一个Human类的对象human。
上面是一个非常简单的表述,但我们有许多细节需要深入:
- 首先看等号的右侧。new是在内存中为对象开辟空间。具体来说,new是在内存的堆(heap)上为对象开辟空间。这一空间中,保存有对象的数据和方法。
- 再看等号的左侧。human指代一个Human对象,被称为对象引用(reference)。实际上,human并不是对象本身,而是类似于一个指向对象的指针。human存在于内存的栈(stack)中。
- 当我们用等号赋值时,是将右侧new在堆中创建对象的地址赋予给对象引用。
小结
- 超类的引用可以指向自己或派生类,而能使用哪些属性和方法,看等号右侧指向的对象,
- 指向本身,则使用自身的属性和方法
- 指向派生类,则使用派生类中包含的超类属性和方法。若派生类中重写了方法,则使用被重写的方法。
- 变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。
- 派生类的引用不能指向超类,只能指向本身或它的派生类。