返回顶部
首页 > 资讯 > 后端开发 > Python >详解Java抽象类与普通类的区别
  • 516
分享到

详解Java抽象类与普通类的区别

2024-04-02 19:04:59 516人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

浅谈抽象类 在面向对象概念中,所有的对象都是通过类来描述的,但是反过来,并不是所有的类都是用来描述对象的.如果一个类中没有足够多的信息来描述一个具体的对象,这样的类就是抽象类。

浅谈抽象类

面向对象概念中,所有的对象都是通过类来描述的,但是反过来,并不是所有的类都是用来描述对象的.如果一个类中没有足够多的信息来描述一个具体的对象,这样的类就是抽象类。

看到这里可能还是觉得有些难以理解,举个例子说明一下:说到动物你会想到什么?猫,狗,鸡鸭鹅?当然这些都可以.那么动物这两个字,你能确定一个具体的对象吗?显然不能.甚至更严格意义上讲,说到猫你会想到什么?橘猫,短美…

毕竟:

一千个人心中有一千个哈姆雷喵.

所以我们在设计中,动物类可以设计成为抽象类,而某一种特定的物种可以采用通过继承动物类实现.

多态这部分我理解了好久,有一天突然就会用了,也明白所谓的父类引用指向子类对象是什么意思了.但是写完前面发现,自己明白了讲出来还是很模糊.多态真的是很重要很重要的一个点,要好好体会这部分.

抽象类和普通类的区别是什么?

抽象类的语法规则

抽象类的语法规则:abstract关键字修饰

1.抽象类不可以被实例化.

2.抽象类不定有抽象方法.

3.一个类中如果有抽象方法,那么这个类一定是抽象类.

4.抽象类中可以存在普通属性、方法、静态属性和静态方法.

5.抽象类中可以存在构造方法.


public abstract class AbstractObject{
	// 普通属性
    String name;
	// 构造方法
    public AbstractObject(String name) {
        this.name = name;
    }
    // 静态方法 - 类名访问
    public static void staticMethod(){
        System.out.println("抽象类可以有静态方法.");
    }
	// 抽象方法
    public abstract void move();
	// 普通方法
    public void commonMethod(String food){
        System.out.println("抽象类可以有普通方法.");
    }
}

抽象类不可以实例化

这部分可以直接暂时记住结论,整个过程可以暂时先跳过后面补,按照我的学习经历(基础差到爆),这部分直接看会很懵.

定义一个动物的抽象类,动物总得动吧(并不!)所以定义一个共性的move()方法.


public abstract class Animal {
    String name;
    public Animal(String name) {
        this.name = name;
    }
    public abstract void move();
}

当我使用idea写示例的时候直接出现了第二种情况!见鬼了抽象类new出来了!


public class Test {
    public static void main(String[] args) {
    	// 抽象类不能实例化!会直接报编译期错误!
        //标红信息: 'Animal' is abstract; cannot be instantiated
        Animal animal = new Animal("小猫");
        // 第二种情况
        Animal animalObjcet = new Animal("小猫") {
            @Override
            public void move() {
                System.out.println("我开始移动了!");
            }
        };
    }
}

关于第二种情况的解释 - 扩展知识:匿名内部类(可跳过)

这里涉及到了一个知识点叫做匿名内部类.
匿名内部类的格式如下:


new 类名或者接口名(){
	重写方法;
}
// 放到一起对比看,很明显后面的是一个匿名内部类
new Animal("小猫") {
    @Override
    public void move() {
        System.out.println("我开始移动了!");
    }
};

匿名:这个类没有名字
内部类:存在于某个类的内部的类.

它实际上是继承并实现了Animal抽象类的一个子类.也就是说这里并不是实例化出了Animal类,这个简便的写法相当于我们进行了如下的写法.


public class AnimalObject extends Animal{
    public AnimalObject(String name) {
        super(name);
    }
    @Override
    public void move() {
        System.out.println("我是一只能动的动物!");
    }
}

public class Test {
    public static void main(String[] args) {
        AnimalObject animalObject = new AnimalObject("我是动物抽象类的子类");
        animalObjcet.move();	// 我是一只能动的动物!
    }
}

抽象类的子类

注意:这里有一个需要强调的地方,对于抽象类中的方法我们的用词应该是实现.对于已经实现了的方法,我们的用词才可以是重写.写到后面发现了前面描述过程中我用词都是重写这里进行了修正.
错误写法:不重写(Override)抽象类中的抽象方法
正确写法:不实现(Implement)抽象类中的抽象方法
再次补充:好像说成重写也不能算错误,IDEA自动生成的里面也加了 @Override 注解.就不继续修改了.

1.不实现抽象类中的抽象方法

当不对抽象类中的抽象方法进行重写的时候,子类一定也是抽象类.(有抽象方法的类一定是抽象类)


public abstract class AbstractCat extends Animal{
    Integer weight;
    public AbstractCat(String name, Integer weight) {
        super(name);    // 继承父类的名称
        this.weight = weight; // 猫咪的年龄
    }
    // 这个是没有重写,依旧是了抽象方法
    public abstract void move();
    // 注意:下面这种写法是重写过之后的!只是方法体为空.
    // public void move(){};
}

2.实现抽象类中的抽象方法

当对抽象类中的所有抽象方法进行实现之后,现在的猫咪类可以是一个普通类了.


public class Cat extends AbstractCat{
    public Cat(String name, Integer weight) {
        super(name, weight);
    }
    @Override
    public void move() {
        System.out.println("一只奔跑的重达" + weight + "kg的" + name);
    }
}

测试一下:


public class Test {
    public static void main(String[] args) {
        Cat cat = new Cat("橘猫", 20);
        cat.move();	// 一只奔跑的重达20kg的橘猫
    }
}

好了到这里,属于你的橘猫终于跑起来了!

关于实现抽象方法的延伸

我看很多文章都说要子类要重写(重写是错误的!这里更正为实现)父类的抽象方法,抽象方法.那我如果只实现部分抽象方法呢?
第一步:改造Animal类


public abstract class Animal {
    String name;
    public Animal(String name) {
        System.out.println("我是动物的构造方法!");
        this.name = name;
    }
    // 多添加几个抽象方法
    public abstract void move();
    public abstract void eat();
    public abstract void sleep();
}

第二步:AbstractCat 类中实现部分抽象方法


// 不添加 abstract 关键字会报错
// Class 'AbstractCat' must either be declared abstract or implement abstract method 'move()' in 'Animal'
public abstract class AbstractCat extends Animal{
    Integer weight;
    public AbstractCat(String name, Integer weight) {
        super(name);
        System.out.println("我是抽象猫咪的构造方法!");
        // 继承父类的名称
        this.weight = weight; // 猫咪的年龄
    }
    @Override
    public void eat() {
        System.out.println(this.name + "在吃猫粮");
    }
    @Override
    public void sleep() {
        System.out.println(this.name + "睡觉了!");
    }
}

第三步:Cat类登场


public class Cat extends AbstractCat{

    public Cat(String name, Integer weight) {
        super(name, weight);
    }
    
    @Override
    public void move() {
        System.out.println("重达" + weight + "kg的" + this.name + "在懒洋洋的跑");
    }
}

小结

1.普通类可以实例化调用,但是抽象类不可以,因为抽象类只是一种概念,无法映射为具体的对象.

2.普通类和抽象类都可以被继承,但是抽象类被继承之后,子类需要重写抽象类中的全部抽象方法,否则子类必须是一个抽象类.

参考和扩展阅读

Java基础系列第一弹之方法重载和方法重写的区别
Java基础系列第二弹之Java多态成员访问的特点
Java基础系列第三弹之操作字符串的类都有哪些?区别是什么?

到此这篇关于详解Java抽象类与普通类的区别的文章就介绍到这了,更多相关Java抽象类与普通类内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 详解Java抽象类与普通类的区别

