精华内容
下载资源
问答
  • 静态成员解决同一个类的不同对象之间数据和函数共享问题的。 1.静态数据成员(static data member) (1)静态数据成员在每个类中只有一个拷贝,由所有该类的对象共同维护,从而实现同一个类的不同对象数据共享...

    一、类的静态成员

    静态成员是解决同一个类的不同对象之间数据和函数共享问题的。

    1.静态数据成员(static data member)

    (1)静态数据成员在每个类中只有一个拷贝,由所有该类的对象共同维护,从而实现同一个类的不同对象数据共享;一般数据成  员,是实例属性,每个对象拥有一个拷贝。

    (2)静态数据成员只能通过类名和静态函数成员对它进行访问,类名访问方法“类名::标示符”;静态成员函数访问方法同一般的函数访问方法。

    2.静态函数成员(static function member)

    (1)静态函数成员同静态数据成员一样在每个类中只有一个拷贝,由所有该类的对象共同维护,从而实现同一个类的不同对象数据  共享。
    (2)公共的静态函数成员,可以通过类名或者对象来调用;普通函数成员只能通过对象调用,不用通过类名调用。
    (3)静态函数成员可以直接访问该类的静态数据和函数成员。而访问非静态数据成员必须通过参数传递方式得到对象名,然后通过  对象名来访问。
    (4)静态函数成员主要作用是访问类的静态数据成员。其好处是不依赖任何对象可以直接访问静态数据。

    二、类的友元

    友元关系提供了不同类或对象的成员函数之间、类的成员函数与一般函数之间的数据共享机制。
    友元函数:友元函数是在类中用关键字friend修饰的非成员函数,作用是在它的函数体中可以通过对象名访问类的私有和保护成员。
    友元类:若A类位B类的友元类,则A类的所有的成员函数都是B类的友元函数,都可以访问B类的私有成员和保护成员。方法通过在B类中用 friend class A来声明。
    友元注意问题:友元关系不能传递;友元关系是单向的;友元关系是不被继承的。

    三、const

    1.常引用

    常引用引用的对象不能被更新。

    2.常对象

    类名 const 对象名;
    常对象必须进行初始化,而且不能被更新。如何保证常对象的值不被改变:常对象不能对在类外对其数据成员赋值;常对象不能调用普通的成员函数(常对象只能调用类中的常成员函数)。

    3.类中的常成员函数

    声明格式:类型说明符  函数名(参数)const
    (1)const是函数类型的一部分,因此在函数的定义部分也要带const关键字。
    (2)常成员函数不能更新对象的数据成员,也不能调用该类中没有用const修饰的成员函数。
    (3)如果将一个对象说明为常对象,则通过该对象只能调用它的常成员函数,而不能调用其它成员函数。
    (4)const关键字可以用于对重载函数的区分,例如,如果在类中这样声明:
     void print();
     void print()const;
    这是对print的有效重载。

    4.类中的常数据成员

    使用const说明的数据成员为常数据成员。如果在一个类中说明了常数据成员,那么任何函数中都不能对该成员赋值。构造函数对该数据成员进行初始化,就只能通过初始化列表。

    展开全文
  • JS对象是一种复合类型,它允许你通过变量名存储和访问,换一种思路,对象是一个无序属性集合,集合中每一项都由名称和值组成(听起来是不是很像我们听说HASH表、字典、健/值对?),而其中值类型可能是...
  • 实例化一个对象(加载)执行顺序详解这篇博客将以加载执行顺序为探索起点,串讲涉及到Java相关知识,主要这个流程中JVN内部运行机制解析。结论Created with Raphaël 2.1.0开始父类静态代码子类静态代码...

    这篇博客将以类加载执行顺序为探索的起点,串讲涉及到的Java相关知识,主要是这个流程中JVN内部运行机制的解析。

    结论

    Created with Raphaël 2.1.0开始父类静态代码子类静态代码父类非静态代码父类构造函数子类非静态代码子类构造函数结束

    注解:
    默认该类及其父类JVM未曾加载过
    先父后子,先静后常再构造
    同等级内代码逐条按顺序执行
    * 当静态代码和非静态代码中成员变量包含对象,也会先执行该对象类的静态代码和构造函数

    先修知识

    JVN 运行时数据区

    JVN内存可简单分为三个区:堆(heap)、栈(stack)和方法区(method):

    • 堆区
      存放对象本身(包括非static成员变量),所有线程共享

    • 栈区
      存放基础数据类型、对象的引用,每个线程独立空间,不可互相访问
      栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)

    • 方法区(静态区,包含常量池)
      存永远唯一元素(类-class、类变量-static变量、方法),所有线程共享

    实例化一个对象的执行顺序分析

    因为涉及到的情况可以很复杂,最复杂的情况可能是有多个父类,父类及子类中有多个成员变量对象,这种情况下调用栈会比较深,所以我们先重简单一个单独的类开始分析,而且只要明白了基础的过程,那么再复杂的情况也只是在这个基础上叠加调用。

    一个单独的类的情况

    Created with Raphaël 2.1.0开始该类是否已加载到方法区中执行非静态代码1——在堆中为对象分配空间(对象信息:类引用、类变量引用、方法引用、成员变量等)执行非静态代码2——运行构造函数结束执行静态代码——加载该类的静态信息(类、static代码、方法)——在方法区分配空间yesno

    有父类存在的情况

    有父才有子,所以当父类存在时(其实Object类是所有类的父类),只是在这两个阶段前(执行静态、执行非静态)前,先运行父类的相关代码
    默认该类及其父类JVM未曾加载过

    Created with Raphaël 2.1.0开始父类静态代码子类静态代码父类非静态代码父类构造函数子类非静态代码子类构造函数结束

    此处为什么要执行父类的构造方法呢?(此处存疑,待查证,欢迎指正)
    因为子类的构造方法默认调用super();
    创建子类实例的时,如果没有super调用父类带参数的构造方法,则默认会调用父类的无参构造方法,默认调用super().

    当类中包含属性类时

    因为同等级内代码逐条按顺序执行,所以当存在属性类时,例如:

    public class A {
        static {
            System.out.println("A static");
        }
        B b = new B();
        {
            System.out.println("A not static");
        }
        A(){
            System.out.println("A constructor");
        }
        public static void main(String[] args) {
            System.out.println("Hello World!");
            A m = new A();
        }
    }
    
    class B{
        static {
            System.out.println("B static");
        }
        {
            System.out.println("B not static");
        }
        B(){
            System.out.println("B constructor");
        }
    }

    结果输出如下:

    A static
    Hello World!
    B static
    B not static
    B constructor
    A not static
    A constructor

    在实例化A类时,在顺序执行到非静态代码中的“B b = new B()”时,将先执行加载完毕B的所有代码;
    如果我将代码改成“非静态代码块”在“实例化B代码”前,如下:

    ...
        {
            System.out.println("A not static");
        }
        B b = new B();
    ...

    将会得到如下输出

    A static
    Hello World!
    A not static//这一行也在前面了
    B static
    B not static
    B constructor
    A constructor

    得以验证:同等级内代码逐条按顺序执行,遇到属性类则加载完属性类后再执行下一步代码
    注意:当属性类不立刻进行实例化时,JVM只会将堆中的成员属性类指向一个null,而不进行加载该属性类的操作
    例:

    ...
        B b;
    ...

    代码如上时,将不会有任何与类B相关的输出

    关联知识

    类变量-static变量、类方法-static方法

    这两者的特性:
    - 全局唯一,一改都改,节省资源
    - 可直接通过类名调用
    - 仅能访问static数据、static方法
    - 不能引用this和super
    下面我们通过实例化对象执行步骤来推导出以上四条特性:

    Created with Raphaël 2.1.0开始该类是否已加载到方法区中执行非静态代码1——在堆中为对象分配空间(对象信息:类引用、类变量引用、方法引用、成员变量等)执行静态代码——加载该类的静态信息(类、static代码、方法)——在方法区分配空间yesno

    由流程图可知,
    1. static代码只在类初始化时加载一次,加载后存在方法区,而每一个对象在实例化时,只是在堆中保存指向方法区的引用,所以全局唯一,一改都改,节省资源
    2. 因为static代码在对象被实例化之前和类初始化一起执行,所以除了可以通过对象应用外,也可以直接通过类名引用
    3. 因为先执行静态代码,再执行非静态代码,所以static代码仅能访问static数据、static方法
    4. this、super属于非静态代码(??),所以不能引用this和super

    展开全文
  • 用const修饰类的对象,那么该对象不允许修改其属性值,同时也只能调用该对象的常函数,该对象又称常对象。 C++中写单例模式需要将默认构造函数、默认拷贝构造函数设置为私有,并设置私有的静态指针 然后再设置...

    用const修饰类的成员函数,那么该成员函数就不能修改类中的属性值,该函数又称常函数。原因是类的成员函数有隐式的this指针,this指针本质是指针常量,加了const变为常量指针常量,不允许修改指针所指向的内容。

    用const修饰类的对象,那么该对象不允许修改其属性值,同时也只能调用该对象的常函数,该对象又称常对象。

     

    C++中写单例模式需要将默认构造函数、默认拷贝构造函数设置为私有,并设置私有的静态指针

    然后再设置共有的静态方法,用来获取其中私有的静态指针,然后再在类的外部实例化出静态指针。

     

    友元中可以将整个类作为一个友元类,将一个全局函数作为友元函数,将类的成员函数作为友元函数

    在一个类中声明友元如下:friend class 类名    friend void 全局函数名    friend 返回值 类名::函数名(参数)

    一个类中的声明的友元,可以访问该类所有的私有成员

     

    引用和this指针的本质都是int* const p,指针常量,就是指向某个内存单位而不能指向别处。

    展开全文
  • 面向对象编程(OOP)Java支持并发,基于类的以及面向对象的一种计算机编程语言. 以下列举了面向对象编程的优势:模块化编程,使维护和修改更加容易代码重用提高代码的可靠性以及灵活性提高代码可读性面向对象编程...

    在本文中,我们将讨论在Java面试中,用人单位用来测试应聘者Java以及面向对象的能力的面试题目.以下章节我们将按照以下结构讨论面试问题,面向对象编程及其特性,Java及其特性的一般问题集合。

    面向对象编程(OOP)

    Java是支持并发,基于类的以及面向对象的一种计算机编程语言. 以下列举了面向对象编程的优势:

    • 模块化编程,使维护和修改更加容易
    • 代码重用
    • 提高代码的可靠性以及灵活性
    • 提高代码可读性

    面向对象编程有其非常明显的特性,比如说封装,继承,多态和抽象. 下面我们来分析一下每种特性.

    24a6355a789dbfc4b49bc1b09225da10.png

    封装(Encapsulation)

    封装,提供的对象隐藏内部特性和行为的一种能力,每个对象提供了一些方法,其他的对象可以访问并改变其内部数据。在Java中,提供了三种访问修饰符: 公有的,私有的以及保护的。每个修饰符都设定了不同的访问权限,这个权限设置不会因为包的不同而有差异。

    下面是使用封装的一些优点:

    • 通过隐藏属性来保护对象的内部信息
    • 因为可以独立的修改或者扩展对象的行为,从而提高代码的可用性以及维护性
    • 隔离,通过阻止对象使用不希望的互动方式来交互,以此来提高模块化程度。

    多态(Polymorphism)

    多态就是针对不同的基础数据类型呈现相同接口的一种能力,多态类型就是其操作可以适用于不同类型值的一种类型。

    继承(Inheritance)

    继承提供了一个对象从基类获取字段和方法的一种能力.继承提供了代码的重用性,并且在不更改现有类的情况下,对现有类增加额外的功能。

    抽象(Abstraction)

    抽象是从具体的实例中分离想法的过程,根据他们各自的功能而非具体的实现来开发类. Java中支持创建和存在暴露接口的抽象类, 而没有包括方法的具体实现。抽象方法的宗旨就是将类的行为和具体实现分离开。

    抽象和封装的异同

    抽象和封装是个互补的概念。一方面,抽象专注在对象的行为上,而另外一方面,封装专注于对象的行为的具体实现。封装是通过隐藏对象的内部信息来实现的,因此也可以被看做是抽象的一种策略。

    8b1170caf73262aba6af183497d0ed53.png

    有关Java的一般问题

    1. 什么是JVM? 为什么称Java为跨平台的编程语言?

    Java虚拟机(Java Virtual Machine)是可以执行Java字节码的虚拟机,每个Java源文件将被编译成字节码文件,然后在JVM中执行。Java之所以被设计成可以在任意的平台运行,而不需要重写或者在不同的平台下重新编译,这些都要归功于Java虚拟机(JVM),因为JVM非常了解特定的指令的长度以及底层硬件平台的特殊性。

    2. JDK和JRE之间的差异是什么?

    Java运行环境(Java Runtime Enviroment) 是运行Java程序的基本的Java虚拟机,包括执行applet的浏览器插件。JDK (Java Development Kit) 是为了开发,编译和执行Java应用程序,针对Java的全功能的软件开发包,包含了JRE,编译器和工具(比如说 JavaDoc 和Java Debugger)。

    3. “static” 关键字是什么意思?在Java里可以 override private 或 static 的方法吗? keyword mean ? Can you override private or static method in Java ?

    static 关键字表示,访问这个成员变量或方法时,不必获取它属于的类的实例。

    不能被 override,因为 override 的机制是运行时(runtime)的动态绑定,而 static 方法是在编译时静态绑定的。static 方法并不与任何类的具体实例有关,因此无法应用继承的概念。

    4. 在静态方法里可以访问非静态变量吗?

    Java 中的 static 变量归相应的类所有,它的值对于类的所有实例都是相同的。static 变量是在 JVM 加载类的时候初始化的。如果代码试图访问非静态的变量,而且不是通过类的实例去访问,编译器会报错,因为这些非静态变量还没有被创建呢,并且它们没有与实例相关联。

    1134cd197cbba0bf9492ee0a8adc47bc.png

    5. Java 支持哪些数据类型?什么是 Autoboxing 和 Unboxing?

    Java语言支持的8个基本数据类型如下:

    • byte
    • short
    • int
    • long
    • float
    • double
    • boolean
    • char

    Autoboxing 是指在基本数据类型和对应的包装(wrapper)类之间Java 编译器所做的自动转换。例如,编译器将 int 转换为 Integer,将 double 转换为 Double ,等等。逆向的转换称为 unboxing。

    6. 在Java中什么是方法的 Override(覆盖) 和 Overload(重载)?

    Java中方法的 overload 发生的条件是,同一个类里,有两个或以上的方法名称完全相同,但参数列表不同。另一方面,方法的 override 是指,子类重定义了父类里的同一个方法。Override 的方法必须方法名、参数列表和返回类型都完全相同。Override 的方法不会限制原方法的访问权限。

    7. Java中构造函数、构造函数重载的概念和拷贝构造函数

    当类的对象被创建的时候,调用它的构造函数。每个类都有一个构造函数。如果程序员没有为类编写构造函数,Java编译器自动为类创建一个缺省的构造函数。
    构造函数重载和Java中函数重载类似,可以为同一个类创建不同的构造函数,每个构造函数必须拥有唯一的参数列表。
    Java与C++不同,它不支持拷贝构造函数,但是区别仅仅是,如果你没有编写类的拷贝构造函数,Java不会自动创建它。

    8.Java支持多继承吗?

    Java不支持多继承,每个类只允许继承一个类,但是可以实现多个接口。

    d608740997dae17dbd4634ecb29b3ffb.png

    9.接口和抽象类有什么不同?

    Java同时提供和支持抽象类和接口,它们的实现有一些共同的特点,也有如下不同:

    • 接口中所有的方法默认都是抽象的,而抽象类可以同时包含抽象和非抽象的方法。
    • 一个类可以实现多个接口,但它只能继承一个抽象类。
    • 一个类要实现某个接口,必须实现这个接口声明的所有方法。而一个类不需要实现抽象父类中声明的所有方法,不过,这时候这个类也必须声明为抽象类。
    • 抽象类可以实现接口,而且不需要实现接口中的方法。
    • 接口中声明的变量默认是final的,而抽象类可以包含非final的变量。
    • 接口中的成员默认是public的,而抽象类的成员可以是private,protected,或public的。
    • 接口是绝对抽象的,不可实例化,抽象类也不可以实例化,但可以在main方法中触发实例化(注:通过匿名类实现)。

    10.传引用和传值

    当对象通过传值调用时,传递的是这个对象的一个拷贝。因此,即使函数修改这个对象,也不会影响原对象的值。

    当对象通过传引用调用时,对象本身没有被传递,而传递的是对象的一个引用。因此,外部函数对这个对象的修改,也会反映到任何出现这个对象的地方。

    Java 线程

    11. 进程与线程的区别 ?

    进程是一个程序的执行(即正在运行的程序), 然而线程是在进程中独立的执行序列. 一个进程可以包含很多线程. 线程有时被称为轻量级的进程.

    e6aa6a6b82006054aded933862b19075.png

    12. 说下创建线程的不同方式. 你倾向于哪种方式并说明原因 ?

    有三种创建线程的方式:

    • 继承Thread类.
    • 实现Runnable接口.
    • 通过Executor框架创建线程池.

    首选方式是实现Runnable接口, 因为它不需要继承Thread类. 当你的程序设计需要多继承时, 使用接口会有所帮助. 另外, 线程池效率是很高的, 并且实施起来也很简单.

    13. 解释下可用的线程状态.

    在执行期间, 线程会处于以下状态中的一种:

    • Runnable: 线程已准备就绪, 但没有立即运行.
    • Running: 处理器正在执行的线程代码.
    • Waiting: 处于阻塞状态的线程, 等待外部某种处理的结束.
    • Sleeping: 被强制休眠的线程.
    • Blocked on I/O: 等待I/O操作的完成.
    • Blocked on Synchronization: 等待取得线程锁.
    • Dead: 线程已经执行结束.

    14. 同步方法与同步块的区别 ?

    在Java程序中, 每个对象都拥有一个锁. 线程可以通过使用synchronized关键字来获取一个对象上的锁. synchronized关键字可以用于方法级别(粗粒度锁)或代码块级别(细粒度锁).

    今天的分享就到这里了,我是一个java程序员-小素,专注于java的研究与学习,分享自己的感悟和经验。大家如果觉得这篇文章有用的话欢迎点赞转发,想了解更多内容可以关注哦!!

    展开全文
  • 这篇博客将以加载执行顺序为探索起点,串讲涉及到Java相关知识,主要这个流程中JVN内部运行机制解析。结论Created with Raphaël 2.1.0开始父类静态代码子类静态代码父类非静态代码父类构造函数子类非静态...
  •  this指针存在于类的成员函数中,指向被调用函数所在的类实例的地址。 1、常对象  数据成员值在对象的整个生存期内不能改变。在定义时必须初始化,而且不能被更新。  常对象,只能调用常成员函数,保证常对象...
  • -----------------siwuxie095...常对象成员 和 常成员函数 看如下实例: 定义一个坐标:Coordinate 要想正确初始化,必须通过初始化列表来初始化,因为两个数据成员 都由 cons...
  • 对象是类的具体(实例),对象不仅拥有类的属性和方法(private除外),还有自己专属的属性与方法。 比如:人一个类, 那么对象就可以有男人,女人,学生,老板等等。 这里类女朋友 package javaBasis1; //...
  • 每个函数都默认带了一个this指针的,该指针指向该类的实例。当使用const来修饰时,其实const Coordinate* this。这表明*this的内容不能更改的。 (3)成员函数和普通成员函数重载的
  • Hello!大家好,本文楼楼总结自己2018年春招和...组件实例React组件类的实例对象,它通常被用来管理内部状态、处理生命周期函数。大多数情况下,我们无需直接创建组件实例,React会负责创建它,ReactDOM.rende...
  • 刚开始学习C++的类对象的部分,对的常数据成员和静态数据成员概念和用法经常混淆,所以今天整理一下,顺便说一下,今天生日,祝我生日快乐,呵呵。 数据成员数据成员指在中定义不能修改其值...
  • 大厂面试都爱问的—对象实例化、内存布局 ...1️⃣一个类没有对外声明构造器,但是我们可以通过类对外声明的静态方法来获取一个这个类的实例. 2️⃣ 通过xxxFactory 工厂类来获取对应的类的实例. ②
  • 首先,简述一下匿名内部类的概念一个继承了类的子类的匿名对象,或者一个实现了接口的实现类的匿名对象。开发中,最用到的内部类就是匿名内部类了。以接口举例,当你使用一个接口时,得做如下几步操作。1、定义...
  • 最好在外初始化, 因为在内初始化, 如果没有用类实例化过对象, 就直接用类名使用静态成员变量, 会出现错误 私有静态属性在外可以初始化, 但不能访问 static 静态成员函数 不可以访问普通成员变量, 因为静态...
  • 一、面向对象介绍#PHP自学笔记#计算机编程中最被提到就是对象。掌握对象,有助于使用PHP编程语言快速实现复杂项目。早期计算机编程语言都面向过程,程序即有数据和算法构成,数据可以构成复杂...
  • 关于python类说法错误的( )答:类的实例方法必须创建对象前才可以调用声表面波滤波器稳定性差,需要调整。( )答:√扁平骨盆指( )答:骨盆入口前后径小于正常下列哪些因素可影响胚泡植入( )答:置入避孕环 子宫...
  • Java 继承继承java面向对象编程技术的一块...在Java中,类的继承单一继承,也就是说,一个子类只能拥有一个父类继承中最使用的两个关键字extends和implements。这两个关键字的使用决定了一个对象和另一个对...
  • 数据成员 数据成员指在中定义不能修改其值一些数据成员,类似于我们以前学过的常变量,虽然变量,也有自己地址,但是...(2)数据成员是实例对象的一部分,可以用this指针访问。 #include us...
  • 对象

    2020-02-17 21:37:55
    1. 类和对象 程序员说万物皆对象,能够较好的理解对象的含义编程修炼中的基本功,初接触可能会较难理解,但是基本的概念一定要有...一个很简单例子,如果将狗看作一个类,那么哈士奇、吉娃娃都类的对象。...
  • 面试笔试考话题:抽象和接口的异同 这里列出了两者的区别 当设计的时候如果抽象和接口都可以,优先考虑接口,因为接口没有单继承局限 ...通过子类对象的向上转型实现抽象或者接口的实例对象 ...
  • 【导语】:在工作中,涉及到数据传递,在数据传递使用过程中,可能会发生数据被修改问题。为了防止数据被修改,就需要在传递一个副本,...浅copy其实列表一个一个槽位,每个槽位存储的是对象的内存地址#...
  • 5.抽象类和接口的区别什么? 抽象类的简介 ...3.抽象类不能实例化(创建对象),但是可以通过子类进行实例化,子类一般重写抽象类中的抽象方法 抽象类和接口的区别 1.接口的默认方法public,接口中在jdk
  • iOS的类方法和实例方法区别与使用

    千次阅读 2017-02-16 22:37:06
    作用:不用实例话就可以直接调用方法,用于一些common或者UtiKit等公共方法中。 调用:[类名 方法名】 限制: 不能使用自身属性 2.什么是实例方法? 在OC定义中以 - 开头方法。如: - (viod)方法名{ } ...
  • 作用:不用实例话就可以直接调用的方法,一般有返回值的,返回对应的实例(数组、字符串等),还有可能就是本身类的实例对象用于一些common或者UtiKit等公共方法类中。 调用:[类名 方法名】 限制: 不能使用...
  • 对象

    2015-09-23 21:24:00
    public class student//创建一个学生类 { //属性对现实世界中实体静态特征的抽象,它提供了对类或对象性质的访问。... //字段可以内置数值类型或其他类的实例。 //常量:在类范围声明的...
  • 对象,包装1

    2019-03-05 23:40:50
    引用类型值(对象引用类型一个实例。在ECMAScript中,引用类型一种数据结构,用于将数据和功能组织在一起,他也被称为。但这种称呼斌不妥当,尽管ECMAScript从技术上讲一门面向对象的语言,但他不...
  • 初识对象

    2017-04-24 19:39:07
    《一》 对象和类的解释:(1)类是一种将抽象转换为用户定义...(2)对象是类的一个实例,因此对象又叫实例。 《二》 其定义位于类声明中的函数都将自动成为内联函数,类声明将短小的成员函数作为内联函数,以提高效
  • 说的反射机制,在Java,ObjectC上支持的很完善,以Java为例:JAVA反射机制在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,251
精华内容 500
关键字:

常对象是常类的实例