-
2021-02-27 12:43:48
转载:http://blog.csdn.net/zhanzhan0329/article/details/9173419
首先明确地说:抽象类不能被实例化。
我对抽象类能否被实例化产生疑问始于我看到一句话说:子类实例化会先实例化父类。而且,自己也知道,抽象类作为父类,其子类是能调用他的属性和已实现方法的。这证明抽象父类在内存是有一定空间的。(百度百科说:实例化其实就是在内存中开放一个空间用于存储新的产物,即对象)
后来发帖问了,总结得到:子类实例化会先初始化父类,父类初始化并不是又创建一个父类对象,而是把父类中定义的对象相关属性都初始化,因为这些属性子类对象也是拥有的。所以,为了保证子类对象的完整性,要从最底层的父类开始,逐级初始化,所有初始化都完成后才会生成一个完整的子类对象。(也就是要区分开实例化和初始化)
其实也可以这么理解,抽象类的作用是对一类事物的描述和定义,所以他并不特指某一个东西,因为他是抽象的。(不要像我之前那样去钻牛角尖)
http://www.cnblogs.com/crt-share/archive/2015/08/29/4769331.html
抽象类其实是可以实例化的,但是他的实例化方式不是通过new方式来创建对象,而是通过父类的引用来指向子类的实例来间接地实现父类的实例化(因为子类要实例化前,一定会先实例化他的父类。这样创建了继承抽象类的子类的对象,也就把其父类(抽象类)给实例化了).但是:接口是不能被实例化的(接口压根就没有构造函数)。
http://blog.csdn.net/heqiyu34/article/details/6403142
更多相关内容 -
Java类继承关系中的初始化顺序实例详解
2020-08-25 15:28:11主要介绍了Java类继承关系中的初始化顺序,结合实例形式详细对比分析了Java非继承关系中的初始化与继承关系中的初始化相关原理与操作技巧,需要的朋友可以参考下 -
Java多子类继承同一父类实例化问题
2022-04-21 15:54:30Java(安卓开发)多子类继承同一父类实例化问题最近在学安卓的过程中发现了这么一个业务场景,现有一抽象类BaseFragment与三个子类(BluetoothManage、ControlCentral、WifiManage)。
public abstract class BaseFragment extends Fragment { private Context mContext; protected Handler wifiManageHandler = new Handler(){ @Override public void handleMessage(@NonNull Message msg) { super.handleMessage(msg); handleMsg(msg); } }; protected Handler controlCentralHandler = new Handler(){ @Override public void handleMessage(@NonNull Message msg) { super.handleMessage(msg); handleMsg(msg); } }; //消息处理 abstract void handleMsg(@Nullable Message msg); @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); mContext = getContext(); } }
需要使用Handler进行子类之间的消息传递,由各个子类分别重写handleMsg方法,即各自实现消息处理,比如在WifiManage类中调用父类的controlCentralHandler 发送消息时,实际处理消息的并非ControlCentral 类重写的handleMsg方法,而是指向父类的handleMsg方法,造成一种重写方法失效的假象,这是因为每个子类在初始化时都会对父类进行初始化,即WifiManage类与ControlCentral类所持有的父类对象并非同一实例,因而各自重写的handleMsg方法并不互通。
public class WifiManage extends BaseFragment { public WifiManage() { // Required empty public constructor } public static WifiManage newInstance() { WifiManage fragment = new WifiManage(); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_wifi_manage, container, false); return v; } @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); super.controlCentralHandler.sendEmptyMessage(9); } @Override public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); } @Override public void onDestroy() { super.onDestroy(); } @Override void handleMsg(@Nullable Message msg) { } }
public class ControlCentral extends BaseFragment { public ControlCentral() { } public static ControlCentral newInstance() { ControlCentral fragment = new ControlCentral(); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_control_central, container, false); return v; } @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); } @Override public void onDestroy() { super.onDestroy(); } @Override void handleMsg(@Nullable Message msg) { if (msg.what == 9 ){ Log.e("TAG","收到消息了"); } } }
我采用的解决办法是使用单例模式,因为这里不能使不同的子类在实例化时拿到的是同一个父类实例(至少我没有想到解决方法),因而可以将所有handler共同放在一个工具类中,该工具类的设计采用单例模式,即可解决该问题。
public class HandlerUtils{ private static HandlerUtils handlerUtils; private HandlerCallBack handlerCallBack,wifiManageHandlerCallBack,controlCentralHandlerCallBack,bluetoothManageHandlerCallBack;//处理回调 private Handler mHandler = new Handler(Looper.getMainLooper()) { @Override public void handleMessage(Message msg) { super.handleMessage(msg); handlerCallBack.handleMessage(msg); } }; protected Handler wifiManageHandler = new Handler(Looper.getMainLooper()){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); wifiManageHandlerCallBack.handleMessage(msg); } }; protected Handler controlCentralHandler = new Handler(Looper.getMainLooper()){ @Override public void handleMessage(@NonNull Message msg) { super.handleMessage(msg); controlCentralHandlerCallBack.handleMessage(msg); } }; protected Handler bluetoothManageHandler = new Handler(Looper.getMainLooper()){ @Override public void handleMessage(@NonNull Message msg) { super.handleMessage(msg); bluetoothManageHandlerCallBack.handleMessage(msg); } }; public static synchronized HandlerUtils getInstance(){ if (handlerUtils == null){ handlerUtils = new HandlerUtils(); } return handlerUtils; } public HandlerCallBack getHandlerCallBack() { return handlerCallBack; } public void setHandlerCallBack(HandlerCallBack handlerCallBack) { this.handlerCallBack = handlerCallBack; } public HandlerCallBack getWifiManageHandlerCallBack() { return wifiManageHandlerCallBack; } public void setWifiManageHandlerCallBack(HandlerCallBack wifiManageHandlerCallBack) { this.wifiManageHandlerCallBack = wifiManageHandlerCallBack; } public HandlerCallBack getControlCentralHandlerCallBack() { return controlCentralHandlerCallBack; } public void setControlCentralHandlerCallBack(HandlerCallBack controlCentralHandlerCallBack) { this.controlCentralHandlerCallBack = controlCentralHandlerCallBack; } public HandlerCallBack getBluetoothManageHandlerCallBack() { return bluetoothManageHandlerCallBack; } public void setBluetoothManageHandlerCallBack(HandlerCallBack bluetoothManageHandlerCallBack) { this.bluetoothManageHandlerCallBack = bluetoothManageHandlerCallBack; } public Handler getHandler() { return mHandler; } public Handler getWifiManageHandler() { return wifiManageHandler; } public Handler getControlCentralHandler() { return controlCentralHandler; } public Handler getBluetoothManageHandler() { return bluetoothManageHandler; } }
-
java继承类实例
2013-12-19 13:39:56自己设计的一个程序,展现有继承结构的子类对象的初始化过程(包含构造方法、初始化值、父类构造方法、父类的初始化值的环节) -
Java中子类中子类实例化父类对象
2019-05-03 18:08:39版权声明:博主原创/资料整理,转载请注明出处...1. 子类中,父类实例化父类对象,调用父类中的方法。 2. 子类中,子类实例化父类对象,调用子类中的方法。 3. 子类中,子类实例化子类对象,调用子类中的方法。版权声明:博主原创/资料整理,转载请注明出处!!
写一个父类,里面有两个方法,doing ()和talking(),并在doing ()方法中调用talking()方法。代码如下:
public class Father { public void doing (){ talking(); } public void talking(){ System.out.println("father is watching TV!"); } }
写一个子类来继承父类,重写doing ()和talking()方法。代码如下:
public class Son extends Father { public static void main(String[] args) { Father father = new Father(); father.doing(); Son son = new Son(); son.doing(); } @Override public void doing(){ talking(); } @Override public void talking(){ System.out.println("Son is watching TV!"); } }
此时结果是:
father is watching TV! Son is watching TV!
若子类代码改动如下所示:
public class Son extends Father { public static void main(String[] args) { Father father = new Son(); father.doing(); Son son = new Son(); son.doing(); } @Override public void doing(){ talking(); } @Override public void talking(){ System.out.println("Son is watching TV!"); } }
此时结果是:
Son is watching TV! Son is watching TV!
因此可见:
1. 子类中,父类实例化父类对象,调用父类中的方法。
2. 子类中,子类实例化父类对象,调用子类中的方法。
3. 子类中,子类实例化子类对象,调用子类中的方法。 -
java不能实例化类型
2021-03-04 06:28:068.String类对象的两种实例化方式_计算机...当Java虚拟机或者类装载器试图实例化某个类,而找不到该类的定义时抛出该错误。 java.lang.NoSuchFieldError 域不存在错误。当应用试图访问或者修改某类的某个域,......Jav...8.String类对象的两种实例化方式_计算机软件及应用_IT/计算机_专业资料。Java8面向对象编程视频课程 1、 课程名称:String 对象的两种实例化方式 2、知识点 2.1、......
当Java虚拟机或者类装载器试图实例化某个类,而找不到该类的定义时抛出该错误。 java.lang.NoSuchFieldError 域不存在错误。当应用试图访问或者修改某类的某个域,......
Java的类一些常识 “1、请解释Java语言的跨平台特性。解析:虽然不知道什么是跨平台也可以使用Java语言进行编程,但是对 于一个Java编程员来说,理解跨平台特性能够更......
Name D、join 14. 创建线程的最简单的方法就是创建一个实现 Runnable 接口的类在已经创建了实现 Runnable 接口的类以后,你 要在类内部实例化一个 Thread 类的......
声明与实例化合二为一 ( Java 中的对象只有实例化后,系统才真正 创建出它并为它分配出内存空间): Watch myWatch=new Watch(); //对象的声明与实例化合二为......
Java 中的类和接口都只支持单重继承。 ( N ) 27. 构造方法没有返回类型, 也不能写 void, 主要用于完成类对象的初始化工作, 一般不能直接编程( Y) 28. ......
Programming with Types Java是种强类型语言——必须显示规定数据类型 使用基本类型可以大大地改善系统的特性,但是它不具有对象的特性, 也不能满足很多特殊的需要。...
java练习(类与接口)_IT认证_资格考试/认证_教育专区。1. (分值: 分)Java 语言中创建一个对象使用的关键字为 A: class B: interface C: new D: create 2......
A. 在 Java 中类只允许单一继承 B. 在 Java 中一个类只能实现一个接口 C. 在 Java 中一个类不能同时继承一个类和实现一个接口 D. 在 Java 中接口只......
Java 中不能被实例化、 只能被子类继承的是___abstract___ 用英文拼写形写,不要写汉字!)。 4. Java 中不能被子类继承的类是___final___ 类 (请写出英......
Java常用类习题_计算机软件及应用_IT/计算机_专业资料。java常用类Java 常用类习题一、选择题 1. 下列 String 类的( B)方法返回指定字符串的一部分(选择一项) ......
值不允许为 null HashTable 的关键字不允许为 null,值允许为 null 3.对于下列代码: String str1="java"; String str2="java"; String str3=new String("......
在 java 语言中,类 worker 是类 person 的子类,worker...
C、Hello world D、Hello world Finally executing 2.下面关于 java 中类的说法哪个是不正确的( ) A、类体中只能有变量定义和成员方法的定义,不能有其他语句。...
="<
} } A) 编译异常 B) finally 语句块 和是:43 C) 和是:43 finally 语句块 D) catch 语句块 和是:43 答案:B 15.在 Java 中,关于 HashMap 类的描述,......
其他的协变问题 数组能够协变而泛型不能协变的另一个后果是, 不能实例化泛型类型的数组 (new List[3]是不合法的),除非类型参数是一个未绑定的通配符......
下述说法中,错误的是 A.Java 中,方法的重载是指多个方法可以共享同一个名字 B.Java 中,用 abstract 修饰的类称为抽象类,它不能实例化 C.Java 中,接口不......
[解析] 本题考查Java中的字节输入流。不能被实例化的类是抽象类,题目所给的4个选项中, 由于只有过滤器输入流是抽象类, 因此选项B不能被实例化。 FileInputSt......
D: 子类不能继承父类的私有属性 32. (分值:0.7 分)在java 语言中...
-
Java的抽象类实例化
2018-03-19 14:35:37《Java编程思想》书中定义抽象类:“包含抽象方法的类”。即如果一个类含有抽象方法,则称这个类为抽象类。 抽象类必须在类前用abstract关键字修饰。因为抽象类中含有无具体实现的方法,所以一般不能用抽象类创建... -
Java中抽象类的实例化、继承一些细节问题的记录
2019-03-24 12:25:28抽象类是由abstract修饰的类,它不能被实例化,但是它也... 一个类继承一个抽象类,当这个类被abstract修饰时,它可以不用继承抽象类的抽象方法,但是它不能被实例化,因为有未被完成的方法; 一下是代码实例: 创... -
Java类的 初始化 和 实例化区别
2020-09-23 17:13:30类的实例化:是指创建一个对象的过程。这个过程中会在堆中开辟内存,将一些非静态的方法,变量存放在里面。在程序执行的过程中,可以创建多个对象,既多次实例化。每次实例化都会开辟一块新的内存。 1.主要区别 ... -
不能实例化抽象类&抽象类不能实例化
2020-12-02 14:19:14在c++和java中我们会定义很多类,但是我们会遇到在对类进行new实例化时会遇到“不能实例化抽象类”或者“抽象类不能实例化”,针对这个问题要首先理解两个内容“抽象类”和“实例化” 如果只是想单纯的理解,那么... -
java 基础 类对象创建实例化过程 实例解析
2011-08-24 11:39:40继承关系:类的实例化顺序 * 执行过程为:启动类是否为继承关系树中的一个,如果是则先执行启动类的所有父类的静态语句块;然后执行启动类的静态语句块static{} -> * 执行启动类的main函数 -> 创建对象的继承树从... -
详解JAVA对象实例化过程
2020-08-18 10:32:171 对象的实例化过程对象的实例化过程是分成两部分:类的加载初始化,对象的初始化要创建类的对象实例需要先加载并初始化该类,main方法所在的类需要先加载和初始化类初始化就是执行<clinit>方法,对象实例化是... -
java抽象类实例化
2018-10-01 15:51:53简单的讲抽象类肯定是可以被实例化的,不过不是通过通常的 new方法来实现的,我们都知道抽象类必须被继承,且子类必须覆写父类中全部的抽象方法,但我们都知道在java中实例化子类的同时父类也必须被实例化,由此可知... -
JAVA子类继承-子类的实例化过程
2019-02-26 11:05:14一个对象的实例化过程 Person p = new Person(); 1,JVM会读取指定的路径下的Person.class文件,并加载进内存,并会先加载Person的父类(如果有直接的父类的情况下). 2,在堆内存中开辟空间,分配地址。 3,并在对象... -
java实例化对象后面添加花括号的理解分析
2019-04-11 16:02:27java实例化对象后面添加花括号的理解分析 昨天在看MyBatis官方文档时看到这么一段代码 return new SQL() {{ SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME"); FROM("PERSON P"); if ... -
Java类的定义及其实例化
2019-06-14 21:29:55类是创建对象的模板,创建对象也叫类的实例化。 下面通过一个简单的例子来理解Java中类的定义: publicclassDog{ Stringname; intage; voidbark(){// 汪汪叫 System.out.println(“汪汪,不要过来”); } ... -
Java 类的继承详解
2021-02-12 23:53:43这里将对JAVA中的类的继承机制进行讨论。先提一个问题:为什么要使用继承(后面再解答)。1.首先是类继承的写法:继承的关键字:extends格式:public class 类名(子类、派生类、超类) extends 类名(父... -
java抽象类到底能不能够实例化?
2020-03-07 16:31:58抽象类能不能被实例化? 测试 创建一个AbstractFruit抽象类 public abstract class AbstractFruit { public AbstractFruit(){ System.out.println("我是Fruit的抽象类,我被实例化了"); } public abstract v... -
java实例化一个抽象类的对象
2019-07-16 16:23:09不对啊,根据我的知识一个抽象类不能直接实例化一个对象出来,面向对象期末考试的卷子还有专门一道让你改错的题,一般抽象类直接实例化对象都是每年必考的错误点。那这个对象从哪实例化,国家分配的吗?先不管,结果... -
java中抽象类也需要构造函数 抽象类可以被实例化
2018-12-13 05:11:59今天被问到抽象类要不要有构造函数的时候, 我随口一答应该是没有的, 我以为, 抽象类是不能直接用new来被实例化的, 所以也就不需要再去写构造函数了; 随后查了一下明白: 抽象类也需要构造函数, 在大多数情况中抽象类... -
深入理解Java对象的创建过程:类的初始化与实例化
2017-05-18 14:17:45在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的。...本文试图对JVM执行类初始化和实例化的过程做一个详细深入地介绍,以便从Java虚拟机的角度清晰解剖一个Java对象的创建过程。 -
详解Java类、对象、实例化
2015-11-06 11:44:08Java是一种面向对象的语言。由于具有面向对象特性的语言,Java支持以下基本概念: 多态性 继承 封装 抽象化 类 对象 ...对象是类的实例。类 - 一个类可以被定义为描述行为的模板/蓝色印花/指 -
java抽象类可以被继承吗?
2021-03-06 06:39:35Java语言中,用abstract 关键字来修饰一个类时,这个类叫作抽象类。...抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。由于抽象类不能实例化对象,所... -
java实例化顺序
2018-05-20 23:00:131.继承没有的情况单独一个类的场景下,初始化顺序为依次为静态数据,继承的基类的构造函数,成员变量,被调用的构造函数。其中静态数据只会初始化一次。(静态数据包括静态代码块和静态变量,每个类的静态数据只会... -
java 注解的实例化
2017-01-28 22:17:03不过既然是interface,那么就不能直接实例化,但是却可以通过getAnnotation(Class)方法取得注解对象,这说明开发人员或内置注解一定在某个地方有个实现类。而这个实现类,其实就是JVM在运行时生成的,名称一般遵循$... -
JAVA中类的继承
2021-01-20 16:34:401、定义:继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。 2、目的:代码重用,类的重用。 名词:父类(基类,超类)子类(派生类)... -
父类的实例如何赋值给子类实例,java子类继承父类实例
2021-03-08 01:32:52Q1:php,子类无法访问父类私有属性,子类实例化再赋值后,子类所添加的新成员属性不存在我把涉及到这个问题的知识点,可以和大家分享一下:1.父类humanBeing , 子类student, 实例对象 $m (注意:$m是子类student 的... -
Java中 接口可以实例化吗?
2021-03-05 16:40:00Java中 接口可以实例化吗? 结论 接口不可以实例化,但是接口变量可以指向该接口实现类的对象; 注意点:该接口变量不能使用实现类中有、接口中没有的方法; 原因 首先:接口可以看做是特殊的抽象类,其方法都是... -
java 泛型实例化创建对象
2020-06-01 17:43:35//定义泛型抽象类 public abstract class TObjectFactory<T> { protected abstract T getTable(); } //继承使用 public class TableFactory<Table,Value> extends TObjectFactory<Table>{ ... -
java使用反射动态的获取接口的所有实现类并实例化(非抽象类)
2019-12-05 17:28:11实现的功能的业务是这样的,动态的获取java接口的所有的实现类并且排除抽象类和接口本身。 代码实现 1.创建接口Animal package com.tcp.executor; public interface Animal { public void say(); } 2.创建抽象类...