精华内容
下载资源
问答
  • 面向对象:类与对象之间的关系
    千次阅读
    2019-01-23 00:52:02

    什么是类?
    类就是具备某些共同特征的实体的集合,它是一种抽象的数据类型,它是对所具有相同特征实体的抽象。在面向对象的程序设计语言中,类是对一类“事物”的属性与行为的抽象。

    什么是对象?
    对象就是一个真实世界中的实体,对象与实体是一一对应关系的,意思就是现实世界的每一个实体都是一个对象,所以对象是一个具体的概念。

    类是对象的一个集合,对象是类的实例。

    而对象的产生在Java中是使用new来实现的。

    做一个比方老师是对一个群体的称呼,老师这个群体就是一个类,而老师又可以具体到某一个人,比如张老师、王老师之类的等等,张老师就是一个对象。

    类和对象的区别
      1,类是一个抽象的概念,它不存在于现实中的时间/空间里,类只是为所有的对象定义了抽象的属性与行为。就好像“Person(人)”这个类,它虽然可以包含很多个体,但它本身不存在于现实世界上。
      2,对象是类的一个具体。它是一个实实在在存在的东西。
      3,类是一个静态的概念,类本身不携带任何数据。当没有为类创建任何对象时,类本身不存在于内存空间中。
      4,对象是一个动态的概念。每一个对象都存在着有别于其它对象的属于自己的独特的属性和行为。对象的属性可以随着它自己的行为而发生改变。
     

    更多相关内容
  • Core Foundation 框架Core Foundation 框架 (Core...如 Core Graphics、Core Text,并且我们可能需要将 CF 对象和OC 对象进行相互转化,ARC 下,编译器不会自动管理 CF 对象的内存,我们需要手动管理.创建一个...

    Core Foundation 框架

    Core Foundation 框架 (CoreFoundation.framework) 是一组 C 语言接口, 简称 CF.

    它们为 iOS 应用程序提供基本数据管理和服务功能.

    如 Core Graphics、Core Text,并且我们可能需要将 CF 对象和OC 对象进行相互转化,ARC 下,编译器不会自动管理 CF 对象的内存,我们需要手动管理.

    创建一个 CF 对象使用后, 需要使用 CFRelease 将其手动释放, 换句话说, Core Foundation 对象类型不在 ARC 管理范畴内.

    如何将 CF 和 OC 对象有效的结合起来, 在 ARC 环境下, 提供了 桥接 的技术, 即 ARC 下 OC 对象和 Core Foundation 对象之间的桥梁.

    ARC 桥接

    ARC 下 C 指针与 OC 指针(对象)之间转换, 一般会用到下面的方法.

    __bridge_retained )

    __bridge_transfer )

    __bridge )

    也就是所谓的 桥接, 它是 Object-C 在 ARC 环境下开发出来的一种用作转换 C 指针跟 OC (类)指针的一种转换技术, 所以是 ARC 下的称谓, 在 MRC 下没有 桥接.

    针对内存管理问题,ARC 可以管理 Objective-C 对象, 但不支持 Core Foundation 对象的管理,所以转换后要注意一个问题:谁来释放使用后的对象.

    结合 ARC 和 内存管理, 下面分别介绍一下.

    Core Foundation 对象必须使用 CFRetain 和 CFRelease 来进行内存管理.

    当使用 Objective-C 和 Core Foundation 对象相互转换的时候,必须让编译器知道,到底由谁来负责释放对象,是否交给 ARC 处理, 只有正确的处理,才能避免内存泄漏和 double free 导致程序崩溃.

    __bridge_retained )

    __bridge_retained 等同于 CFBridgingRetain() .

    将 Objective-C 对象转换为 Core Foundation 对象,把对象所有权桥接给 Core Foundation 对象,同时剥夺 ARC 的管理权,后续需要开发者使用 CFRelease 或者相关方法手动来释放 CF 对象.

    示例:

    void *cPointer;

    NSObject *objc = [[NSObject alloc] init];

    //将 OC 对象转换为 C 指针

    cPointer = (__bridge_retained void*)objc;

    //use cPointer ...

    //需要释放资源

    CFRelease(cPointer);

    在 ARC 下, CFBridgingRetain 实现如下:

    NS_INLINE CF_RETURNS_RETAINED CFTypeRef _Nullable CFBridgingRetain(id _Nullable X) {

    return (__bridge_retained CFTypeRef)X;

    }

    关于 CFTypeRef, 如下:

    typedef const CF_BRIDGED_TYPE(id) void * CFTypeRef;

    所以 CFBridgingRetain 返回值是 const void * 类型的.

    上面的示例可以改写为:

    const void *cPointer;

    const NSObject *objc = [[NSObject alloc] init];

    cPointer = CFBridgingRetain(objc);

    //use cPointer ...

    CFRelease(cPointer);

    __bridge_transfer )

    __bridge_transfer 等同于 CFBridgingRelease() .

    将非 OC 对象转换为 OC 对象,同时将对象的管理权交给 ARC,开发者无需手动管理内存.

    示例:

    CFUUIDRef uuid = CFUUIDCreate(kCFAllocatorDefault);

    CFStringRef strUUID = CFUUIDCreateString(kCFAllocatorDefault, uuid);

    NSString *str = (__bridge_transfer NSString *)strUUID;

    //无需释放 strUUID

    //CFRelease(strUUID);

    CFRelease(uuid);

    CFBridgingRelease 实现如下:

    NS_INLINE id _Nullable CFBridgingRelease(CFTypeRef CF_CONSUMED _Nullable X) {

    return (__bridge_transfer id)X;

    }

    上面的示例可以改写为:

    CFUUIDRef uuid = CFUUIDCreate(kCFAllocatorDefault);

    CFStringRef strUUID = CFUUIDCreateString(kCFAllocatorDefault, uuid);

    NSString *str = CFBridgingRelease(strUUID);

    //无需释放 strUUID

    //CFRelease(strUUID);

    CFRelease(uuid);

    __bridge

    __bridge 不改变对象所有权, 需要我们自己来管理内存, 它也是我们经常使用的方法, 从某种程度上来说, 它是上面两个方法的简化版本.

    __bridge 可以将 OC 对象 与 C 指针相互转换, 示例:

    //CFString -> OC 对象

    CFStringRef cfString = CFStringCreateWithCString(kCFAllocatorDefault, "very", kCFStringEncodingUTF8);

    NSString *nsString = (__bridge NSString *)cfString;

    NSLog(@"CFString -> NSString: %@", nsString);

    CFRelease(cfString);

    如果将 CFRelease(cfString) 注释掉, Xcode 的静态检测器会告诉你有内存泄露的情况, 如图:

    再来另外一个例子, 如下:

    //OC 对象 -> CFString

    NSString *nstr = @"itman";

    CFStringRef cfStringRef = (__bridge CFStringRef)nstr;

    NSLog(@"NSString -> CFString: %@", cfStringRef);

    CFRelease(cfStringRef);

    无论是使用 CFRelease(cfStringRef), 还是注释掉, 静态检测器都不会报错. 说明这种情况下, 当前的内存管理已经被 OC 对象管理.

    野指针

    运行下面的示例:

    void *p;

    {

    NSObject *objc = [[NSObject alloc] init];

    p = (__bridge void*)objc;

    }

    NSLog(@"mark: %@", (__bridge NSObject*)p);

    会直接 crash, 如图:

    当 objc 这个对象超出作用域范围,其内存就会被回收,接着在作用域范围外用 void *p 去访问 objc 的内存,就造成了野指针.

    结合上面所说的, 我们可以让指针 p 对 objc 进行引用即 retain 操作, 修改如下:

    void *p;

    {

    NSObject *objc = [[NSObject alloc] init];

    //p = (__bridge void*)objc;

    p = (__bridge_retained void*)objc;

    }

    NSLog(@"mark: %@", (__bridge NSObject*)p);

    // 一定要释放

    CFRelease(p);

    可以正常的运行. 还可以修改为另一种方式:

    void *p;

    {

    NSObject *objc = [[NSObject alloc] init];

    //p = (__bridge void*)objc;

    //p = (__bridge_retained void*)objc;

    p = (void *)CFBridgingRetain(objc);

    }

    NSLog(@"mark: %@", (__bridge NSObject*)p);

    // 一定要释放

    CFRelease(p);

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

    展开全文
  • 定义: 什么是通信 什么是对象?哪些对象的通信 通信的实现方式

    基础概念理解:

    什么叫对象间的通信?

    通俗来讲,就是a 对象 调用 b 对象的方法(接口)

    界定范围:哪些对象的通信?

    本地:在同一个jvm内,称为本地对象的方法、接口调用
    远程:在不同的jvm中,称为远程的方法、接口调用

    对象间通信的方式:

    同步:单向,阻塞式的调用
    回调:双向(分阻塞、非阻塞两种)
    异步:双向,且非阻塞。所以,由此可见,回调和异步通常是成对出现。回调是异步的基础,异步是回调的一种表现形式。

    对于回调进行定义:

    在计算机程序设计中,回调函数,或简称回调(Callback 即call then back 被主函数调用运算后会返回主函数),是指通过函数参数传递到其它代码的,某一块可执行代码的引用。这一设计允许了底层代码调用在高层定义的子程序。

    常见的一些对于回调的偏见或者错误认知

    以偏概全:
    例一:GUI编程中,一个按钮被点击之后要做点事情,大家可以注册个ActionListener上去监听点击事件,在点击时被调用,这就是一个回调。
    例二:例如说java.util.Collections.sort(List, Comparator),这个sort()方法就定义了一个流程实现排序,而具体的顺序则由传入的Comparator参数来确定——这就是回调。

    其实,上面两个例子,都没有错。但是,都发生了以偏概全的错误定义。

    望文生义:
    在这里插入图片描述
    混淆概念:
    当遇到一些IO或者延迟等需要耗用时间的操作,我们一般采用回调的方式来完成。就是你委托JVM或者操作系统做一些事情,他们做好了,就会回调你的方法让你去处理。

    小结:那么如何全面认知一个概念,或者说如何科学地给一个概念下定义呢?一般来说,我们定义一个概念,从内涵和外延两个方面进行说明。

    内涵(本质)

    就是一个可执行代码块的引用,或者说内存地址,或者说是指针,其实都是一回事儿。
    (备注:可执行代码块,它有很多别名,例如: 函数/方法/过程/事件对象/委托,这些概念其实都是一回事儿)

    外延(相关的概念,延伸的意义)

    在这里插入图片描述
    1、回调和相关设计模式(观察者、访问者、……)的关系:
    模式,是通过接口回调的方法实现的,即它是一种回调的体现。
    而回调,本身是一种原理,机制。而非具体的实现。

    2、与异步同步的关系:回调分为异步的回调、同步的回调。经常和异步成对出现。

    3、和事件驱动(event、listener)的关系:回调,是事件驱动编程的实现的基础原理。委托是c#中的概念,其实和匿名函数、java中的函数式接口、接口回调是同一个概念的不同表达形式。他们都是用来实现事件驱动编程(控制框架)的核心。

    4、和javaEE的web编程servlet中filter技术的关系:filter技术是回调机制的具体应用场景之一,filter核心技术:基于回调、责任链模式

    5、回调和闭包的关系。

    回调函数:
    这一般是在C语言中这么称呼,对于定义一个函数,但是并不由自己去调用,而是由被调用者间接调用,都可以叫回调函数。本质上,回调函数和一般的函数没有什么区别,也许只是因为我们定义了一个函数,却从来没有直接调用它,这一点很奇怪,所以有人发明了回调函数这个词来统称这种间接的调用关系。

    在包括C#在内的很多高级语言中,我们有其它更具体的名词来称呼它,比如事件处理函数,委托,匿名委托,匿名函数,Lambda表达式,所以很少直接称呼某个函数为回调函数,除非是编写和C打交道的程序。

    闭包:
    在一些语言中,在函数中可以(嵌套)定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包。闭包可以用来在一个函数与一组“私有”变量之间创建关联关系。在给定函数被多次调用的过程中,这些私有变量能够保持其持久。

    小结:
    回调虽然和闭包是在实现上和功能上类似,但是,闭包我们知道了,更倾向于拓宽变量的作用域或类似接口封装

    我们可以在回调函数中做任何我们可以做的事情,这当然也就包括访问我们自己的变量(从而达到和闭包一样的效果)

    分类

    • 同步和异步(阻塞、非阻塞):

    阻塞式回调里,回调函数的调用一定发生在起始函数返回之前;

    而延迟式回调里,回调函数的调用有可能是在起始函数返回之后

    • 推模式、拉模式(被动推、主动拉):

    推模式的是指,被调用方主动将其地址推送给调用者。
    示例代码:

    //接口:
    
    public interface GasListener
    {
        public void offerGas(String msg);
    }
    //接口实现的甲方:
    public class GasCompany implements GasListener
    {    
        public void advertiseTo(IndoorsMan man)
        {
            System.out.println("煤气公司:这是我们的联系方式,欢迎来电!");
            man.setListener(this);
        }
        @Override
        public void offerGas(String msg)
        {
            System.out.println("煤气公司接收的订单:"+msg);
        }
    }
    //调用者: 
    public class IndoorsMan 
    {
        GasListener gListener;
        public void prepareCook()
        {
            System.out.println("宅男:准备下厨做几个花式大菜!");
            System.out.println("宅男:进厨房,烧菜...");
            System.out.println("宅男:刚开火,就发现煤气不足,没办法,只能打电话叫煤气。");
            gListener.offerGas("宅男:送一瓶煤气过来!");
        }    
        public void setListener(GasListener gListener)
        {
            this.gListener = gListener;
        }
    }
    测试: 
    public class Test
    {
        public static void main(String[] args)
        {
            IndoorsMan man = new IndoorsMan();
            GasCompany company = new GasCompany();
            
            company.advertiseTo(man);
            man.prepareCook();
        }            
    }
    

    主动拉模式:调用者自己主动获取甲方的信息。
    示例代码:

    public class IndoorsMan 
    {
        GasListener gListener;
        public void prepareCook()
        {
            System.out.println("宅男:准备下厨做几个花式大菜!");
            System.out.println("宅男:进厨房,烧菜...");
            System.out.println("宅男:刚开火,就发现煤气不足,没办法,只能打电话叫煤气。");
            gListener.offerGas("宅男:送一瓶煤气过来!");
        }    
        public void setListener(GasListener gListener)
        {
            this.gListener = gListener;
        }
        public void configureGas()
        {
            // 主动获取甲方信息
            setListener(new GasListener()
            {            
                @Override
                public void offerGas(String msg)
                {
                    System.out.println("下单内容:"+msg);
                }
            });
        }    
    }
    //测试
    public class Test
    {
        public static void main(String[] args)
        {
            IndoorsMan man = new IndoorsMan();
            man.configureGas();
            man.prepareCook();
        }            
    }
    

    扩展认知

    异曲同工之妙的技术:代理、反射。(aop、interceptor)
    利用代理和反射,也能实现另类的回调。因此我们可以说,在代理和反射中,也应用到了回调机制。
    

    回调原理和机制:

    在这里插入图片描述

    为什么需要它?(应用场景)

    • 1、灵活、扩展、解耦:

      为了使我们写的函数接近完美,就把一部分功能外包给别人,让别人个性化定制,至于别人怎么实现不管,我唯一要做的就是定义好相关接口,把调用者与被调用者分开,所以调用者不关心谁是被调用者(解耦)。这一设计允许了底层代码调用高层定义的子程序(IoC控制反转),增强程序灵活性,和反射有着异曲同工之妙。也满足和实现**好莱坞原则(don’t call me,i will call you !)

    • 2、回调可用于通知机制
      事件驱动的GUI程序,交互式的界面开发、组件开发等。
      例如:GUI编程中,一个按钮被点击之后要做点事情,大家可以注册个ActionListener上去监听点击事件,在点击时被调用,这就是一个异步回调。

    • 3、Windows平台的消息机制

    • 4、异步的接口调用(Ajax技术、远程调用等)

    • 5、Servlet中的Filter(过滤器)是基于回调函数,需容器支持。

    • 6、深入学习和理解框架的必备基础。
      各种框架中广泛应用回调接口来支持扩展、解耦、自动化控制处理等操作,例如:Springmvc、Spring、structs、JSF等

    如何实现回调?

    其他语言或者平台

    C、C++和Pascal:
    允许将函数指针作为参数传递给其它函数。其它语言,例如JavaScript,Python,Perl[1][2]和PHP,允许简单的将函数名作为参数传递。

    Objective-C
    中允许利用@selector关键字传递SEL类型的函数名。在实现中,SEL类型被定义为函数名字符串。

    在类似于C#与VB.NET的运用.NET Framework的语言中
    ,提供了一种型别安全的引用封装,所谓的’委托’,用来定义包含类型的函数指针,可以用于实现回调。

    .NET语言
    中用到的事件与事件处理函数提供了用于回调的通用语法。

    函数式编程语言
    通常支持第一级函数,可以作为回调传递给其它函数,也可以作为数据类型存储或是返回给其它函数。

    某些语言,比如Algol 68,Perl,新版本的.NET语言以及多数函数式编程语言中
    允许使用匿名的代码块(lambda表达式),用以代替在别处定义的独立的回调函数。

    在Apple或是LLVM的C语言扩展中,包含称为块的语言特性,可以作为函数的参数传递,作为回调的一种实现。

    缺少函数类型的参数的面向对象的程序语言中(备注:java8 以后支持了函数式编程,引入了lambda表达式、函数式接口),例如Java,回调可以用传递抽象类或接口来模拟。回调的接收者会调用抽象类或接口的方法,这些方法由调用者提供实现。这样的对象通常是一些回调函数的集合,同时可能包含它所需要的数据。这种方法在实现某些设计模式时比较有用,例如访问者模式,观察者模式与策略模式。

    C++
    允许对象提供其自己的函数调用操作的实现,即重载operator()。标准模板库和函数指针一样接受这类对象(称为函数对象)作为各种算法的参数。

    Java 中的回调

    Java是一门面向对象语言,一切皆对象,因此在Java中不存在回调函数这一说法的。由于Java的一切皆对象性质,从而将回调函数这个特性提升到了接口回调。

    接口回调:可以把使用某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口的方法。实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法,这一过程称为对象功能的接口回调。

    从概念可以看出,接口回调是指一个使用过程,并强调是关于对象功能的使用过程,既然是功能,功能一般就对应着方法体(函数),因此它同样满足与回调函数相似的模型。

    接口回调的机制与回调函数的机制类似:
    (1)定义一个接口;

    (2)提供接口实现的一方在初始化的时候,将接口回调的引用注册给调用者;

    (3)当特定的事件或条件发生的时候,调用者使用引用调用实现的接口方法对事件进行处理。

    java 中回调的实现方式源码参考:

    https://github.com/pzemtsov/article-java-callback/blob/master/FLambda.java

    附:

    参考文章

    https://www.cnblogs.com/duanxz/p/3508272.html
    https://zh.wikipedia.org/wiki/回调函数
    https://github.com/Gentle-Lee/Gentle-Lee.github.io/issues/3
    https://www.cnblogs.com/brucheium/p/3825060.html
    https://www.bysocket.com/?p=636

    展开全文
  • java中类和对象的概念

    千次阅读 2021-02-26 09:37:31
    1首先说说类和对象是怎么那回事。(这部分对于java来说是一个非常重要的知识)今天心情很好,来学习一下java中的类和对象!Java是什么?Java是一门面向对象的编程语言(OOP),想要理解Java,首先要理解类(Class)和对象...

    1首先说说类和对象是怎么那回事。(这部分对于java来说是一个非常重要的知识)

    今天心情很好,来学习一下java中的类和对象!

    Java是什么?Java是一门面向对象的编程语言(OOP),想要理解Java,首先要理解类(Class)和对象(Object)这两个概念。

    Java中的类可以看成C语言的结构体的升级版。结构体是一种构造数据类型,可以包含不同的成员(变量),每个成员的数据类型可以不一样,可以通过结构体来定义结构体变量,每个结构体拥有相同的性质,举个栗子:

    #include

    int main(){

    // 定义结构体 Student

    struct Student{

    // 结构体包含的变量

    char *name;

    int age;

    float score;

    };

    // 通过结构体来定义变量

    struct Student stu1;

    // 操作结构体的成员

    stu1.name = "小艾";

    stu1.age = 19;

    stu1.score = 99;

    printf("%s的年龄是 %d,成绩是 %f\n", stu1.name, stu1.age, stu1.score);

    return 0;

    }

    运行结果:  小艾的年龄是19,成绩是99

    Java中的类也是一种构造数据类型,但是对C语言中的结构体有所升级,进行了一些扩展,类的成员不但可以是变量,还可以是函数(方法),通过类定义出来的变量也有特定的称,叫做“对象”,例如:

    public class Hello {

    public static void main(String[] args){

    // 定义类Student

    class xuesheng{ // 通过class关键字类定义类

    // 类包含的变量

    String name;

    int age;

    float score;

    // 类包含的函数

    void expect(){

    System.out.println( name + "的年龄是 " + age + ",成绩是 " + score );

    }

    }

    // 通过类来定义变量,即创建对象

    xuesheng stu1 = new xuesheng(); // 必须使用new关键字

    // 操作类的成员

    stu1.name = "小艾";

    stu1.age = 19;

    stu1.score = 99f;

    stu1.expect();

    }

    }

    运行结果:  小明的年龄是15,成绩是92.5

    2.再来对上述语句作解释

    xuesheng stu1 = new xuesheng();

    通常把这条语句的动作称之为创建一个对象,其实,它包含了四个动作。

    1)右边的“new xuesheng”,是以xuesheng类为模板,在堆空间里创建一个xuesheng类对象(也简称为xuesheng对象)。

    2)末尾的()意味着,在对象创建后,立即调用xuesheng类的构造函数,对刚生成的对象进行初始化。构造函数是肯定有的。如果你没写,Java会给你补上一个默认的构造函数。

    3)左边的“xuesheng stu 1”创建了一个xuesheng类引用变量。所谓xuesheng类引用,就是以后可以用来指向xuesheng对象的对象引用。

    4)“=”操作符使对象引用指向刚创建的那个Vehicle对象。

    我们可以把这条语句拆成两部分:

    xuesheng stu 1;

    stu11 = new stu1();

    效果是一样的。这样写,就比较清楚了,有两个实体:一是对象引用变量,一是对象本身。

    在堆空间里创建的实体,与在数据段以及栈空间里创建的实体不同。尽管它们也是确确实实存在的实体,但是,我们看不见,也摸不着。不仅如此,

    我们仔细研究一下第二句,找找刚创建的对象叫什么名字?有人说,它叫“xueshng”。不对,“xuesheng”是类(对象的创建模板)的名字。

    一个Vehicle类可以据此创建出无数个对象,这些对象不可能全叫“Vehicle”。

    对象连名都没有,没法直接访问它。我们只能通过对象引用来间接访问对象。

    为了形象地说明对象、引用及它们之间的关系,可以做一个或许不很妥当的比喻。对象好比是一只很大的气球,大到我们抓不住它。引用变量是一根绳, 可以用来系汽球。

    如果只执行了第一条语句,还没执行第二条,此时创建的引用变量stu1还没指向任何一个对象,它的值是null。引用变量可以指向某个对象,或者为null。

    它是一根绳,一根还没有系上任何一个汽球的绳。执行了第二句后,一只新汽球做出来了,并被系在stu1这根绳上。我们抓住这根绳,就等于抓住了那只汽球。

    再来一句:

    xuesheng stu2;

    就又做了一根绳,还没系上汽球。如果再加一句:

    stu2 = stu1;

    系上了。这里,发生了复制行为。但是,要说明的是,对象本身并没有被复制,被复制的只是对象引用。结果是,stu2也指向了stu1所指向的对象。两根绳系的是同一只汽球。

    如果用下句再创建一个对象:

    stu2 = new xuesheng();

    则引用变量stu2改指向第二个对象。

    从以上叙述再推演下去,我们可以获得以下结论:

    (1)一个对象引用可以指向0个或1个对象(一根绳子可以不系汽球,也可以系一个汽球);

    (2)一个对象可以有N个引用指向它(可以有N条绳子系住一个汽球)。

    如果再来下面语句:

    stu1 = stu2;

    按上面的推断,stu1也指向了第二个对象。这个没问题。问题是第一个对象呢?没有一条绳子系住它,它飞了。多数书里说,它被Java的垃圾回收机制回收了。

    这不确切。正确地说,它已成为垃圾回收机制的处理对象。至于什么时候真正被回收,那要看垃圾回收机制的心情了。

    由此看来,下面的语句应该不合法吧?至少是没用的吧?

    new xuesheng();

    不对。它是合法的,而且可用的。譬如,如果我们仅仅为了打印而生成一个对象,就不需要用引用变量来系住它。最常见的就是打印字符串:

    System.out.println(“I am Java!”);

    字符串对象“I am Java!”在打印后即被丢弃。有人把这种对象称之为临时对象。

    对象与引用的关系将持续到对象回收

    在C语言中,通过结构体名称就可以完成结构体变量的定义,并分配内存空间:C语言Struct Student stu1这样不但定义了结构体变量,并且也分配了内存空间。

    但是在Java中,仅仅通过类来定义变量不会分配内存空间的,必须使用new关键字来完成内存空间的分配:Student stu=new Student()。(实际上这条语句相当于Student stu;stu=new Student;这两句代码,第一句代码的意思是创建stu这样一个变量,第二条语句是给stu分配内存空间)。

    可以将类比喻成图纸,对象比喻成零件,图纸说明了零件的参数;一张图纸可以生产出具有相同性质的零件,不同图纸可以生产不同类型的零件。

    在Java中,使用new关键字就能创建一个对象,即将图纸生产成零,这个过程叫做类的实例化,因此也称为对象是类的一个实例。

    注意:类只是一张图纸,起到说明的作用,不占用内存空间;对象才是具体的零件,要有地方来放,才会占用内存空间。

    类所包含的变量和函数都有特定的称呼,变量被称为属性,函数被称为方法,属性和方法统称为类的成员。

    展开全文
  • 1. DTO : 数据传输对象 , 一种设计模式之间传输数据的软件应用程序 , 可以说是对业务层数据操作的对象. DTO封装 , VO展示 。 2. VO : 与DTO类似 , 用于页面展示用。. DTO和VO 实现层面是一样的 , 可以当做一个对象 ,...
  • 视频监控&对象存储

    2020-12-23 20:32:24
    官方网站的管理控制台里面,有“文件夹”的概念,我们有时也将“对象”直接称呼成“文件”。但这并不意味着桶里面真的有文件夹,也不意味着对象就是“文件”,这只是提供了一种用户习惯的文件系统的表述方式。通过...
  • 欢迎来到Altaba的博客 2017年12月22日 1、什么是json?  JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。... (1)“名称/值”对的集合 对象  (2)值的有序列表 数组  数据以名称/值
  • 第一章 类和对象假设要编程解决一个很大的问题,需要写几万行代码,如果按照以前的做法,将这些代码放一个Java文件中,可以想象这个文件会非常冗长,而且很难维护。因此,出现了面向对象的设计。面向对象程序设计,...
  • Java 面向对象之类、对象与实列、以及引用的简单解释...实例即对象,这是相对于类的称谓。例如,对象是类的实例,小明是人类的实例。 四、什么是引用 引用即称呼,我的笔记本,这五个字就是我的笔记本的引用。如下...
  • C++中类,对象,封装,继承(派生),多态

    千次阅读 多人点赞 2021-02-16 12:45:44
    更恰当的描述:类就是世间事物的抽象称呼,而对象就是这个事物相对应的实体,人类就是一个类,写博文的我,看博文的你就是人类这个类的实例化,这也是为什么人类里面有个类,动物类,植物类,都有一个类,单说一个...
  • Python 面向对象编程 常见的编程方式有三种: 面向过程:根据业务逻辑从上到下写垒代码,最常见的操作就是粘贴复制,将之前实现的代码块复制到现需功能处。 函数式:将某功能代码封装到函数中,日后无需重复编写,仅...
  • 类与对象

    2019-07-04 14:09:50
    类与对象 面对过程和面对对象 类与对象的关系分析 类的结构 方法结构详解 1.面对过程和面对对象 面对过程就是在分析出解决问题的时候,首先把问题分成若干个步骤,然后每个步骤都定义为一个函数,函数定义...
  • Lock对象简介 这里为什么说Lock对象哪?Lock其实是一个接口,在JDK1.5以后开始提供,其实现类常用的有ReentrantLock,这里所说的Lock对象即是只Lock接口的实现类,为了方便记忆或理解,都简称为Lock对象。 我们知道...
  • C++中类与对象的关系

    千次阅读 2017-03-26 17:02:42
    C++是一门面向对象的编程语言,理解C++,首先要理解类(Class)和对象(Object)这两个概念。 C++中的类(Class)可以看做C语言中结构体(Struct)的升级版。结构体是一种构造类型,可以包含若干成员变量,每个...
  • 一、面向过程编程与面向对象编程 1、什么是面向过程编程? 面向过程其实是最为实际的一种思考方式,就是算面向对象的方法也是含有面向过程的思想.可以说面向过程是一种基础的方法,它考虑的是实际的实现一般的面向...
  • 面向对象设计学习总结

    千次阅读 2019-03-17 20:43:45
    面向对象设计概述分析阶段活动图、用例图、领域模型活动图用例图领域模型寻找概念类添加关联设计阶段SSD(系统顺序图)软件类图设计类图实现阶段单元测试重构总结 概述 软件设计是软件工程中技术方向部分,软件工程...
  • Java类和对象

    多人点赞 2021-11-10 16:54:51
    JAVA是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。 面向过程注重的是过程,在整个过程中所涉及的行为,就是功能。 面向对象注重的是对象,也就是参与过程所涉及到的主体...
  • 以上,当book1和book2两个对象之间相互赋值的时候,那么当我们调用Book.c的时候,我们就会发现book1.c 与 book2.c是相等的 原因:我们直接对对象进行操作,因为book1与book2的对象的引用都是同一个对象,所以,有...
  • OSS —— 对象存储介绍

    千次阅读 2021-03-19 10:52:56
    存储空间是您用于存储对象(Object)的容器,所有的对象都必须隶属于某个存储空间。您可以设置和修改存储空间属性用来控制地域、访问权限、生命周期等,这些属性设置直接作用于该存储空间内所有对象,因此您可以通过...
  • 第一章 对象的概念

    千次阅读 2020-04-02 23:05:47
    第一章 对象的概念 “我们没有意识到惯用语言的结构有多大的力量。可以毫不夸张地说,它通过语义反应机制奴役我们。语言表现出来并在无意识中给我们留下深刻印象的结构会自动投射到我们周围的世界。” -- Alfred ...
  • 通常我们谈论的JavaScript对象有以下几种:1)JavaScript核心对象2)DOM对象3)BOM对象关于核心对象核心对象,MDN上的称呼是Global Objects(这是是MDN的分类),译成中文叫做“全局对象”?但是这样似乎歧义很大,我更...
  • 对象属性和类属性 class Person(object): type = '人类' # 这个属性定义在类里,函数之外我们称之为类属性 ...# p1和p2称呼他们为实例对象 # 只要创建一个实例对象,这个实例对象就有自己的属性 #
  • 第一章 对象的概念 计算机革命起源机器。编程语言就像是那台机器。它不仅是我们思维放大的工具与另一种表达媒介,更像是我们思想的一部分。语言的灵感来自其他形式的表达,如写作,绘画,雕塑,动画和电影制作。编程...
  • 你请客的话我可以带着我的对象和你一起去。 程序员A:??? 程序员B:我可以帮你也new一个对象,这样我们就有四个人了。 博主目前为大一学生,上学期学了面向过程程序设计,也就是C语言,目前正在学习Java。 ...
  • JavaScript 常被描述为一种基于原型的语言 (prototype-based language)——每个对象对应拥有一个原型,对象以其原型为模板、从原型继承方法和属性。而同时原型也是对象,它也拥有原型,并从中继承方法...
  • 对象存储OSS介绍

    2018-11-21 11:40:40
    阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以通过调用 API,在任何应用、任何时间、任何地点上传和下载数据,也可以通过 Web 控制台对...
  • JS内置引用类型/内置对象

    千次阅读 2022-01-30 14:27:52
    它也常被称为类,但这种称呼并不妥当。尽管 ECMAScript 从技术上讲是一门面向对象的语言,但它不具备传统的面向对象语言所支持的类和接口等基本结构。 有一些内置的引用类型可以用来创建特定的对象,称之为内置对象...
  • 类和对象

    2021-04-10 18:40:15
    类和对象类和对象面向对象语言的特性类的实列化类的成员字段/属性/...JAVA是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。 面向过程注重的是过程,在整个过程中所涉及的行为,就
  • JAVA是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。 面向过程注重的是过程,在整个过程中所涉及的行为,就是功能。 面向对象注重的是对象,也就是参与过程所涉及到的主体。是...
  • 面向对象的复用技术

    2020-05-04 14:11:17
    想从面向对象复用技术中真正获益,你就必须理解不同种类的复用,并且自如地在不同场合下使用它们。 可复用资源 业务对象根源 复用性是面向对象技术带来的很棒的潜在好处之一。遗憾的是,很多情况下这个好处并不能...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,076
精华内容 8,030
关键字:

对象之间的称呼