温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

抽象类是否能实例化

发布时间:2021-10-20 15:29:09 来源:亿速云 阅读:456 作者:iii 栏目:web开发

本篇内容介绍了“抽象类是否能实例化”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

抽象类不能实例化

抽象类不能直接通过 new 去实例化一个对象,那它就是不能实例化,要获取抽象类的对象,需要先用一个类继承抽象类,然后去实例化子类。

也可以用匿名内部类,在抽象类中创建一个匿名的子类,继承抽象类,通过特殊的语法实例化子类的对象(这个后面会详细解释) 。

现在重点来了,要研究这个问题,前提是你要了解抽象类,万变不离其宗,我们从抽象类的根源谈起 ,深化对抽象类的理解。

首先看这个例子:

package com.my.animal;     //动物类  public class Animal {  String name;//名字  String color;//颜色     public Animal(String name,String color){  this.name = name;  this.color = color;  }  public void run(){  System.out.println(name+"四条腿跑的很快!!!");  }  }  //狗类继承动物类  class Dog extends Animal{  public Dog(String name,String color){  super(name,color);  }  }  //鱼类继承动物类  class Fish extends Animal{     public Fish(String name, String color) {  super(name, color);  }  }     class Test{  public static void main(String[] args) {  Dog dog = new Dog("哈巴狗","白色");  dog.run();     Fish fish = new Fish("锦鲤","红色");  fish.run();  }  }

运行结果:

哈巴狗四条腿跑的很快!!!

锦鲤四条腿跑的很快!!!

是不是发现问题了,鱼怎么能用腿跑呢,难道是原始鱼?

哈哈,开玩笑的,这个问题如何解决?估计大家马上想到了,在子类中重写父类的 run 方法不就行了。

对,确实这样就可以解决,但是大家想过没有,我们是如何发现这个问题的?

是不是编译运行之后才看到的,当然,也有大佬能不编译运行就能看到,不抬杠啊。

意思是说有发现不了这个问题的风险,对别人可能无所谓,但对我们程序员来说,这种低级错误还是不犯的好,程序员应该有更高的追求,岂能在这被绊倒,我们要把这种风险降为零,那该如何做呢?

不急,心急吃不了热豆腐,且看我慢慢分析:

目前存在的问题:

1.动物类的run方法描述的不正确

2.没有强制要子类一定要重写父类的run方法

解决方案:(抽象类的应用场景)

我们在描述一类事物的时候,发现该种事物确实存在着某种行为,但是这种行为目前是不具体的,那么我们可以抽取这种行为的声明,但是不去实现该种行为,这时候这种行为我们称作为抽象的行为,我们就需要使用抽象类

先看下面的例子:

package com.my.animal;  //动物类(抽象类)  public abstract class Animal {  String name;//名字  String color;//颜色  //构造方法  public Animal(String name,String color){  this.name = name;  this.color = color;  }  //非抽象方法  public void eat(){  System.out.println(name+"吃东西!!!");  }  //抽象方法  public abstract void run();  }     class Dog extends Animal{  public Dog(String name,String color){  super(name,color);  }     @Override  public void run() {  System.out.println(name+"四条腿跑得快!!");  }  }     class Fish extends Animal{     public Fish(String name, String color) {  super(name, color);  }     @Override  public void run() {  System.out.println(name+"摇摇尾巴游啊游!!");  }  }     class Test{  public static void main(String[] args) {  Dog dog = new Dog("哈巴狗","白色");  dog.run();     Fish fish = new Fish("锦鲤","红色");  fish.run();  }  }

运行结果:

哈巴狗四条腿跑得快!!

锦鲤摇摇尾巴游啊游!!

这个问题解决了,那下面解决的问题就是:抽象类能实例化对象吗?

看这个例子就知道了:

{  String name;  String color;     public Animal(String name,String color){  this.name = name;  this.color = color;  }  public abstract void run();  }     class Test{  public static void main(String[] args) {  Animal a = new Animal();  a.run();  }  }

运行结果:

Error:(45,20) java:com.my.animal.Animal是抽象的;无法实例化

抽象类注意的细节:

1.如果一个函数没有方法体,那么该函数必须要使用abstract修饰,把该函数修饰成抽象的函数。

2.如果一个类出现了抽象的函数,那么该类也必须使用abstract修饰。

3.如果一个非抽象类继承了抽象类,那么必须要把抽象类的所有抽象方法全部实现。

4.抽象类可以存在抽象方法,也可以存在非抽象方法,还可以不存在抽象方法,但是这样没任何意义,Java是不写废话的。

5.抽象类是不能实例化对象的

6.抽象类是存在构造函数的,其构造函数是提供给子类创建对象的时候初始化父类的属性的。

疑问:为什么抽象类不能实例化对象?

因为抽象类是存在抽象方法的,如果能让抽象类创建对象的话,那么使用抽象类的对象调用抽象方法是没有任何意义的。

疑问排解了,故事结束了?不,学海本无底,我们来点扩展,就是开头提到的如何用匿名内部类去实例化子类对象。

看下面的例子:

public class Java_Abstract2 {     public void a(){  System.out.println("我是抽象类中的一个非抽象方法");  }     public static Java_Abstract2 newIntences(){  return new Java_Abstract2(){     };  }  }     class Test2{  public static void main(String[] args) {  Java_Abstract2 java_abstract2 = Java_Abstract2.newIntences();  java_abstract2.a();  }  }

运行结果:

我是抽象类中的一个非抽象方法

“抽象类是否能实例化”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI