首页 > 编程语言 > 详细

java的抽象、多态

时间:2017-09-20 19:12:47      阅读:275      评论:0      收藏:0      [点我收藏+]

 

1.Java抽象类

1.抽象类的相关概念

如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

如形状类是抽象的类,圆、三角形等是具体类。

 

abstract修饰的类就是抽象类。如果某个类中包含有抽象方法,那么该类就必须定义成抽象类。但是抽象类中不一定有抽象方法。

 

2.abstract修饰的类就是抽象类。如果某个类中包含有抽象方法,那么该类就必须定义成抽象类。

抽象类可以有成员属性和非抽象的成员方法。

抽象类不能被实例化,但可以有构造函数。

抽象类只能用作基类,表示的是一种继承关系。继承抽象类的非抽象类必须实现其中的所有抽象方法,而已实现方法的参数、返回值要和抽象类中的方法一样。否则,该类也必须声明为抽象类。

 

3.使用关键字abstract定义抽象类,一般语法:

[访问权限] abstract class 类名 {成员列表}

 

4.抽象类的注意事项

抽象类可以有构造方法,但不能直接实例化,只能用来继承;

抽象类的派生子类应该提供对其所有抽象方法的具体实现;如果抽象类的派生子类没有实现其中的所有抽象方法,那么该派生子类仍然是抽象类,只能用于继承,而不能实例化;

抽象类中也可以包含有非抽象的方法,子类中重写非抽象方法时返回值和参数必须与父类一致;

构造方法和静态方法不可以修饰为abstract

 

 

2.Java抽象方法

1.抽象方法的相关概念

在某些情况下,类无法(或者没有必要)提供方法的具体实现,可以将此方法声明成抽象方法;

在类中没有方法体的方法,就是抽象方法;

含有抽象方法的类,一定是抽象类。

 

2.使用关键字abstract声明抽象方法,一般语法:

[访问权限] abstract 返回值类型 方法名称(参数列表);

 

3.抽象的作用

1.在面向对象领域,抽象类主要用来进行类型隐藏;也就是使用抽象的类型来编程,但是具体运行时就可以使用具体类型。

 

利用抽象的概念,能够在开发项目中创建扩展性很好的架构,优化程序。

 

抽象类,抽象方法,在软件开发过程中都是设计层面的概念。也就是说,设计人员会设计出抽象类,抽象方法,程序员都是来继承这些抽象类并覆盖抽象方法,实现具体功能。

 

4.多态性

1.多态性是面向对象的三大特征之一

多态的含义是:对外一种表现形式,内在有多种具体实现。

Java中多态的具体体现

方法重载

方法覆盖

多态参数(新内容,重点、难点)

 

5.运行期类型与编译期类型

1.第一种情况:编译期类型和运行期类型相同

    A  a = new A();

     a.show();

声明A的时候,使用到的类型A表示对象的类型,被称为编译期类型,在编译期,虚拟机认为a的类型是A,对于a所使用的属性和方法的有效性将到类A中去验证。

构造方法A()中的A是运行期类型,在运行期,将执行运行期类型中的方法。

 

2.第二种情况:当有继承关系时,可能发生编译期类型和运行期类型不同的情况,即编译期类型是父类类型,运行期类型是子类类型。

//A类是B类的父类                              

A  ab = new B();

ab.show();

对象ab的编译期类型为父类A类,运行期类型为子类B类。

如果一个引用的编译期类型和运行期类型不同,那么一定是编译期类型与运行期类型有父类子类关系。

ab对象使用的方法,在编译期到类A中去校验,而运行则执行B类的方法

如果一个对象的编译期类型是父类,运行期类型是子类,可以对该对象进行强制类型转换,将其编译器类型转换为与运行期类型相同的类型,即:B b=(B)ab;

6.父类引用指向子类对象

1.当编译器类型是父类,运行期类型是子类时,被称为父类引用指向子类对象

public  class Father {

void  study() {

this.strXchinaese="小学语文";

System.out.println("我在学"+this.strXchinaese);

}

}

public class Son extends Father {

void study() {

}

}

public class Main {

public static void main(String[] args) {

// TODO Auto-generated method stub

Father fa=new Son("456");

fa.study();

}

}

 

