精华内容
下载资源
问答
  • 抽象类中可以有普通方法吗
    千次阅读
    2020-10-18 22:02:42

    微信搜索《Java鱼仔》,每天一个知识点不错过

    (一)每天一个知识点

    抽象类必须要有抽象方法吗?抽象类能使用 final 修饰吗?

    (二)结论

    抽象类不必须有抽象方法,但如果一个类包含抽象方法,则该类必须是抽象类。

    抽象类不能用final修饰,因为抽象类必须被继承,而被final修饰的类不能被继承。

    (三)再多学一点

    虽然几乎每个程序员都知道抽象类,但是实际开发中抽象类对大多数人来说就只是一个概念,用到的机会很少。理由也很简单,抽象类是抽取共性需求而来的,即使没有抽象类,对业务的实现也没有影响。但是如果合理应用抽象类,能增强代码的重用性,更加有效地解决复杂需求。

    继续回到题目:抽象类必须要有抽象方法吗?

    当然不必须有,甚至于一个抽象类可以没有任何一个抽象方法,这个类除了不能被实例化之外,和普通的类几乎没有任何区别。

    但是如果一个抽象类中有抽象方法,那么他的子类必须要实现抽象方法。

    第二个问题:抽象类可以使用final修饰吗?

    当然不可以,通过理解抽象类的作用我们就发现了,抽象类必须要被继承,如果用final修饰抽象类,这个抽象类就无法被继承,自然就无法使用了。

    更多相关内容
  • 它们的语法区别:1)接口不能构造方法抽象类可以有。2)接口不能有方法体,抽象类可以有。3)接口不能静态方法抽象类可以有。4)在接口凡是变量必须是public static final,而在抽象类中没有要求。忽然此...

    以举例的方式说到如何区分抽象类和接口,这里我们从Java语法谈起,使我们更加了解这两者的内在区别。它们的语法区别:

    1)接口不能有构造方法,抽象类可以有。

    2)接口不能有方法体,抽象类可以有。

    3)接口不能有静态方法,抽象类可以有。

    4)在接口中凡是变量必须是public static final,而在抽象类中没有要求。

    忽然有此一文,是因为同学疑惑道:抽象类居然还有构造方法,又不能直接用来new。我的解释是平时在抽象类中对于构造方法的存在,没有什么印象,是因为IDE默认为你生成了一个无参构造方法,也可以显式地写出构造方法,这个构造方法,是用来被子类调用的,因为任何子类都必须调用从Object开始的所有父亲的构造方法,才算完成初始化工作。那么我引申一下,问他们,接口有构造方法吗?他们的理解,抽象可以有,为什么接口不可以有?!那么在接口里写入构造方法时,编译器提示:Interfaces cannot have constructors。这又何解?

    从语法的角度来说,抽象类必须有构造方法,而接口严禁有构造方法,这本身也说明了它们性质的不同。抽象类是一个类,别的类是用关键字 extends 来继承下来,并扩展的,有非常强的is-a的关系,这种关系一般来说符合里氏代换原则。而接口,是被其他类用关键字 implements 来实现接口定义的方法的。如果没什么区别,何必整出两个不同的关键字。  接口只是定义功能和行为规范,如果一个类实现了一个接口,那么这个类必须遵守这个接口的方法约定,但没有is-a的关系。把墙壁上的“小学生行为规范”想象成一个接口,那么是小学生必须遵守这个约定,但小学生不是“行为规范”。

    构造方法是用来在对象初始化前对对象进行一些预处理的,提供了实例化一个具体东西的入口。接口只是声明而已,不一定要进行什么初始化,就算要进行初始化,也可以到实现接口的那一些类里面去初始化。接口只是用来表述动作,表述规范来的,可以new一台computer,但我们无法new一个IDE、SATA、PCI、PS-2。因此,接口要构造方法何用?接口是一种规范,被调用时,主要关注的是里边的方法,而方法是不需要初始化的,类可以实现多个接口,若多个接口都有自己的构造器,则不好决定构造器的调用次序,构造器是属于类自己的,不能继承,因为是纯虚的,接口不需要构造方法。而抽象类是具体类的祖先,即使是石器时代,也总要干些初始化的工作,抽象类虽然是不能直接实例化,但实例化子类的时候,就会初始化父类,不管父类是不是抽象类都,都会调用父类的构造方法,初始化一个类,先初始化父类,有没有说初始化接口。

    1)Java中抽象类和接口中有构造方法吗?

    在接口里写入构造方法时,编译器提示:Interfaces cannot have constructors。

    A. 构造方法用于初始化成员变量,但是接口成员变量是常量,无需修改。接口是一种规范,被调用时,主要关注的是里边的方法,而方法是不需要初始化的,

    B. 类可以实现多个接口,若多个接口都有自己的构造器,则不好决定构造器链的调用次序

    C. 构造器是属于类自己的,不能继承。因为是纯虚的,接口不需要构造器。

    在抽象类中可以有构造方法,只是不能直接创建抽象类的实例对象,但实例化子类的时候,就会初始化父类,不管父类是不是抽象类都会调用父类的构造方法,初始化一个类,先初始化父类。

    A.方法名与类名相同;

    B.没有返回类型(例如return、void等);

    C.不能被static、final、native、abstract和synchronized修饰,不能被子类继承。

    D.父类的构造方法不能被子类调用,可以通过super语句调用父类的构造方法。

    E.构造方法可以重载,以参数的个数,类型,顺序,分为空参构造方法和有参构造方法。

    注:

    抽象类中不一定有抽象方法,抽象方法一定存在于抽象类中。

    继承抽象类的可以是普通类,但必须重写抽象类中的所有抽象方法,也可以是抽象类,无需重写抽象类中的所有抽象方法。

    注:

    可以说是一种特殊的抽象类,里面的方法全是抽象方法。

    子类实现接口必须对接口中的方法全部重写。

    1)接口不能有构造方法,抽象类可以有。

    2)接口不能有方法体,抽象类可以有。

    3)接口不能有静态方法,抽象类可以有。

    4)在接口中凡是变量必须是public static final,而在抽象类中没有要求。

    展开全文
  • 学些Java的抽象类和抽象方法,书介绍一个例子:【问题描述】编写一个抽象父类SpeedMeter速度表,提供普通方法getSpeed()计算速度,给子类使用,但留给子类实现抽象方法getRadius(),且getSpeed()依赖getRadius();...

    学些Java的抽象类和抽象方法,书中介绍一个例子:

    【问题描述】编写一个抽象父类SpeedMeter速度表,提供普通方法getSpeed()计算速度,给子类使用,但留给子类实现抽象方法getRadius(),且getSpeed()依赖getRadius();

    书中抽象方法getRadius()没有入参,我想试下有入参的实现,由于初学,经过多次调试才调通,总结下经验。


    【代码示例】

    抽象父类SpeedMeter代码如下:

    public abstract class SpeedMeter {
        /*成员变量*/
        private double radius;
        private double turnRate;
        /*构造器*/
        public SpeedMeter(double radius) {
            this.radius = radius;
        }
        /*setter/getter*/
        public void setTurnRate(double turnRate) {
            this.turnRate = turnRate;
        }
        public double getTurnRate() {
            return turnRate;
        }
        public void setRadius(double radius) {
            this.radius = radius;
        }
        public double getRadius() {
            return radius;
        }
        /*抽象方法*/
        public abstract double getRadius(double radius);
        /*普通方法*/
        public double getSpeed() {
            return 2 * Math.PI * this.getRadius(this.getRadius()) * turnRate;
        }
    }

    子类CarSpeedMeter汽车的速度表,实现了父类的getRadius方法,代码如下:

    public class CarSpeedMeter extends SpeedMeter {
        public CarSpeedMeter(double radius) {
            super(radius);
        }
    
        @Override
        public double getRadius(double radius) {
            return 2 * radius;
        }
    
        public static void main(String[] args) {
            CarSpeedMeter cs = new CarSpeedMeter(19);
            cs.setTurnRate(1000);
            System.out.println("计算汽车每秒行驶距离是:" + cs.getSpeed());
        }
    }
    【说明】【普通方法依赖抽象方法时,抽象方法有入参的实现方法】

    一开始我对抽象父类SpeedMeter中普通方法getSpeed()中依赖的抽象方法getRadius的入参苦恼不已,不知道这里的入参该写什么,后来我的思路是:

    因为抽象方法getRadius(double radius)中radius是局部变量,不能直接给普通方法getSpeed()使用,所以想可以通过抽象父类SpeedMeter的构造器传入radius的值,然后在普通方法getSpeed()中给抽象方法getRadius作为入参使用;

    注意抽象父类SpeedMeter中有2个getRadius方法,但是必要的,完全不同的:

    1个是没有入参的getRadius方法,作用是获取构造器入参值,对应成员变量radius的getter方法;

    1个是抽象方法,需要子类实现,有入参radius的getRadius方法,实现中,被普通方法getSpeed()使用,入参值使用构造器传入的值;


    本人初学者,肯定有说的不对的地方,希望大神们指教,有没有更好的实现方法。

    展开全文
  • java抽象类和抽象方法

    千次阅读 2021-03-07 00:02:17
    一、什么是抽象类和抽象方法没有具体功能的实现,通过子类继承后重写方法来实现一定约束的类称之为抽象类抽象类必须被abstract修饰。抽象方法就是只有方法声明,没有方法体的方法抽象类的使用一般通过继承来实现...

    一、什么是抽象类和抽象方法

    没有具体功能的实现,通过子类继承后重写方法来实现一定约束的类称之为抽象类,抽象类必须被abstract修饰。抽象方法就是只有方法声明,没有方法体的方法。抽象类的使用一般通过继承来实现

    二、为什么需要抽象类和抽象方法

    引用抽象方法和抽象类,是java提供的一种语法工具,引导使用者正确的使用它们,减少误用。相当于对子类进行一定限制。

    三、抽象类和抽象方法的语法规则及其注意事项

    抽象类抽象方法必须被abstract修饰。

    抽象类中可以有普通方法,但是有抽象方法的类必须是抽象类。抽象类中的普通方法因为不能被创建对象,所以不能使用这个普通方法。

    抽象类除了不能实例化对象之外,类的其它功能依然存在。

    抽象方法中可以有被static修饰main方法,并且可以执行。

    一个类在继承抽象类后,必须实现抽象类中定义的所有抽象方法。除非它自己也声明为抽象类。

    抽象方法名后面直接跟一个分号,而不是花括号。

    四、抽象类和抽象方法的实现案例

    1、抽象类中可以有普通方法,但是有抽象方法的类必须是抽象类。

    public abstract class Demo01 {

    public abstract void run();

    public void test(){}

    }

    //编译通过,不报错

    public class Demo01 {

    public abstract void run();

    public void test(){}

    }

    //报错:

    Class 'Demo01' must either be declared abstract or implement abstract method 'run()' in 'Demo01'

    Abstract method in non-abstract class

    2a03c1ce46b001404d74cb483c53dfed.png

    2、抽象类除了不能实例化对象

    public abstract class Demo01 {

    public abstract void run();

    public static void main(String[] args) {

    Demo01 demo01=new Demo01();

    }

    }

    e391d9aa2a3f1229ee45ef3aa8a40ae4.png

    3、抽象方法中可以有被static修饰main方法,并且可以执行。

    public abstract class Demo01 {

    public abstract void run();

    public static void main(String[] args) {

    System.out.println("抽象类中的main方法");

    }

    }

    //输出结果:抽象类中的main方法

    4、抽象类的使用一般通继承来实现,且子类中要么对抽象类的方法进行重写,要么声明子类也为抽象类

    public class Demo02 extends Demo01{

    @Override

    public void run() {

    }

    }

    abstract class Demo03 extends Demo01{

    }

    //Demo02和Demo3均能编译通过。

    5、抽象类中的静态方法可以用类名.方法名的方式调用

    e48ac6d43d5525c72074397ed91e40cc.png

    6、抽象的实例:

    有抽象类Father,和抽象方法run()。

    public abstract class Father {

    private String name;

    private int age;

    private char sex='男';

    public int money=100_000;

    public String getName() {

    return name;

    }

    public void setName(String name) {

    this.name = name;

    }

    public int getAge() {

    return age;

    }

    public void setAge(int age) {

    this.age = age;

    }

    public char getSex() {

    return sex;

    }

    public void setSex(char sex) {

    this.sex = sex;

    }

    abstract void run();

    public void say(){

    System.out.println("这是父类普通方法");

    }

    public static void go(){

    System.out.println("这是父类静态方法");

    }

    }

    有子类Son继承了抽象类,重写了父类的抽象方法run

    public class Son extends Father{

    private double salary;

    @Override

    void run() {

    System.out.println("子类重写了父类的方法run");

    System.out.println(super.getSex());

    super.say();

    }

    public static void main(String[] args) {

    Son son=new Son();

    son.run();

    System.out.println(son.getSex());

    //System.out.println(super.getSex()); //错误

    son.setAge(47);

    System.out.println(son.getAge());

    son.setName("ThreePure");

    System.out.println(son.getName());

    //调用父类的公有属性

    System.out.println(son.money);

    //使用继承于父类的方法

    son.say();

    }

    }

    运行结果:

    子类重写了父类的方法run

    这是父类普通方法

    47

    ThreePure

    100000

    这是父类普通方法

    尽管我们不能实例化一个 Father类的对象,但是如果我们实例化一个 Son 类对象,该对象将从 Father 类继承 成员方法,且通过该方法可以设置或获取成员变量。

    五、抽象类的其他补充吗

    抽象类是否有构造器:

    e4dc66d994535459d7bdc270574d7b1e.png

    从图中我们可以知道抽象类也是有构造器的,并别在子类创建对象时被调用。

    public abstract class Demo3 {

    public Demo3() {

    System.out.println("抽象类的构造方法");

    }

    }

    public class Demo4 extends Demo3{

    public static void main(String[] args) {

    Demo4 demo4 =new Demo4();

    }

    }

    //抽象类的构造方法

    2、final与abstract的矛盾

    final关键字可以修饰类、方法、变量。final修饰的类不能被派生;final修饰的方法,禁止子类重写。所以我们可以看出,final和abstract不能一起使用。

    3、构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。

    ef1db7eeaea5b0eb959f00a80b959e63.png

    展开全文
  • 2、抽象类中可以存在抽象方法,但是普通类不允许抽象方法存在 3、抽象类继承自其他抽象类或实现接口,不要求必须实现抽象方法或接口方法普通类继承自其他抽象类或实现接口,则必须实现所有的抽象方法和接口方法 3....
  • 抽象类中是否一定要抽象方法

    千次阅读 2020-06-11 09:20:14
    抽象类可以没有抽象方法,但是如果你的一个类已经声明成了抽象类,即使这个类没有抽象方法,它也不能再实例化,即不能直接构造一个该类的对象。 如果一个类中有了一个抽象方法,那么这个类必须声明为抽象类,否则...
  • 主要介绍了Java抽象类和抽象方法定义与用法,结合实例形式详细分析了Java抽象类和抽象方法相关原理、定义、使用方法及操作注意事项,需要的朋友可以参考下
  • Java的抽象类中可以定义final方法吗?不太清楚,请指教谢谢
  • 抽象类是不是必须要抽象方法

    千次阅读 2021-08-15 23:57:30
    抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定...
  • java抽象类可以被继承吗?

    千次阅读 2021-03-06 06:39:35
    Java语言,用abstract 关键字来修饰一个类时,这个类叫作抽象类。...抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。由于抽象类不能实例化对象,所...
  • 普通类和抽象类有哪些区别?

    万次阅读 多人点赞 2019-04-18 14:23:50
    抽象类可以有抽象方法,抽象方法只需申明,无需实现 含有抽象方法的类必须申明为抽象类 抽象的子类必须实现抽象类中所有抽象方法,否则这个子类也是抽象类 抽象方法不能被声明为静态 抽象方法不能用private修饰...
  • Java中抽象类和接口中有构造方法吗?

    千次阅读 2019-04-18 20:22:00
    (1) Java中抽象类和接口中有构造方法吗? ①在接口可以有构造方法 在接口里写入构造方法时,编译器提示:Interfaces cannot have constructors。 A. 构造方法用于初始化成员变量,但是接口成员变量是常量,无需...
  • 普通类继承抽象类,重写所有抽象类方法;(不包括普通方法普通类继承接口,重写所有接口方法。(不包括default关键字修饰的方法) 详解见下: 普通类继承,并非一定要重写父类方法抽象类继承,如果子类...
  • 你知道java当中的普通类和抽象类之间什么区别吗?这两者的不同之处究竟是什么呢?下面就和小编一起来详细的了解一下吧。一、抽象类普通类区别抽象类普通类的区别我们做了以下7点简单的总结,相信看了的朋友应该...
  • 目录1. 如何调用抽象类中的抽象方法?2. 如何调用接口的抽象方法? 1. 如何调用抽象类中的抽象方法? 2. 如何调用接口的抽象方法
  • 抽象类和抽象方法详解

    千次阅读 2020-08-20 16:21:09
     我们都知道,父类是将子类所共同拥有的属性和方法进行抽取,这些属性和方法中的是已经明确实现了的,的还无法确定,那么我们就可以将其定义成抽象,在以后子类进行重用,进行具体化。这样,抽象类也就诞生了...
  • 如何调用抽象类中的非抽象方法

    千次阅读 2020-10-18 15:40:28
    2.在抽象类中的成员方法可以包括一般方法和抽象方法。抽象方法就是以abstract修饰的方法,这种方法只声明返回的数据类型、方法名称和所需的参数,没有方法体,也就是说抽象方法只需要声明而不需要实
  • 如何在java调用抽象类方法

    千次阅读 2021-03-03 12:21:42
    我想在我自己的类调用一个抽象类方法.抽象类是:public abstract class Call {public Connection getEarliestConnection() {Connection earliest = null;...return earliest;}}我想调用上面的方法,调用类是:...
  • 如果一个类抽象方法,则该类必须声明为抽象类 抽象类可以被实例化,只能被继承 继承了抽象类的子类,必须发父类的抽象方法实现出来 接口 接口是一个特殊的抽象类,里面只能抽象方法 接口使用interface定义 ...
  • 七、java抽象类和抽象方法详解

    千次阅读 2020-12-24 10:53:56
    一、概述: 1、什么是抽象? 提到抽象,人们自然会想到将『抽象』作为其一大特性的『面向对象编程(OOP)』(面向对象的四大特性:抽象、封装、继承、多态)确实,『抽象』这个概念只出现在『面向...类中有属性、方法
  • C#抽象类、抽象属性、抽象方法

    千次阅读 多人点赞 2020-06-10 00:51:31
    前言:本博文讲述了C#面向对象抽象类,通过本博文的阅读,读者可以掌握C#抽象类的概念、应用、好处以及一些特性。 文章目录一、抽象类概念二、示例讲解三、抽象类的作用四、使用抽象类的好处五、抽象类总结 一、...
  • 因为抽象类不能实现实例但是一旦一个普通类继承了抽象类 便也可以在构造函数调用其抽象类的构造函数也可以使用其方法可以这么理解吧 抽象类就是一个不能实例化的不同类不过如果方法加了abstract那么就必须在子类...
  • Java中抽象类方法的重写

    千次阅读 2020-11-10 22:29:33
    1. 抽象类 关键字:abstract 类:用来描述一类具体的事物 抽象类:抽象的、模糊的、不具体的类 在Java的普通类中是不允许多继承的,原因是会出现调用 不明确的问题;...抽象类中可以有构造器,但是不能创建
  • 抽象类普通什么区别

    千次阅读 2020-08-08 16:18:41
    抽象类普通什么区别 声明方式不同 抽象类不能被实例化 抽象类中可以含有抽象方法可以含有普通方法,普通不能含有抽象方法,含有抽象方法的类都是抽象类 抽象方法不能声明为静态 ...
  • 这种理解是有些片面的,一个抽象类可以不包含抽象方法;但是实际使用不会 这样定义。因为抽象类是不可以创建对象的,如果不包含抽象方法的话就失去了定义 抽象类的实际意义了。 1.3 抽象类普通类的区别 1....
  • 抽象类中是否可以有静态的main方法? 上面这个题目我们来慢慢的剖析一下。先从基本的概念说起。 一、接口 官方解释:Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 289,118
精华内容 115,647
关键字:

抽象类中可以有普通方法吗