java类实例化内存过程与面向对象特征

在谈到类实例化的内存过程时先说说几个概念:

对象:内存上来说是分配在堆上面的一块内存区域
类:把一类具体事物相同特征,功能/行为抽象为属性与方法过程。
类是对象的模板,对象是类的具体表现。
构造函数:与类名同名的函数,用来实例化对象并初始化成员变量。
注意:构造器、构造函数不能称为构造方法。

类的结构:
静态块:当对应的class文件被首次加载到虚拟机时执行。
代码块
构造函数
静态属性与变量首先加载。其次时静态块,之后是代码块,最后是构造函数。

具体过程:
当一个类被创建(A a=new A();),并且这个类是首次被加载时,方法区会开辟出一块内存存放类的class文件并且将全部成员放入。之后会在堆中开辟一块内存,存储这个类并且将这个类的非静态的成员变量拷贝过来(静态成员不拷贝,所有实例共享),并持有对应的方法区的方法的句柄,这块内存有一个唯一内存地址,栈中的a对象指向的就是这个内存地址。
之后你为类的成员变量赋值时,堆中的变量的值会从默认值更改为设定值(方法区中变量无值)。
如果此时在实例化一个新的类(A a2=new A();),此时方法区中已经有一个A类的class,所以不会在创建一个A.class,但是此时会在堆中开辟一块新的空间并且将这个类的非静态成员拷贝并持有对应的方法区类的方法的句柄,这块内存空间标注一个新的内存地址。

此时,栈中a指向的是堆中第一个类的内存地址,a2指向的是堆中的第二个类的内存地址,而堆中这两块内存地址指向的是同一个方法区的class文件。
所以栈中对象要么存的是一个内存地址(引用)要么就是一个具体的值,存放的是一个具体值的话他就是一个基本变量。

注意:堆中的非静态成员变量存放的具体值,并不会指向方法区中非静态成员的地址,所以非静态成员的值与方法区无关,但是静态成员变量的话是存在于方法区的,堆中不能持有。 具体过程见下图:

面向对象的特征:
封装,集成,多态,抽象。
封装:隐藏对象功能实现的细节。
1:私有化类中的属性,外部的类不能访问本类的成员变量(需要自己设定访问修饰符)。
2:提供给外部类造作的getter与setter方法
3:提供给外部成员调用方法使用Public修饰。
继承:子类继承父类的成员变量。
1:继承后子类操作的是属于子类的变量,不影响父类的变量值。
2:supper指向的是父类的引用,this是本身的引用。
3:如果子类创建一个成员变量与父类成员变量同名时变量不会被覆盖。
4:子类实例化时会先实例化父类,因为实例化子类时构造器会有一个隐式的super();这是调用父类的构造器。
5:子类继承父类的所有属性与方法,同名属性不覆盖。同名方法会覆盖(重写),不过只能覆盖实例方法,静态方法与finall除外。
6:final不能被重写,类不能被继承。
7:静态方法又叫做类方法,该方法需要类的名称访问。该方法只属于这个类,不属于:某个类对象。
8:static修饰的方法中必须调用静态的方法和使用静态变量。

多态:就是一个事物的多种表现形态。
表现形式:重写(子类重写父类的方法)、重载(同一个类方法名相同参数不同,与返回值无关)。
重写与重载没什么关系,只是名字有点相似而已,有些面试会问到。
抽象:理论,思想,生活中不能具体描述出来。
具体表现形式:抽象类,接口。
抽象类:使用abstract关键字修饰的类,就是抽象类。
1:语法:public abstract class 抽象类名称。
2:抽象类不可以被实例化,但是有构造函数,因为还需要初始化。
3: 抽象类中可以定义抽象方法与普通方法。
4: 含有抽象方法得类一定是抽象类或者是接口。
5: 抽象类天生就是需要被继承的,否则无意义,抽象类也可以继承抽象类,它提供方法模板(抽象方法),抽象方法不可以使用private修饰,也没有意义。
6: 抽象类就是模板设计模式,提供模板,子类具体去实现

接口:接口是一个特殊的抽象类,不能有构造函数,不能有成员变量
1:接口中所有成员,常量,方法都是public
2:因为不能初始化,所以接口中定义方法都是抽象方法
3:接口是必须让实现类实现接口中所有定义的抽象类的
4:jdk1.8版本及以上可以在接口中使用static与default关键字定义实现方法
作用:限定实现类必须含有的方法。

