一、抽象
1、抽象的相关概念
如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类.(如形状是抽象的类,园、三角形是具体类)
用abstract修饰的类就是抽象类。如果某个类中包含有抽象方法,那么该类就必须定义成抽象类。但是抽象类中不一定有抽象方法。
2、抽象类的定义
使用关键字abstract定义抽象类,语法
【访问权限】abstract class 类名{
成员列表
}
如:public abstract class Shape{
public abstract void draw();
}
public abstract class Shape{
public void draw(){
//具体代码
}
}
3、抽象类的相关特性
用abstract修饰的类就是抽象类。类中包含有抽象方法,该类为抽象类;
抽象类可以有成员和非抽象的成员方法;
抽象类不能被实例化,但可以有构造方法(函数),只能用来继承;
抽象类只能用作基类,表示的是一种继承关系;
继承抽象的非抽象类必须实现其中的所有抽象方法已实现的方法的参数、返回值要和抽象类的方法一样。否则,该类也必须声明为抽象类;
构造方法和静态方法(static)不可以修饰为abstract。
4、抽象方法的概念
在某些情况下,类无法(或没必要)提供方法的具体实现,可以将此方法声明成抽象方法;
在类中没有方法体的方法,就是抽象方法;
含有抽象方法的类,一定是抽象类。
5、抽象方法的语法
使用关键字abstract声明抽象方法,语法:
【访问权限】abstract 返回值类型 方法名称(参数列表);
public abstract void draw();
6、抽象的作用
在面向对象领域,抽象类主要用来进行类型隐藏;也就是使用抽象的类型来编程,具体运行时就可以使用具体类型。
利用抽象的概念,能够在开发项目中创建扩展性很好的架构,优化程序。
抽象类,抽象方法,在软件开发过程中都是设计层面的概念。设计人员设计抽象类,抽象方法,程序员都是继承这些抽象类并覆盖抽象方法,实现具体功能。
二、多态性
多态性是面向对象的三大特征之一
多态的含义是:对外一种表现形式,内在有多种具体实现
Java中多态的具体体现
--方法重载
--方法覆盖
--多态参数
1、运行期类型与编译期类型
第一种情况:编译期类型和运行期类型相同
A a = new A();
a . show();
声明A的时候,使用到的类型A表示对象类型,被称为编译期类型,在编译期,虚拟机认为a的类型是A,对于a所使用的属性和方法的有效性将到类A中去验证。
构造方法A()中的A是运行期类型,在运行期,将执行运行期类型中的方法。
第二种情况:当有继承关系时,可能发生编译期类型和运行期类型不同的情况,即编译期类型是父类类型,运行期类型是子类类型。
//A类时B类的父类
A ab = new B();
ab . show();
对象ab的编译期类型为父类A类,运行期类型为子类B类.
如果一个引用的编译期类型和运行期类型不同,那么一定是编译器类型与运行期类型有父类子类关系.
ab对象使用的方法,在编译期到类A中去校验,而运行则执行B类的方法.
如果一个对象的编译器类型是父类,运行期类型是子类,可以对该对象进行强制类型转换,将其编译期类型转换为与运行期类型相同的类型,即: B b = (B) ab;
2、父类引用指向子类对象
当编译期类型是父类,运行期类型是子类,被称为父类引用指向子类对象
class Animal{
.....
}
class Cat extends Animal{
.....
}
class Dog extends Ainmal{
.....
}
Cat m = new Cat();
Animal x = new Cat();//Animal的引用指向Cat的对象
对象m可以调用猫类中的所有方法,x只能调用动物类中的定义的方法,猫类扩展的新方法不能调用。
3、多态环境下对成员方法的调用
class Animal {
void show(){
System.out.println(“Animal”);
}
}
class Cat extends Animal{
void show(){
System.out.println(“Cat”);
}
}
Animal x = new Cat();
x.show()//调用的是子类中的方法。
简单的就是:编译看左边,运行看右边。
4、多态环境下对静态成员方法的调用
class Animal {
static void show(){
System.out.println(“Animal”);
}
}
class Cat extends Animal{
static void show(){
System.out.println(“Cat”);
}
}
Animal x = new Cat();
x.show()//调用的是动物类中的静态成员方法。
简单地说:编译和运行都看左边。
5、多态环境下队成员变量的调用
class Animal{
int num = 3;
}
class Cat extends Animal{
int num = 2;
}
Animal x = new Cat;
x.num;//调用的是动物类中的成员变量
简单地说:编译和运行都看等号左边。
注意:变量不存在被子类覆写这一说法,只有方法存在覆写。
6、多态参数
class Animal{
void eat(){
}
}
class Cat extends Animal{
void eat(){
}
}
class Dog extends Animal{
void eat(){
}
}
方法的形式参数 类型是父类,而传递的实际参数可以是任意子类的对象
static void method(Animal animal){
animal.eat();
}
方法参数多态行的好处:提高代码的扩展性。
7、多态环境下对象造型
向上造型
class Animal{
abstract void eat();
}
class Cat extends Animal{
void look(){
System.out.println(“看家”);
}
}
Animal x = new Cat();
x.eat() //只能使用父类中的方法
x.look()//报错!不能使用子类中的方法
向上造型的作用是:提高程序的扩展性。
向下造型
class Animal{
abstract void eat();
}
class Cat extends Animal{
void look(){
System.out.println(“看家”);
}
}
Animal x = new Cat();
Cat m = (cat)x
m.eat();
m.look; //子父类中的方法都可以用
向下造型:为了使用子类中的特有的方法。
三、instanceof操作符
instanceof用法
result = 对象名称 instanceof 类型
参数:
result:布尔类型
对象名称:必选项,任意对象表达式
类型:必选项,任意已定义的类,可以是API中的类,可以是自定义的类
说明:
如果对象是这个类型的一个实例,则 instanceof 运算符返回 true。如果对象不是指定类的一个实例,或者对象是 null,则返回 false。
instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。
来源:https://www.cnblogs.com/kelly-zkp/p/7563417.html