本文链接: https://lsjlt.com/news/128139.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 详解Java抽象类与普通类的区别
    浅谈抽象类 在面向对象概念中,所有的对象都是通过类来描述的,但是反过来,并不是所有的类都是用来描述对象的.如果一个类中没有足够多的信息来描述一个具体的对象,这样的类就是抽象类。 ...
    99+
    2024-04-02
  • java抽象类与普通类有什么区别
    Java抽象类与普通类有以下区别:1. 实例化:抽象类不能被实例化,即不能创建抽象类的对象,而普通类可以被实例化。2. 继承:子类继...
    99+
    2023-09-22
    java
  • java中抽象类与普通类、接口的区别分别是什么
    抽象类:一个类中有抽象方法,这个类就变成了抽象类。抽象类中class的前面必须有abstract修饰符。抽象类中可以有普通方法,也可以有抽象方法,而抽象方法的个数可以是0个,也可以是多个。子类继承父类,必须重写全部的抽象方法,除非这个类也变...
    99+
    2015-07-03
    java入门 java 抽象类 普通类 接口 区别
  • 在java中普通类和抽象类有哪些区别
    java中普通类和抽象类的区别:普通类不能包含抽象方法,抽象类可以包含抽象方法。抽象类不能直接实例化,普通类可以直接实例化。抽象类可以有构造函数,抽象方法不能被声明为静态。抽象方法只需声明,而无需实现,抽象类中可以允许普通方法有主体。含有抽...
    99+
    2024-04-02
  • php抽象类和普通类有什么区别
    PHP中,抽象类和普通类有以下区别:1. 定义方式:抽象类使用关键字`abstract`定义,普通类不使用。2. 实例化:抽象类不能...
    99+
    2023-08-09
    php
  • Java 接口和抽象类的区别详解
    目录什么是抽象类和接口? 区别在哪里?抽象类接口抽象类和接口解决了什么问题?如何模拟抽象类和接口如何决定该用抽象还是接口?什么是抽象类和接口? 区别在哪里? 不同的编程语言对接口和...
    99+
    2024-04-02
  • Java抽象类和接口的区别详情
    1、抽象类 vs 接口  方法类型: 接口只能有抽象方法。抽象类可以有抽象和非抽象方法。从 Java 8 开始,它也可以有默认和静态方法。 最终变量: 在 Java...
    99+
    2024-04-02
  • Java抽象类详解
    抽象类 抽象类的概念 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。比如: 说明 1.矩形,三角形,圆形都...
    99+
    2023-09-23
    java 开发语言
  • java抽象类与接口的区别有哪些
    一、抽象类在Java中,被关键字abstract修饰的类称为抽象类;被abstract修饰的方法称为抽象方法,抽象方法只有方法声明没有方法体。抽象类有以下几个特点:抽象类不能被实例化,只能被继承。包含抽象方法的类一定是抽象类,但抽象类不一定...
    99+
    2019-10-06
    java入门 java 抽象类 接口 区别
  • 【JAVA】Object类与抽象类
    作者主页:paper jie_的博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《JAVASE语法系列》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造,将ja...
    99+
    2023-09-10
    java 开发语言
  • Java 入门:理解接口与抽象类的关键区别
    Java 接口与抽象类的关键区别 接口和抽象类都是 Java 中用于定义抽象类型的机制。它们具有不同的功能和限制,了解它们之间的区别对于有效使用它们至关重要。 接口 接口定义了一组抽象方法,它们必须由实现该接口的任何类实现。接口无法包含...
    99+
    2024-03-03
    Java 接口、抽象类、继承、多态、方法实现
  • java中的接口与抽象类有什么区别
    java中的接口与抽象类有什么区别?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。java 中接口和抽象类的区别与对比接口和抽象类的概念不一样。 接口是对动作的抽象,抽象类是对根...
    99+
    2023-05-31
    java ava
  • Java中接口与抽象类的区别是什么
    本篇文章为大家展示了Java中接口与抽象类的区别是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一.抽象类在了解抽象类之前,先来了解一下抽象方法。抽象方法是一种特殊的方法:它只有声明,而没有具体...
    99+
    2023-05-31
    java 别是 ava
  • java 多态与抽象类详解总结
    目录前言多态初识多态什么是多态?多态的分类多态的必要条件实现多态向上转型向下转型instanceof运算符具体实现抽象类与抽象方法为什么要使用抽象?抽象方法抽象类前言 今天是2021...
    99+
    2024-04-02
  • Java 抽象类详细讲解
    目录 Java抽象类概念 Java抽象类示例 继承Animal类的子类的示例 Java抽象类详细使用方法 1、定义抽象类 2、继承抽象类 3、实现抽象方法 4、完整示例代码 Java抽象类概念 Java中抽象类是指用abstract关键...
    99+
    2023-09-04
    java jvm 开发语言 javase 面向对象
  • Java抽象类(基础详解)
    目录 1.概念 2.抽象类的使用 2.1抽象方法 2.2抽象类 2.3抽象类的使用 2.4注意事项 1.概念 普通类是一个完善的功能类,可以直接产生实例化对象,并且在普通类中可以包含有构造方法,普通方法,static方法,常量和变量等内容...
    99+
    2023-10-21
    java 开发语言
  • JAVA抽象类,接口,内部类详解
    目录一.内容抽象类抽象方法与抽象类抽象类的使用接口接口的概念接口的定义接口中的成员变量接口中的方法接口的继承接口的实现/使用接口与抽象类的差异面向接口编程内部类非静态内部类静态内部类...
    99+
    2024-04-02
  • 详解Java语言中的抽象类与继承
    目录一、实验目的二、实验要求三、实验报告要求四、实验小结一、实验目的 1、掌握抽象类的设计; 2、掌握抽象方法方法的实现; 3、熟悉类的向下向上转型,以及子类实例化父类对象的基本要求...
    99+
    2022-11-13
    Java抽象类 继承 Java抽象类 Java 继承
  • Java 接口与抽象类:解惑常见误区
    接口 定义:接口是一个纯抽象类,它只包含方法声明而不包含实现。它定义了某个类型的行为特征,但没有提供具体实现。 语法:使用 interface 关键字定义。方法声明没有修饰符,默认情况下是 public abstract。 用途:使用接...
    99+
    2024-04-02
  • 【JAVA】抽象类与接口
    作者主页:paper jie_的博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《JAVASE语法系列》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造,将ja...
    99+
    2023-09-08
    java 开发语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作