对象Father可以调用Son类中的所有方法,fa只能调用Father中定义的方法,

Son扩展的新方法不能调用。

 

7.多态环境下对属性和方法的调用

1.多态环境下对成员方法的调用

public  class Father {

void  study() {

this.strXchinaese="小学语文";

System.out.println("我在学"+this.strXchinaese);

}

}

public class Son extends Father {

void study() {

}

}

public class Main {

public static void main(String[] args) {

// TODO Auto-generated method stub

Father fa=new Son("456");

fa.study();

}

}

简单的说:编译看左边,运行看右边。

 

2.多态环境下对静态成员方法的调用public  class Father {

static void  study() {

this.strXchinaese="小学语文";

System.out.println("我在学"+this.strXchinaese);

}

}

public class Son extends Father {

static void study() {

}

}

public class Main {

public static void main(String[] args) {

// TODO Auto-generated method stub

Father fa=new Son("456");

fa.study();

}

}

简单的说:编译和运行都看左边。

3.多态环境下对成员变量的调用

public  class Father {

    int a=100;

void  study() {

this.strXchinaese="小学语文";

System.out.println("我在学"+this.strXchinaese);

}

}

public class Son extends Father {

    int a=200;

void study() {

}

}

public class Main {

public static void main(String[] args) {

// TODO Auto-generated method stub

Father fa=new Son("456");

fa.study();

}

}

简单的说:编译和运行都看等号左边。

    注意:变量不存在被子类覆写这一说法,只有方法存在覆写

 

8.多态参数

1.方法参数具有多态性

public class Animal {

void eat() {

System.out.println("动物吃食物");

}

}

public class Cat extends Animal{

 

void eat() {

System.out.println("猫吃猫粮");

}

}

public class Dog extends Animal{

 

void eat() {

System.out.println("狗吃肉");

}

}

public class Main1 {

public static void main(String[] args) {

// TODO Auto-generated method stub

//Animal animal = new Animal();

Cat cat=new Cat();

Dog dog=new Dog();

/*cat.eat();

dog.eat();*/

method(dog);

method(cat);

}

static void method(Animal animal) {

animal.eat();

}

}

方法参数多态性的好处:提高代码的扩展性

 

 

9.多态环境下对象造型

1.向上造型 –又称自动类型提升

public  class Father {

void  study() {

this.strXchinaese="小学语文";

System.out.println("我在学"+this.strXchinaese);

}

}

public class Son extends Father {

void study() {

}

}

public class Main {

public static void main(String[] args) {

// TODO Auto-generated method stub

Father fa=new Son("456");

fa.study();

}

}

只能使用父类中的方法

 

2.向下造型 –又称向下转型

public  class Father {

void  study() {

this.strXchinaese="小学语文";

System.out.println("我在学"+this.strXchinaese);

}

}

public class Son extends Father {

void study() {

}

}

public class Main {

public static void main(String[] args) {

// TODO Auto-generated method stub

Son son=new Father("456");

son.study();

}

}

子父类中的方法都可以使用

 

 

10.instanceof 操作符

1.instanceof 用法

result = 对象名称 instanceof  类型

参数:

result:布尔类型。

对象名称:必选项,任意对象表达式。

类型:必选项,任意已定义的类,可以是API中的类,可以是自定义的类。

 

说明:

如果对象是这个类型的一个实例,则 instanceof 运算符返回 true。如果对象不是指定类的一个实例,或者对象是 null,则返回 false

instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例

 

 

public class Animal {

 

void eat() {

System.out.println("动物吃食物");

}

}

public class Cat extends Animal{

 

void eat() {

System.out.println("猫吃猫粮");

}

}

public static void main(String[] args) {

// TODO Auto-generated method stub

//Animal animal = new Animal();

Cat cat=new Cat();

Dog dog=new Dog();

/*cat.eat();

dog.eat();*/

method(dog);

method(cat);

}

 

static void method(Animal animal) {

if(animal instanceof Cat) {

Cat c= (Cat)animal;

c.eat();

}

 

}

 

java的抽象、多态

原文:http://www.cnblogs.com/Summer-snow/p/7562692.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!