欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > Java中的“抽象类“详解

Java中的“抽象类“详解

2025/2/1 14:51:33 来源:https://blog.csdn.net/lxsxjsj/article/details/144194914  浏览:    关键词:Java中的“抽象类“详解

1.抽象类的定义

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

抽象类的概念是比较抽象的,比如现在有一个"父类"是"动物类",继承这个父类的子类中有"狗","猫",我们在子类中在去定义不同的特征,比如"年龄","名字","品种",但是这些特征在父类"动物类"中是不存在的,是抽象的,不容易理解的.

2.抽象类的语法

2.1在Java中被"abstract"修饰的类,我们称为"抽象类",抽象类中被"abstract"修饰的方法称为"抽象方法",抽象方法是不用给出具体的实现体的.

package Object9.package2;
//抽象类:被abstract修饰的类
public abstract class Test {//抽象方法:用abstract关键字修饰的方法,而且抽象方法是不能有方法体的abstract void draw();abstract public void run();
}

 2.2抽象类也是类,在抽象类中也是可以有,普通方法和属性的,以及构造方法

//抽象类:被abstract修饰的类
public abstract class Test {//抽象方法:用abstract关键字修饰的方法,而且抽象方法是不能有方法体的abstract void draw();abstract public void run();//普通方法public void sleep() {System.out.println("睡觉...");}//属性private int num = 10;//构造方法public Test(int num) {this.num = num;}
}

3.抽象类特性 

3.1抽象类不能直接实例化对象

public abstract class Test {Test test = new Test();//报错Test是抽象的无法实例化对象
}

3.2抽象方法的类型不能是private

public abstract class Test {private abstract void test();//报错:报错信息为:非法的修饰组合"private abstract"
}

3.3抽象方法不能被final与static修饰,因为子类要重写抽象类中的抽象方法

public abstract class Test {abstract final void test();abstract static void test2();//均发生报错//报错信息都是在警告"非法修饰符组合"
}

报错信息 

 

3.4抽象类必须被继承,并且继承的子类也要重写父类中的抽象方法,除非子类也是抽象类,必须要用abstract修饰

//父类Animal
public abstract class Animal {private String name;private int age;//提供一个"吃"的抽象方法public abstract void eat();
}
//子类Dog继承父类Animal
public class Dog extends Animal{//构造方法public Dog() {super();}
//重写父类的抽象方法@Overridepublic void eat() {System.out.println("eat");}
}

如果没有重写父类中的抽象类就会发生报错,报错信息如下

 

4.抽象类中不一定包含抽象方法,但有抽象方法的类一定是抽象类

5.抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量 

//父类Animal
public abstract class Animal {private String name;private int age;//提供一个"吃"的抽象方法public abstract void eat();//父类的构造方法public Animal(String name, int age) {this.name = name;this.age = age;}
}

 

6.抽象类的作用

 抽象类本身不能被实例化, 要想使用, 只能创建该抽象类的子类. 然后让子类重写抽象类中的抽象方法.

有些同学可能会说了, 普通的类也可以被继承呀, 普通的方法也可以被重写呀, 为啥非得用抽象类和抽象方法呢?确实如此. 但是使用抽象类相当于多了一重编译器的校验.
使用抽象类的场景就如上面的代码, 实际工作不应该由父类完成, 而应由子类完成. 那么此时如果不小心误用成父类了, 使用普通类编译器是不会报错的. 但是父类是抽象类就会在实例化的时候提示错误, 让我们尽早发现问题.
很多语法存在的意义都是为了 "预防出错", 例如我们曾经用过的 final 也是类似. 创建的变量用户不去修改, 不就相当于常量嘛? 但是加上 final 能够在不小心误修改的时候, 让编译器及时提醒我们.
充分利用编译器的校验, 在实际开发中是非常有意义的.

 

 

 

 

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com