Java学习笔记——面向对象核心技术(二)

在这里插入图片描述

抽象类和抽象方法

Java 中,抽象类不能产生对象的实例。定义抽象类需要使用abstract关键字。

语法:

[权限修饰符] abstract class
类名{
类体
}

使用abstract关键字定义的类叫抽象类;abstract关键字修饰的方法叫抽象方法。

语法:

[权限修饰符] abstract 方法返回值类型 方法名(参数列表);

说明:抽象方法时直接以分号结尾的,没有方法体,抽象方法本身没有任何意义,除非被重写,而承载这个抽象方法的抽象类必须被继承。也就是説,抽象类除了被继承之外,没有任何的意义。

总结:

使用抽象类和抽象方法时,需要遵从以下原则;

1) 在抽象类中,可以包含抽象方法,也可以不包含抽象方法,但是包含了抽象方法的类必须被定义为抽象类

2) 抽象类不能被直接实例化,即使抽象类中没有声明抽象方法,也不能被实例化

3) 抽象类被继承后,子类需要重写抽象类中所有的抽象方法

4) 如果继承抽象类的子类也被声明抽象类,则可以不用重写父类中所有的抽象方法

5) 使用抽象类可能会出现这样的问题:程序中会有太多的冗余代码,同时父类的局限性很大

例:
Shape类:

package way_of_Class_practice;
public abstract class Shape {
    public int length;
    public int width;
   public abstract void Area();
}

Circle类:

package way_of_Class_practice; 
public class Circle extends Shape {
    int r;
    @Override
    public void Area() {
        // TODO Auto-generated method stub
        double area = 3.14 * r * r;
    System.out.println("输入半径为:" + r + " 的圆面积为" + area);
    }
    public static void main(String[] args) {
        Circle circle = new Circle();
        circle.r = 10;
        circle.Area();
    } 
}

接口的声明及实现

接口是抽象类的延伸,可以将它看做一个纯粹的抽象的类,接口中所有的方法都是没有方法体的。
接口使用interface关键字进行定义

语法:

[修饰符] interface 接口名 [extends 父接口名列表]{
[public] [static] [final] 常量;
[public] [abstract] 方法;
}

修饰符:可选,用于指定接口的访问权限
接口名:必选参数,用于指定接口的名称,接口名必须是合法的Java标志符。一般情况下,要求首字母大写

一个类实现一个接口可以使用implements关键字。

注意:在接口中定义的任何变量都自动是static和final的。因此,在接口定义变量时,必须进行初始化,而且,实现接口的子类不能对接口中的变量进行重新赋值

DrawImage接口:

package way_of_Class_practice; 
public interface DrawImage {
    public void show(); 
    public void draw();
}

Rectangle1类:

package way_of_Class_practice; 
public class Rectangle1
implements DrawImage {
public void show() {
        System.out.println("你要画的是长方形");
    } 
    @Override
    public void draw() {
        // TODO Auto-generated method stub
        System.out.println("画长方形");
    }
}

Square类:

package way_of_Class_practice; 
public class Square implements DrawImage {
    public void show() {
        System.out.println("您要画的是正方形");
    }
    public void draw() {
        System.out.println("画正方形");
    }
}

Main类:

package way_of_Class_practice;
public class main {
    public static void main(String[] args) {
        DrawImage[] image = { new Rectangle1(),
new Square() };
        for (int i = 0; i < image.length; i++) {
            image[i].show();
            image[i].draw();
        }
    }
}

多重继承

在Java类中不允许多重继承,但使用接口可以实现多重继承,因为一个类可以实现多个接口,这样可以将所有需要实现的接口放在implements关键字后,并使用英文“,”隔开。但这可能会在一个类中产生庞大的代码量,因为实现一个接口时需要实现接口中所有的方法。

语法:

class 类名 implements 接口1,接口2,….,接口n

注意:使用多重继承时,可能出现变量或者方法名冲突的情况,若变量冲突,则需要明确指定变量的接口,即通过“接口名.变量”实现;而如果出现方法冲突时,则只要实现一个方法即可。

区分抽象类和接口

抽象类和接口类都包含可以由子类继承实现的成员,但抽象类是对根源的抽象,而接口是对动作的抽象。抽象类与接口的区别如下:

1) 子类只能继承一个抽象类,但是可以实现任意多个接口

2) 接口中的方法都是抽象方法,抽象类中可以有非抽象方法

3) 抽象类中的成员变量可以是各种类型,接口中的成员变量只能是静态常量

4) 抽象类中可以有静态方法和静态代码块等,接口中不可以

5) 接口没有构造方法,抽象类可以有构造方法
在这里插入图片描述

发布了62 篇原创文章 · 获赞 42 · 访问量 3328

猜你喜欢

转载自blog.csdn.net/weixin_45375866/article/details/100359855