抽象方法真的不能实例化么?

原理要解:抽象类其实是可以实例化的,但是他的实例化方式不是通过new方式来创建对象,而是通过父类的引 用来指向子类的实例来间接地实现父类的实例化(因为子类要实例化前,一定会先实例化他的父类。这样创建了继承抽象类的子类的对象,也就把其父类(抽象类) 给实例化了).

但是:接口是不能被实例化的(接口压根就没有构造函数),与上面的原理相似同样 
接口类型的引用可以指向其子类的对象
  例如:package com.etc;
public abstract class A
{
    private
String str;
   
    public
A(String  a)
    {
   
   
System.out.println("父类已经实例化");
   
   
this.str=a;
   
   
System.out.println(str);
    }
    public
abstract void play();
}

package com.etc;

public class B extends A
{
    public
B(String a)
   
{super(a);
   
   
System.out.println("子类已经实例化");
    }

public void
play()
    {
   
   
System.out.println("我实现了给方法");
    }
    public
static void main(String[] args)
    {
   
    A aa = new
B("aa");
    }
}
运行B类结果如下: 父类已经实例化
               
  aa
                
子类已经实例化

另外:
Calendar中的getInstance ( )

Calendar Cal
=  Calendar.getInstance();

Calendar是抽象类不能直接通过new对象,但是提供的静态getInstance()就是给Calendar创建对象。
从Calendar.getInstance() 中所获得的实例其实就是一个 "GreogrianCalendar" 对象

GreogrianCalendar就是Calendar的子类,他实现了Calendar里面的抽象方法。过父类的引用来指向子类的实例来间接地实现父类的实例化。同时,使用getInstance()有诸多好处:

1。 new
一定要生成一个新对象,分配内存;getInstance()则不一定要再次创建,它可以把一个已存在的引用给你使用,这在效能上优于new;

2。new创建后只能当次使用,而getInstance()可以跨栈区域使用,或者远程跨区域使用。所以getInstance()通常是创建static静态实例方法的。

时间: 2024-08-08 01:04:15

抽象方法真的不能实例化么?的相关文章

Java中抽象类也能实例化

在Java中抽象类真的不能实例化么? 在学习的过程中,发现了一个问题,抽象类在没有实现所有的抽象方法前是不可以通过new来构建该对象的,但是抽象方法却是可以有自己的构造方法的.这样就把我搞糊涂了,既然有构造方法,又不可以通过new来创建,那么抽象类在没变成具体类的时候究竟可不可以实例化呢? 通过上网查找资料.引用:blog.sina.com.cn/s/blog_7ffb8dd5010120oe.html 抽象类其实是可以实例化的,但是他的实例化方式不是通过new方式来创建对象,而是通过父类的引用

Java中抽象类也能实例化.RP

在Java中抽象类真的不能实例化么? 在学习的过程中,发现了一个问题,抽象类在没有实现所有的抽象方法前是不可以通过new来构建该对象的,但是抽象方法却是可以有自己的构造方法的.这样就把我搞糊涂了,既然有构造方法,又不可以通过new来创建,那么抽象类在没变成具体类的时候究竟可不可以实例化呢? 通过上网查找资料.引用:blog.sina.com.cn/s/blog_7ffb8dd5010120oe.html 抽象类其实是可以实例化的,但是他的实例化方式不是通过new方式来创建对象,而是通过父类的引用

抽象类、抽象方法与代码块

abstract:抽象的,可以用来修饰类.方法 1.abstract修饰类:抽象类 1)不可被实例化2)抽象类有构造器 (凡是类都有构造器)3)抽象方法所在的类,一定是抽象类.4)抽象类中可以没有抽象方法.>当我们设计一个类,不需要创建此类的实例时候,就可以考虑将其设置为抽象的,由其子类实现这个类的抽象方法以后,就行实例化 2.abstract修饰方法:抽象方法 1)格式:没有方法体,包括{}.如:public abstract void eat(); 2)抽象方法只保留方法的功能,而具体的执行

抽象类和抽象方法(关键字abstract)

 1.抽象类不能被实例化,可以没有,一个或多个抽象方法  2.抽象方法只有方法的声明但没有方法的实现,有抽象方法的类必须声明为抽象类,子类必须重写父类所有的抽象方法才能被实例化,否则子类也是个抽象类,  3.abstrat可以用来修饰类和方法,但不能修改属性和构造函数,但可以有构造方法

Java——抽象类和抽象方法

抽象方法和抽象类必须使用 abstract 修饰符来定义,有抽象方法的类只能被定义成抽象类,抽象类可以没有抽象方法. >抽象方法和抽象类的规则如下: >抽象类必须使用 abstract 修饰符来定义,抽象方法也必须使用 abstract 修饰符来修饰,抽象方法不能有方法体. >抽象方法不能被实例化,实例化的工作应该交由它的子类来完成,它只需要一个引用即可. >抽象类可以包含成员变量.方法(普通方法和抽象方法都可以).构造器.初识化块.内部类(接口.枚举)5种成分.抽象类的构造器不能

C#中的继承 (继承、抽象类和抽象方法、接口)

最近在研究重构,所以对于类,接口这些研究的也比较多,然后看各种资料,只要我感觉到能学到东西,就记录下来,感觉是件有意义的事情. 一.继承 什么是继承:继承是允许重用现有类去创建新类的过程.分类的原则是一个类派生出来的子类具有这个类的所有非私有的属性.1.继承C#中的类:C#不支持多重继承,C#类始终继承自一个基类(如果未在声明中指定一个基类,则继承自System.Object).派生类继承基类的语法如下:using System;public class Person{//这是基类}public

【幻化万千戏红尘】千峰培训Day09-java基础学习:接口,抽象类,抽象方法,多态,instanceof

课程回顾: 访问修饰符 private--->default--->protected---->public 重写:子类中 1.访问修饰符不能比父类的更严格 2.静态/非静态.返回值类型.方法名.形式参数类型必须相同 递归:方法内部出现了自己调用自己 abstract:关键字 抽象的 1.修饰类:抽象类 2.修饰方法:抽象方法 final:关键字 最终的 1.类 不能被继承 2.变量 常量 3.方法 不能被重写 今日内容: java原则之最佳匹配性原则 在调用重载方法时,会优先选择最适合

深入解读php中抽象(abstract)类和抽象方法

在面向对象(OOP)语言中,一个类可以有一个或多个子类,而每个类都有至少一个公有方法作为外部代码访问的接口.而抽象方法就是为了方便继承而引入的,现在来看一下抽象类和抽象方法分别是如何定义以及他们的特点. 什么是抽象方法? 我们在类里面定义的只有方法名没有方法体的方法就是抽象方法,所谓没有方法体就是在方法声明的时候没有大括号以及其中的内容,而是直接声明时在方法名后加上分号结束,另外在声明抽象方法时还要加一个关键字"abstract"来修饰. 1.抽象关键字 :abstract 抽象就是无

抽象类

什么是抽象类? 定义为抽象的类不能被实例化. 任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的. 被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现. 抽象关键字 :abstract 抽象就是无法确切的说明,但又有一定的概念或者名称,在PHP中声明一个抽象类或者方法我们需要使用adstract关键字. 抽象方法和抽象类的定义 一个类中至少有一个方法是抽象的,我们称之为抽象类.所以如果定义抽象类首先定义抽象方法. 1.类中至少有一个抽象方法