原文地址:https://www.cnblogs.com/keyforknowledge/p/10223421.html

时间: 2024-07-28 13:26:43

java类实例化内存过程与面向对象特征的相关文章

java 类 及其 执行过程

java 类 命名 java类文件中  只能有一个公开类  且 公开类类名与当前类文件的文件名一致 方法如果使用了static修饰,那么此方法是类方法,可以 类名.方法名 使用. 你的main方法在同一个类中,那么不需要写类名,直接写方法名就可以调用. 而没有使用static修饰的方法属于实例方法,必须创建此类的对象,通过对象调用此方法.如: Func2 f = new Func2(); f.shuchu(4,4); public class HelloWorld{ /** * main方法作为

java类的初始化过程

转自http://blog.csdn.net/monghuan/article/details/7404670 一个类可以使用不包含在任何方法体中的静态代码块,当类被载入时,静态代码块被执行,且只被执行一次,静态块常用来执行类属性的初始化. 一.类加载时,变量的初始化顺序:  1.首先,给静态成员变量分配内存空间,进行默认初始化   (整型为0,浮点型为0.0,布尔型为false,字符型为'\u0000',引用型为null)     2.其次,执行静态成员变量的初始化操作   --静态成员的初始

Java类的装载过程和静态代码块

在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载.连接和初始化,其中连接又可以分成校验.准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工作如下:1.装载2.连接3.初始化 一.装载阶段 装载阶段由三个基本动作组成1.通过类型的完全限定名,产生一个代表该类型的二进制数据流2.解析这个二进制数据流为方法区内的内部数据结3.构创建一个表示该类型的java.lang.Class类的实例 另外如果一个类装载器在预先装载的时遇到缺失或错误的class文

Java类的初始化过程及清理

一.类的数据成员初始化 Java中类的数据成员初试化可能有两种形式. 在定义类成员变量的地方直接提供初始化值(这是C++中不允许的) 在构造器中初试化.(Java中不存在类似C++中的初始化列表) 两者的区别是,第一种方式是数据成员直接初试化为提供的初始化值,而在构造器中初始化,其实在数据成员已经初试化为默认值(比如基本类型如int 初始化为0,引用类型初试为null,其实在在构造器已经不能称为初始化了,应该是赋值) 初始化顺序 如果有静态变量则先初始化静态变量,如果基类中也有静态变量且之前没有

Java SE 第十六讲----面向对象特征之继承

1.继承(inheritance):Java是单继承的,意味着一个类只能从另一个类继承(被继承的类叫做父类也叫[基类 baseclass]),继承的类叫做子类,java中的继承使用extends关键字. public class Child extends Parent{ public Child(){ System.out.println("child"); } public static void main(String[] args){ Child child = new Chi

Java类实例化时候的加载顺序

面试试题中经常考到此问题,现在做进一步的总结: public class Student { public Student(String name){ System.out.println(name); } } // 父类 public class FuClass { private static Student student=new Student("父类静态变量"); private Student student1=new Student("父类非静态变量"

Java类的实例化的初始化过程

A a = new A(); new 创建对象过程: 1.类加载 代码验证 2.给对象在内存(堆)中分配空间(给属性赋值): 3.属性赋默认值: byte,short.int,long ->0 float  ->0.0f double ->0.0 boolean  ->false String ->null char ->'\u0000' 4.给属性赋初始值:(用等号'=') 5.调用构造方法(方法和类名相同,没有返回类型) 6.将对象在堆区中的首地址返回给引用a /*

Java类的定义及其实例化

如果你不了解类和对象的概念,请猛击这里:Java类和对象的概念 类必须先定义才能使用.类是创建对象的模板,创建对象也叫类的实例化. 下面通过一个简单的例子来理解Java中类的定义: public class Dog{ String name; int age; void bark(){  // 汪汪叫 System.out.println("汪汪,不要过来"); } void hungry(){  // 饥饿 System.out.println("主人,我饿了")

1.Java类的定义及其实例化

类必须先定义才能使用.类是创建对象的模板,创建对象也叫类的实例化. 下面通过一个简单的例子来理解Java中类的定义: public class Dog{ String name; int age; void bark(){  // 汪汪叫 System.out.println("汪汪,不要过来"); } void hungry(){  // 饥饿 System.out.println("主人,我饿了"); } } 对示例的说明: public 是类的修饰符,表明该类