精华内容
下载资源
问答
  • 对于初学JAVA的人总搞清楚对象是如何实例化的,假如类之间存在继承关系,那就更糊涂了.总结以下内容,可以得到对象初始化过程: 1、 如果存在继承关系,就先父类后子类; 2 、如果在类内有静态变量和静态块,就先...

    学习JAVA这门面向对象的语言,实质就是不断地创建类,并把类实例化为对象并调用方法。对于初学JAVA的人总搞清楚对象是如何实例化的,假如类之间存在继承关系,那就更糊涂了.

    总结以下内容,可以得到对象初始化过程: 1、 如果存在继承关系,就先父类后子类; 2 、如果在类内有静态变量和静态块,就先静态后非静态,最后才是构造函数; 3 、继承关系中,必须要父类初始化完成后,才初始化子类。下面是一个例子:

    174ad5234c54e0e13cd176ca752f42b0.gif

    编译并运行该程序会有以下输出 Static Block Employee Company:china soft Non-Static Block Employee phone:0755-51595599 Employee(String) Empoloyee() 下面我们来对结果做分析: 1 在代码34行实例化对象时, 先对给静态变量分配内存空间并初始化,然后执行静态块。因此,在这里会输出: Static Block Employee Company:china soft Employee Company:china soft的输出也说明是先初始化静态变量然后再执行静态块,否则company将为null。 2然后在内存中为Employee分配内存空间,并做默认初始化(即所有变量初始化为默认值,这里都初始化为null)。 3 默认初始化完成后,开始显示初始化。即执行第5行,将phone初始化"0755-51595599",并且执行非静态方法块;因此在这里会有以下输出: Non-Static Block Employee phone:0755-51595599 4 最后才调用默认构造函数,在默认构造函数中调用了带参数的构造函数,所以在这里先输出带参数构造函数中的:Employee(String),然后才输出:Empoloyee()。

    23af9b48b88d0dcebcc5e60142d3aa26.gif

    上面的代码中Manager继承了前面写的Employee类,当我们编译并运行Manager类,会产生以下的输出:

    Static Block Employee Company:china soft Sub Static Block Manager department:sale Non-Static Block Employee phone:0755-51595599 Employee(String) Empoloyee() Sub Non-Static Block Manager salary:8000 Manager(String) Manager() 下面我们对结果做分析: 1 在行34实例化对象时,由于Manager继承了Employee,所以先从父类Employee开始;先给父类静态变量分配内存空间并初始化,然后执行父类静态块。然后再给子类静态变量分配内存空间并初始化,然后执行子类静态块,所以会得到以下输出: Static Block Employee Company:china soft Sub Static Block Manager department:sale

    2然后在内存中为父类Employee分配内存空间,并做默认初始化;再为子类Manager分配内存空间,并做默认初始化。 3默认初始化完成后,从父类开始显示初始化并执行非静态方法块和构造函数,然后再子类开始显示初始化并执行非静态方法块和构造函数。因此会产生以下的输出: Employee phone:0755-51595599 Employee(String) Empoloyee() Sub Non-Static Block Manager salary:8000 Manager(String) Manager()

    展开全文
  •   另外,子类继承抽象类的时候,重写了所有抽象方法,并实例化一个子类对象的时候,会实例化父类,也就是抽象类吗?不可能呀,抽象类是不能实例化的。   所以创建子类实例的时候不会创建父类实例。 ...

      结论:不会。

      创建子类实例的时候确实会在内存空间中存储父类的实例属性,这些是从方法区获得的,但是这些属性都是属于子类实例的。

      另外,子类继承抽象类的时候,重写了所有抽象方法,并实例化一个子类对象的时候,会实例化父类,也就是抽象类吗?不可能呀,抽象类是不能实例化的。

      所以创建子类实例的时候不会创建父类实例。

    展开全文
  • 抽象类能实例化吗?这个问题我想了一个晚上,看了好几篇别人的博客,但结果都各不相同,每个人有每个人的理解,后来我想明白了:抽象类不能直接通过new去实例化一个对象,那它就是不能实例化,要获取抽象类的对象, ...

    抽象类能实例化吗?

    这个问题我想了一个晚上,看了好几篇别人的博客,但结果都各不相同,每个人有每个人的理解,后来我想明白了:

    抽象类不能直接通过new去实例化一个对象,那它就是不能实例化,要获取抽象类的对象, 需要先用一个类继承抽象类,  然后去实例化子类。也可以用匿名内部类,在抽象类中创建一个匿名的子类,继承抽象类,通过特殊的语法实例化子类的对象 。(后面会细说)

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

    首先看这个例子:

    package com.my.animal;//动物类

    public classAnimal {

    String name;//名字

    String color;//颜色

    publicAnimal(String name,String color){this.name =name;this.color =color;

    }public voidrun(){

    System.out.println(name+"四条腿跑的很快!!!");

    }

    }//狗类继承动物类

    classDog extends Animal{publicDog(String name,String color){

    super(name,color);

    }

    }//鱼类继承动物类

    classFish extends Animal{publicFish(String name, String color) {

    super(name, color);

    }

    }classTest{public static voidmain(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 classAnimal {

    String name;//名字

    String color;//颜色//构造方法

    publicAnimal(String name,String color){this.name =name;this.color =color;

    }

    //非抽象方法

    public void eat(){

    System.out.println(name+"吃东西!!!");

    }//抽象方法

    public abstract voidrun();

    }classDog extends Animal{publicDog(String name,String color){

    super(name,color);

    }

    @Overridepublic voidrun() {

    System.out.println(name+"四条腿跑得快!!");

    }

    }classFish extends Animal{publicFish(String name, String color) {

    super(name, color);

    }

    @Overridepublic voidrun() {

    System.out.println(name+"摇摇尾巴游啊游!!");

    }

    }classTest{public static voidmain(String[] args) {

    Dog dog= new Dog("哈巴狗","白色");

    dog.run();

    Fish fish= new Fish("锦鲤","红色");

    fish.run();

    }

    }

    运行结果:

    哈巴狗四条腿跑得快!!

    锦鲤摇摇尾巴游啊游!!

    这个问题解决了,那还有一个问题就是:抽象类能实例化对象吗?

    看这个例子就知道了:

    public abstract classAnimal {

    String name;

    String color;publicAnimal(String name,String color){this.name =name;this.color =color;

    }public abstract voidrun();

    }classTest{public static voidmain(String[] args) {

    Animal a= newAnimal();

    a.run();

    }

    }

    运行结果:

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

    抽象类注意的细节:

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

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

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

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

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

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

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

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

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

    看下面的例子:

    package Practice_Anything;public abstract classJava_Abstract2 {public voida(){

    System.out.println("我是抽象类中的一个非抽象方法");

    }public staticJava_Abstract2 newIntences(){return newJava_Abstract2(){

    };

    }

    }classTest2{public static voidmain(String[] args) {

    Java_Abstract2 java_abstract2=Java_Abstract2.newIntences();

    java_abstract2.a();

    }

    }

    运行结果:

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

    这个故事到这就结束了,但是学习还没有停止,比如接口也是一种抽象类型,是抽象方法的集合,由此,我们是不是该联想到学习接口了呢?哈哈,学海本无底,前行莫彷徨!

    此篇为本人原创,花了大概半天时间,找了不知多少相关资料整合而成,如若对你有用,记得推荐,如若哪有不当,感谢指正!

    本文已独家授权给脚本之家(jb51net)公众号独家发布

    展开全文
  • 抽象类能实例化吗

    2019-04-03 12:50:00
    抽象类能实例化吗? 这个问题我想了一个晚上,看了好几篇别人的博客,但结果都各不相同,每个人有每个人的理解,后来我想明白了: 抽象类不能直接通过new去实例化一个对象,那它就是不能实例化,要获取抽象类的...

     抽象类能实例化吗?

               这个问题我想了一个晚上,看了好几篇别人的博客,但结果都各不相同,每个人有每个人的理解,后来我想明白了:

             抽象类不能直接通过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(); } }

     

     

    运行结果:
    
    哈巴狗四条腿跑得快!!
    锦鲤摇摇尾巴游啊游!!
    

      

    这个问题解决了,那还有一个问题就是:抽象类能实例化对象吗?

    看这个例子就知道了:

         

    public abstract class Animal {
        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.抽象类是存在构造函数的,其构造函数是提供给子类创建对象的时候初始化父类的属性的。

                

              

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

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

               

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

    看下面的例子:

     

    package Practice_Anything;
    
    public abstract 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();
        }
    }

     

     

    运行结果:
    
    我是抽象类中的一个非抽象方法
    

      

     

    这个故事到这就结束了,但是学习还没有停止,比如接口也是一种抽象类型,是抽象方法的集合,由此,我们是不是该联想到学习接口了呢?哈哈,学海本无底,前行莫彷徨!

     

    此篇为本人原创,花了大概半天时间,找了不知多少相关资料整合而成,如若对你有用,记得推荐,如若哪有不当,感谢指正!

      本文已独家授权给脚本之家(jb51net)公众号独家发布

    展开全文
  • class Node(object): # self 当我们实例化一个对象的情况下,再去调用这个函数的时候,这个实例就是self def __init__(self, data, next = None): self.data = data self.next = next class Stack(object):...
  • 抽象类能实例化吗? 这个问题我想了一个晚上,看了好几篇别人的博客,但结果都各不相同,每个人有每个人的理解,后来我想明白了: 抽象类不能直接通过new去实例化一个对象,那它就是不能实例化,要获取抽象类的...
  • java 初始化与实例化的区别

    千次阅读 2018-10-19 10:20:47
     A a(指定一个类型为A的引用A)=new A()(实例化,初始化就是执行A的构造函数,见上,如无则调用默认的); } 那么A a;是实例化,a=new A();是初始化创建一个对象。对吗?  初始化是赋值,实例化是  只有 A a;...
  • 抽象类是否可以实例化讨论

    千次阅读 2018-04-14 14:59:11
     抽象类可以实例化吗?Answer:(1)、首先,抽象类是不可以实例化的,但只是不可以传统做法中的通过new来进行实例化,而是通过父类的应用来指向子类实例间接地实现父类的实例化,因为子类在实例化之前,一定会优先...
  • 一、 type()1、创建类的两种方式方式一我们创建了一个名为MyClass的类,并实例化了这个类,得到其对象myc上面代码打印的结果为:type()函数可以查看一个类型或变量的类型,MyClass是一个class,它的类型就是type,而...
  • 提个问题:如果当创建一个子类对象会先创建父类对象的话,那么如果父类是抽象类的话,那该抽象父类也会被实例化喽,这与抽象类不能实例化相互矛盾啊! ![图片说明]...
  • 上次使用中我也把连接对象 DatagramSocket 写成了静态的,在类的初始时使用,可是系统中有很多地方使用,难道我要不断的创建这个类的对象吗?可以这么做,当时有后果,后果就是内存溢出。UDP是没有状态的,...
  • 实例化实现了保存和加载文档数据的幕后工作mfc序列化,而MFC通过序列化实现了应用程序的文档读写功能.序列化的基本思想是: 一个类应该能够读写其自身成员变量的数据,并且可以通过读取操作来重新创建对象. 也就是说...
  • 对应在设计中,就是:这个类永远不会被实例化。所以,还得动一下手术,将其改为抽象类。好了,现在 的代码有点 OOP 的感觉了: 程序代码 public abstract class AudioMedia { public abstract void Play(); } ...
  • python一切皆对象,所有内容都是由对象展开的,对象是由类实例化而来。python中存储的所有数据都是对象。每个对象都有一个身份、一个类型和一个值。身份:eg:school=“beida” 会以 “beida”创建一个字符串对象,...
  • Java中,你真的了解你的对象吗?

    千次阅读 2020-06-16 00:35:37
    面向对象的编程语言 众所周知,Java是一门...对象实例化的过程 稍微有点Java基础的人都知道,我们创建一个对象通常有两种方式,一种就是常见的”new“一个对象,再一种就是通过反射来获取到你的对象。 在这里,我们看
  • 什么是原型模式 原型模式是一个创建型的模式。...对象克隆,说白了,就是将已实例化对象复制一个出来,有个别同学就要问了,字节new 出来或者用反射创建一个实例出来不就好了吗? 干嘛要克隆?..
  • 如何保证一个类只有一个实例化对象,这不就是单例吗,经常用的额 这两个不都是一样的吗,怪自己太年轻,不懂 变通啊。。。   回头一搜,这篇文章介绍的更详细一些,里面介绍了如何在堆上或者栈上 ...
  • 在经历了前面BeanDefinition定义和BeanPostProcessor的准备工作完成之后,终于到了千呼万唤始出来的bean实例初始了,也就是平时想用哪个类对应的实例直接从BeanFactory要的对象时怎么被创建出来的?由于这块逻辑...
  • 通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个好的方法就是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。--...
  • 前言在经历了前面BeanDefinition定义和BeanPostProcessor的准备工作完成之后,终于到了千呼万唤始出来的bean实例初始了,也就是平时想用哪个类对应的实例直接从BeanFactory要的对象时怎么被创建出来的?...
  • 调用被子类重写的方法:子类构造函数初始,会隐式调用父类的无参构造函数,当子类重写了父类的方法并在父类的初始中被调用的时候,因为方法由实际引用对象决定,也就是子类对象,会导致访问不到子类的变量的值。...
  • 就是不能让外部调用类的构造方法,所以很容易想到类的构造方法私有,这样开发人员就不能在类之外通过new的方法创建该类的对象了。 由于外部不能通过new关键字来创建单例类的对象了,所以单例类本身必须提供一个...
  • JavaScript面向对象

    2020-02-23 20:40:17
    js就是个面向对象语言,一切皆对象 一、什么是面向对象? 举个最简单点的例子来区分 面向过程和面向对象 有一天你想吃鱼香肉丝了,怎么办呢?...二、对象实例化方式 1.字面量创建 弊端:这样的写法如果多生成几个...
  • php面向对象第二篇

    2020-05-21 00:39:51
    构造函数什么时候产生:创建对象的过程中产生的哈 当new people();的过程中的调用构造函数然后才能算得上一个对象哈 何为构造,就是构想创造嘛是吧,创造一个对象出来是吧 同学们:我问你们一个问题: 就是一个对象...
  • 关于方法 方法的创建是为了使用。方法是存在类之下的。方法内不能再创建方法(这句话有待商榷) 修饰符和返回值类型 这里的知识以后再总结 方法的重载 定义: ...创建对象就是。①声明②开辟空间(实例
  • C#基础知识-类和对象

    2014-01-09 17:12:23
    类的定义:具有相同属性和功能的对象的抽象的集合。——脑门一闪,类其实也是个集合吗? 类的实例:实例化就是创建对象的过程,使用new关键字来创建。 来看以下代码,最简单的,你肯定懂:
  • // 创建一个书的对象,不是new实例化的,而是通过方法从图书馆借来的 Book book = Book.libraryBorrow(); } } 这里的 static public Book libraryBorrow()显然认为返回值类型是Book类型 ,我标题的理解对...
  • 1、关于Spring bean的创建,其本质上还是一个对象创建,那竟然是对象,大家一定会明白一点的就是,一个完整的对象是包含两方面的:当前对象实例化对象属性的实例化(即注入属性)。 在Spring中,对象实例化...
  • 抽象类特点: 1、方法只有声明没有实现时,该方法就是抽象方法,需要被abstract修饰。抽象方法必须定义在抽象类当中,该类也必须被abstract修饰;...虽然抽象类不可以被实例化,不能创建对象,但是抽象类中

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 211
精华内容 84
关键字:

创建对象就是实例化吗