首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

java从入门到精通四(面向对象上,类与对象的实现,代码块的执行顺序)

如果是在方法中声明,则存储在栈中,其它情况都是在堆中(比方说类的成员变量就在堆中); 2.除了基本数据类型之外的对象,JVM会在堆中创建对象,对象的引用存于虚拟机栈中的局部变量表中 3.并不是所有的对象都在堆中存储...而数组和对象本身在堆中分配,即使程序运行到使用 new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍然占据内存空间不放...2、静态变量可以非静态方法里使用普通方法是可以调用的,而静态方法调用也可以。 3、静态变量可以声明在类中作为成员变量。但是如果声明在方法中作为局部变量则该方法要是静态方法才可以。...两种方法给private赋值 1、 在原来的类里定义一个方法,直接调用这个方法给它赋值 缺点:只能实现对私有属性赋值,但是没有办法取值。 2、 在原类里重载一个还有private参数的方法。...通过set,get方法实现赋值和取值。 getXXX(String xx)à表示赋值外界的参数给类中私有属性赋值,通过该方法的参数赋值getXXX表示取值获取私有属性的值,而只是通过返回值传递的。

76420

【Android 内存优化】Java 内存模型 ( Java 虚拟机内存模型 | 线程私有区 | 共享数据区 | 内存回收算法 | 引用计数 | 可达性分析 )

Java 内存泄漏问题 , 这是 Java 程序最主要的内存问题 , 大量的内存泄漏会导致内存溢出 ; Java 虚拟机内存机制 : Java 虚拟机中内存分为两部分 , 线程私有部分 , 共享数据区...虚拟机栈中保存的数据 : 局部变量表 操作栈 方法返回地址 动态链接 额外附加信息 四、 本地方法栈 ( 线程私有区 ) ---- 本地方法栈 ( Native Method Stack ) : 这是...引用计数垃圾回收算法示例说明 : ① 创建对象 : 创建一个 O 类型对象 o , 此时引用计数为 0 , 如果不将其赋值给一个变量 , 那么很快就会被回收 ; ② 变量 A 赋值 : 创建一个...其 赋值 给变量 B , 此时该对象 B 引用计数为 1 ; ④ B 引用 A : 变量 B 中有 O 类型成员变量 , 将 A 赋值 给该成员变量 , 此时对象...B 引用计数变成 2 ; ⑤ A 引用 B : 变量 A 中有 O 类型成员变量 , 将 B 赋值 给该成员变量 , 此时对象 A 引用计数变成 2 ; 此时即使把

74820
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    JVM内存结构和Java内存模型别再傻傻分不清了

    垃圾回收结束后,用户线程才恢复运行 当对象寿命超过阈值时,会晋升至老年代,最大寿命是15(4位二进制) 当老年代空间不足,会先尝试触发Minor GC,如果之后空间仍不足,会触发Full GC(STW时间更长...保证核心.class文件不会被串改,即使篡改也不会加载,即使加载也不会是同一个对象,因为不同加载器加载同一个.class文件也不是同一个class对象,从而保证了class执行安全 自定义类加载器 需求场景...反射的常用场景 第三方应用开发过程中,会需要某个类的某个成员变量、方法或是属性是私有的或者只对系统应用开放,就可以通过Java的反射机制来获取所需的私有成员或者方法 反射相关的类 Class类: 代表类的实体...,在运行的Java应用程序中表示类和接口 获得类的方法 获得类中属性的方法 获得类中方法的方法 获取类中构造器的方法 Filed类 Filed代表类的成员变量(属性) Method类...,使用一个volatile修饰的变量之前,会立即从主内存中刷新数据。

    32430

    C++继承

    ,这个时候基类的公有成员在派生类里面就是私有的,这个私有的成员在派生类里面是可以进行访问的,但是在派生类的外面是不可以进行访问的; (3)我们的这个继承方式的组合尽管是多种多样的,但是这个经常使用的就是...,基类的私有成员在派生类里面是不可以直接访问的,但是如果我们想要这个成员在派生类里面被访问,但是在累的外面不可以访问,这个时候我们就可以把这个成员定义为受保护的成员; (5)我们在写这个派生类的时候,例如基类是...,我们再进行这个继承类的书写的时候,还是建议把这个继承的方式标注出来; 2.赋值兼容性规则 (1)什么是赋值兼容性规则,这个规则是指的父子之间的兼容性规则,我们也称之为切割或者是切片,后面你就会明白为什么会这样起名字...进行修饰,这个时候是生成了临时变量的; 第二组是使用的自定义类型的string类型的数据,这个当引用赋值的时候也是会生成一个临时变量的,我们依然需要使用const进行修饰,但是当两个class进行复制引用的时候...,但是这个地方依然会构成隐藏,我们需要加上域作用限定符; 但是即使这样,打印的结果里面会显示每一个对象都调用了两次构造函数,这个原因就是我们析构的时候,子类的构造函数结束之后,这个系统会自动调用父类的构造函数

    6610

    【C++】继承

    继承过后,基类的成员函数和变量都变为子类的一部分,在子类中可以访问到基类的成员函数或变量。...继承的格式就是在子类类名后面增加冒号和继承方式以及基类名,其中继承方式可分为公有保护私有三种,基类内部的访问限定符也可分为公有保护私有三种,所以组合后子类中对于基类成员访问方式的变化就有9种。...,因为Teacher和Student都有_name,所以如果从访问角度来讲,避免二义性就必须通过指定类域来解决,但即使二义性问题被解决之后,数据冗余的问题依旧无法得到处理,因为Assisant的名字不能有两个吧...虚拟菱形继承后,派生类B的对象成员模型也变为存储偏移量的方式来找虚基类成员,如果派生类B指针被对象d进行切片赋值后,则指针会重新指向对象d中派生类B成员的那一部分,在这部分当中肯定是没有虚基类成员的,所以想要找到虚基类成员则必须通过...所以如果发生了切片赋值这样的情况,想要在不存在虚基类对象的成员部分中找到虚基类,则必须通过虚基表指针来进行地址偏移量的查找。 6. 在菱形虚拟继承之后,存储的逻辑模型也变为下方所示。

    71010

    C++期末复习总结(2)

    ,但是如果我们想要在这个子类里面去访问这个私有的成员变量,可以在父类里面添加共有的函数访问这个私有的成员变量,这个时候我们就可以直接调用这个函数访问父类里面的私有的成员变量; 就像下面的展示那样,我们在子类里面本来是没有办法去访问父类的私有成员变量的...包括这个私有的成员变量,即使这个私有的成员变量在类的外面不能被访问;我们可以使用指针突破这个访问权限的限制,所以这个访问权限只是语法上面的一个解释罢了; 5.基类的构造 (1)我们可以使用初始化列表的方式指定要使用的基类的构造函数类型...,是使用基类初始化这个基类的成员变量,派生类初始化派生类的成员变量,你可能会问,这些基类的成员变量都被派生类给继承了,为什么不使用派生类初始化基类的成员变量,这个有两点原因; 第一就是我们的基类里面的私有的成员变量我们是无法在这个派生类里面看到的...(1)如果我们使用派生类的对象赋值给基类的对象(包括私有成员),但是这个时候会舍弃掉非基类成员: 下面这个代码里面,我们对于这个b1对象进行操作,最后把他赋值给a1这个对象,这个时候我们会发现a1这个对象里面的私有成员...m_b也会被更新的,也就是说即使是私有的成员变量,也是会被赋值的; class a { public: int m_a = 0; private: int m_b = 0; public: void

    5400

    聊聊对JVM内存结构的理解吧

    由于 Java 虚拟机栈是与线程对应的,数据不是线程共享的(也就是线程私有的),因此不用关心数据一致性问题,也不会存在同步锁的问题。...虚方法表:面向对象的编程中,会很频繁的使用动态分配,如果每次动态分配的过程都要重新在类的方法元数据中搜索合适的目标的话,就可能影响到执行效率,因此为了提高性能,JVM 采用在类的方法区建立一个虚方法表,...每个类都有一个虚方法表,表中存放着各个方法的实际入口。虚方法表会在类加载的链接阶段被创建,并开始初始化,类的变量初始值准备完成之后,JVM 会把该类的方法也初始化完毕。...这些代替的成员变量在栈帧或寄存器上分配空间。...,jvm 即使抛出 OOM,可以将引用赋值为 null,那么它所指向的对象就会被垃圾回收。

    32930

    C++primer学习笔记(五)

    简单说,类就是定义了一个新的类型和一个新的作用域。成员访问级别默认私有。在声明和定义处指定inline都是合法的。类的前向声明一般用来编写相互依赖的类。类定义以分号结束,之后可以跟对象列表。...mutable用来声明数据成员可以修改【突破各种const的限制】。 使用类外全局作用域的变量可以::var来获得。 类中的const成员必须在初始化列表中初始化,无法再构造函数体内赋值。...static成员函数没有this形参,可直接访问类的static成员,不能使用非static成员。 静态数据成员属于一个类,而不属于类的各个对象。静态成员函数在所有对象建立之前或删除之后仍然使用。...非引用形参将复制实参值,非引用return将复制return的东西。即使定义了其他构造函数,也会合成复制构造函数【能够复制类中的数组】。类成员有指针一般需要显示定义复制构造函数。...复制构造函数、赋值操作符、显示析构函数【虚空不算】一般同时出现。合成析构函数并不删除指针成员指向的对象。即使编写了自己的析构函数,合成析构函数仍然运行。

    37010

    JVM 内存结构

    由于 Java 虚拟机栈是与线程对应的,数据不是线程共享的(也就是线程私有的),因此不用关心数据一致性问题,也不会存在同步锁的问题。...虚方法表:面向对象的编程中,会很频繁的使用动态分配,如果每次动态分配的过程都要重新在类的方法元数据中搜索合适的目标的话,就可能影响到执行效率,因此为了提高性能,JVM 采用在类的方法区建立一个虚方法表,...每个类都有一个虚方法表,表中存放着各个方法的实际入口。虚方法表会在类加载的链接阶段被创建,并开始初始化,类的变量初始值准备完成之后,JVM 会把该类的方法也初始化完毕。...这些代替的成员变量在栈帧或寄存器上分配空间。...,jvm 即使抛出 OOM,可以将引用赋值为 null,那么它所指向的对象就会被垃圾回收。

    16830

    Java面向对象

    成员变量与局部变量的区别 1.作用域: 成员变量的作用域是整个类中都可以访问; 局部变量是的作用域是定义它的{}内, {}中的语句执行完它就被回收; 2.初始值: 局部变量使用前必须手动赋值, 系统不会赋默认值...;成员变量系统会赋默认初始值. 3.所在内存区域: 局部变量在方法运行的栈内存里,在栈里,会自动释放;包括调用对象中的方法的入参,在方法调用时会在栈内存中创建空间当方法调用完毕之后,就会被释放掉。...成员变量在对象里,对象在堆里,成员变量也在堆里,不使用的对象会被垃圾回收机制在不确定的时候回收....静态的使用 类的成员用 static 修饰后,就多了一种调用方式,原来对象名.成员可以继续调用,现 在,通过类名.成员,也可以调用. 类在什么时候加载?...final 修饰的变量只能在显示初始化或者构造方法初始化的时候赋值一次,以后不能更改。

    29930

    一文详解JVM内存结构

    由于 Java 虚拟机栈是与线程对应的,数据不是线程共享的(也就是线程私有的),因此不用关心数据一致性问题,也不会存在同步锁的问题。...虚方法表:面向对象的编程中,会很频繁的使用动态分配,如果每次动态分配的过程都要重新在类的方法元数据中搜索合适的目标的话,就可能影响到执行效率,因此为了提高性能,JVM 采用在类的方法区建立一个虚方法表,...每个类都有一个虚方法表,表中存放着各个方法的实际入口。 虚方法表会在类加载的链接阶段被创建,并开始初始化,类的变量初始值准备完成之后,JVM 会把该类的方法也初始化完毕。...这些代替的成员变量在栈帧或寄存器上分配空间。...有引用变量指向时永远不会被垃圾回收,jvm 即使抛出 OOM,可以将引用赋值为 null,那么它所指向的对象就会被垃圾回收。

    22020

    Java课程主要内容回顾

    类中的成员变量和方法定义 类怎么定义,成员变量或字段或属性的定义,赋初值,如果没有赋值初始值,能否直接使用?...在Java中,定义一个类包括以下几个部分: 类的定义 在类中定义的变量被称为成员变量、字段或属性。示例中的 myField 就是一个私有的整型成员变量。...如果没有显式赋值初始值,Java会为基本数据类型的成员变量赋予默认值,而不是null。...子类通过extends关键字表达对父类的继承。继承关系中,子类继承了父类的非私有成员变量和方法。 在Java中,子类和父类之间是一种继承关系。...对象成员变量初始化 除了在构造函数中,对象的成员变量还能在哪些地方进行初始化?语句块和构造方法的执行顺序是怎样的? 对象的成员变量可以在构造方法中初始化,同时也可以在实例化代码块中进行初始化。

    10710

    Java入门教程-面向对象

    定义类 编写类的成员变量 编写类的成员方法 public class 类名{ // 成员变量 变量1的数据类型 变量1; String name; // 未赋值默认null...当堆内存中,对象 或 数组产生的地址,通过任何方式都不能被找到后,就会被判定为内存中的“垃圾” 垃圾会被Java垃圾回收器,在空闲的时候自动进行清理 成员变量和局部变量 成员变量:类中方法外的变量...,也可以通过对象名调用(推荐使用类名调用) 注意 静态方法中,只能访问静态成员(成员变量、成员方法) 静态方法中,没有this关键字 6、继承 让 类与类之间产生关系(子父类关系),子类可以直接使用父类中非私有的成员...成员变量 访问顺序 在子类自身局部范围找 在子类自身成员范围找 在父类成员范围找 如果子父类中,出现了重名的成员变量,通过 就近原则 ,会优先使用子类的 如果一定要使用父类的,可以通过super关键字进行区分...final修饰成员变量,需要在创建的时候直接赋值或者在构造方法结束之前完成赋值 修饰类:表明该类是最终类,不能被继承 常量的命名规范 如果是一个单词,所有字母大写 如果是多个单词,所有字母大写,每个单词中间使用下划线

    24820

    100道最新Java面试题,常见面试题及答案汇总

    final成员变量表示常量,只能被赋值一次,赋值后值不再改变。final不能用于修饰构造方法。...答案:抽象类和接口之间的主要区别在于,抽象类可以拥有任意范围的成员数据,同时也可以拥有自己的非抽象方法,但是接口方式中,它仅能够有静态、不能修改的成员数据,同时它所有的方法都必须是抽象的。...Q42:如果类中没有定义构造函数,那么类的对象将会怎么创建? 答案:即使类没有定义显式构造函数,对象在创建时也会执行隐式构造函数,且该构造函数没有参数。...答案:类的私有成员在该类的范围之外是不可访问的,即使在同一个包中也不能访问任何其他类。 Q46:同一类中可以定义重名的方法吗?...Q78:Java中的垃圾回收机制能够确保程序永远不会超出内存? 答案:即使Java提供自动垃圾回收,也不能确保程序不会超出内存,因为与垃圾回收相比,Java对象的创建速度更快。

    5.2K21

    继承

    结论: 基类的私有成员,无论是哪一种形式的继承,继承之后在派生类中也不能访问。 基类任意一种访问限定符限定的成员,当为私有继承的时候,在派生类外面都不能进行访问。...在基类中,如果没有默认成员函数,我们必须在派生类中显示的写出。...如果基类中有默认成员函数,当派生类中不显示调用的时候,会自动调用。 对于构造函数,都会在初始化列表的时候自动调用基类的构造函数。...对于析构函数,在对象销毁的时候,会自动调用基类的析构函数,在调用自身的析构函数,所以,不需要自己在析构函数里面显示的调用基类的析构函数。...这样才能保证先析构派生类,再析构基类 构造函数 1.当基类有默认的构造函数的时候,可以只初始化派生类新的成员变量,也可以自己调用基类的默认构造,看自己的心情。

    25640

    Java基础深入解析——类与对象

    3.成员变量随着对象的创建而创建,随着对象的消失而消失(对象的消失是等对象变成垃圾之后由JVM去收回的)。 局部变量随着局部代码块的出现而出现,随着局部代码块的结束而消失。...; } publicint getAge(){ returnthis.age; }  2.封装成员变量的好处 对给成员变量赋值操作进行限定,在set方法中增加if语句,当输入非法数据时可以提示用户,从而提升了安全性...构造函数只能在对象初始化的时候给对象中的成员变量进行一次赋值,创建完对象之后就不能再赋值了;若今后需要修改对象中的成员变量,就需要用set方法。 9.能否在成员函数中调用构造函数? 不行!...static关键字 1.特点 a)  static用于修饰类中的成员变量和成员函数,修饰完之后是被类所产生的所有对象共享。 b)  静态成员存在于类中,类存在之后,静态成员也便存在。...成员变量存储在堆内存中(是属于对象的特有数据); 静态变量存储在方法区(==共享数据区)的静态区(是所有对象的共享数据) PS:纠正一个错误:堆内存只存对象(非静态成员变量),栈内存只存局部变量,而局部变量所属的函数不放在栈内存中

    89070

    【多线程-从零开始-柒】单例模式,饿汉和懒汉模式

    就会创建出这个单例的实例在 Singleton 类中,成员变量 instance 要用 static 修饰,这样 instance 就变成了“类成员”类成员初始化,就是在 Singleton 这个类被加载的时候...new 了一下单例模式最关键一步:将类的构造方法设为私有class Singleton { //static修饰,instance 成员变量就是“类成员” private static...比如,有一个编辑器,打开一个非常大的文本文档,有两种方式:一启动,就把所有的文本内容都读取到内存中,然后再显示到界面上饿汉启动之后,只加载一小部分数据(一个屏幕能显示的最大数据),随着用户进行翻页操作,...,就创建了两个实例第二次创建,覆盖了 instance 的值,使得第一次创建的实例没有引用指向,很快就会被垃圾回收机制给消除掉但即使如此,仍然认为上述代码是存在 bug 的- 因为实际上,构造方法内部可能会执行很多的逻辑...,就会非常的克制不仅仅会在读取变量的优化上克制,也会在修改变量的优化上克制加上 volatile 之后,也能禁止对 instance 赋值的操作插入到其他操作之间,上述 123 的操作不会再变成 132volatile

    11410

    PHP面向对象

    类似JAVA,C++,PHP也有面向对象,关于类,对象。继承,封装…的概念也类似,所以这里直接来说明PHP面向对象的使用方法。...若未显示声明。系统会默认生成     //PHP中仅能有一个构造函数(PHP中不能有重名函数)。...后进的先失去引用)     //方法体     }     private function __set(name,value){  //外部为私有成员属性赋值,自己主动调用,宜为private     ...还有:   final:修饰类。不能被继承。修饰方法,继承后不能被覆盖。否则报错。不能修饰属性。   static:静态成员。修饰成员变量,成员方法。唯一存在,共享.属于类,不属于对象。   ...为部分属性又一次赋值   //赋值   } 七.其它   __autoload($lei){  //当使用的类没被定义类时自己主动调用(不声明在类中,全局函数)   include(..

    2.8K10

    java学习八股之JVM-内存划分-垃圾回收器-回收算法-双亲委派-三色标记

    使用,被引用对象回收时,会被虚拟机放入引用队列 7.类加载过程 (1)加载:将字节码通过二进制的方式转化到方法区中的运行数据区 (2)连接: 验证:验证字节码文件的正确性 准备:正式为类变量在方法区中分配内存...,并设置初始值,final类型在编译期间赋值 解析:将常量池的符号引用(类的全限定名)解析为直接引用(类在实际内存中的地址) (3)初始化:执行类构造器,为静态变量赋初始值并初始化静态代码块 8.JVM...实例数据:存储真正的有效信息,包括父类继承下来的和自己定义的 对齐填充:JVM要求对象起始地址必须是8字节的整数倍,(8字节对齐) 13. jvm调优命名 jps:显示系统内所有的虚拟机进程 jstat...:是用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。...如果一个方法不会发生逃逸,那么可以在栈上分配内存,减少gc压力, 标量替换:基本数据类型不可分割称之为标量,可以分割的称之为聚合量,如果对象可分解,并且发生了逃逸,那么不会真正创建这个对象,会创建若干个成员变量来替换

    20630

    搞清楚,易如反掌。(暑假提升-继承专题)

    这里的不可见是指基类的私有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面 都不能去访问它。...实际上面的表格我们进行一下总结会发现,基类的私有成员在子类都是不可见。...形象的说明,在赋值的时候是派生类是将整个对象就行部分切割之后再赋值给基类,保证基类的正确性,没有多余的部分。 ==基类对象不能赋值给派生类。...==很显而易见的是基类的成员并没有多余派生类,如果赋值给派生类,一些部分显而易见的会产生问题,包括但不限于随机赋值,也指针的出现。...2、4、继承中的作用域 每一个成员都有自己的作用域,函数有函数的作用域,变量有变量的作用域,乃至main函数也有自己的作用域,所以继承中的作用域也很重要。

    7710
    领券