




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、JavaJava中类对象的创中类对象的创建及内存解析建及内存解析讲师:宋红康讲师:宋红康 新浪微博:尚硅谷新浪微博:尚硅谷- -宋红康宋红康;程序的执行过程程序的执行过程程 序代码操作系统代码内内存存硬硬 盘盘栈stack堆heap静态域方法区(常量池)new出来的类或数组的实例(含成员变量)部分变量、对象声明的援用静态变量2.找到main方法开场执行3.执行过程中的内存管理1.load到内存区字符串常量;众所周知,Java是由一个一个的“类构成的,那么Java类可以由哪些部分组成?属性Field方法Method构造器Constructor:创建对象初始化对象代码块内部类;一、一、Java类的
2、最根本元素:类的最根本元素:Field & Methodl 生活中描画事物无非就是描画事物的属性和行为。l 如:人有身高,体重等属性,有说话,打球等行为。l Java中用类class来描画事物也是如此l 属性:对应类中的成员变量。l 行为:对应类中的成员方法。l 定义类其实是定义类中的成员(成员变量和成员方法)。Field = 属性属性 = 成员变量,成员变量,Method = (成员成员)方法方法 = 函数函数;Java类的定义类的定义public class Animal public int legs; public void eat() System.out.println(“
3、Eating.); public void move() System.out.println(“Moving.); legs是类的属性是类的属性 ,也叫类成员变量,也叫类成员变量 。eat(),move()是函数,也叫类的成员方法。是函数,也叫类的成员方法。;Java 类类数据1数据n方法1方法n属性属性方法方法Animallegseat()move()数据数据(属性属性)方法方法类名类名x2:Animallegs=0eat()move()x1:Animallegs=4eat()move()new Animal()new Animal()举例举例二、二、Java 中类与对象中类与对象 ;栈堆
4、p1:0 x1234new Person()0 x1234age:12name:0 x2345常量池Lileip2:age:23name:HanMeimei24假设创建了一个假设创建了一个类的多个对象,对类的多个对象,对于类中定义的属性,于类中定义的属性,每个对象都拥有各每个对象都拥有各自的一套副本,且自的一套副本,且互不干扰。互不干扰。;曰:“白马非马,可乎?曰:“可。曰:“何哉?曰:“马者,所以命形也。白者,所以命色也。命色者,非命形也,故曰白马非马。;对象的创建和运用对象的创建和运用 假设创建了一个类假设创建了一个类的多个对象,对于的多个对象,对于类中定义的属性,类中定义的属性,每个对象
5、都拥有各每个对象都拥有各自的一套副本,且自的一套副本,且互不干扰。互不干扰。举例举例: public class Zoo public static void main(String args)Animal x1=new Animal();Animal x2=new Animal();x1.legs=4;x2.legs=0;System.out.println(x1.legs); /4System.out.println(x2.legs); /0 x1.legs=2;System.out.println(x1.legs); /2System.out.println(x2.legs); /0 ;
6、Person String name = “Peter; int age; public void addAge() int i = 2; age = age +i; main() Person p = new Person(); = “Lily; p.addAge(); Person p1 = new Person(); 栈堆p: 0 x3423new Person();0 x3423String name = “Peter; int age = 0;Lilyi = 22p1:0 x34330 x3433String name = “Peter; int age = 0;练习:
7、根据代码,画出内存图练习:根据代码,画出内存图class Car String color = red; int num = 4; void show() System.out.println(color=+color+“num=+num); class TestCar public static void main(String args) Car c1 = new Car(); /建立对象建立对象c1Car c2 = new Car(); /建立对象建立对象c2c1.color = blue; /对对象的属性进展修正对对象的属性进展修正c1.show(); /运用对象的方法运用对象的方法c
8、2.show(); ;对象内存构造对象内存构造Car c1 = new Car(); c1.color=blue;Car c2 = new Car();heapc10 x0034c20 x00780 x00340 x0078new Car( )new Car( )color=rednum=4color=rednum=4blue;三、构造器的运用三、构造器的运用l 根据参数不同,构造器可以分为如下两类:l 隐式无参构造器系统默许提供l 显式定义一个或多个构造器无参、有参l 注 意:l Java言语中,每个类都至少有一个构造器l 默许构造器的修饰符与所属类的修饰符一致l 一旦显式定义了构造器,那么
9、系统不再提供默许构造器l 一个类可以创建多个重载的构造器l 父类的构造器不可被子类承继;class Person/ 定义Person类private String name ;private int age ;public Person() / 无参构造System.out.println(“调用无参构造器) ;public Person(String name)this(); / 调用本类中的无参构造方法 = name ;public Person(String name,int age)this(name) ; / 调用有一个参数的构造方法this.age = age;p
10、ublic String getInfo()return 姓名: + name + ,年龄: + age ; 重载构造器的迭代运用重载构造器的迭代运用;调用父类的构造器调用父类的构造器l 子类中一切的构造器默许都会访问父类中空参数的构造器l 当父类中没有空参数的构造器时,子类的构造器必需经过this(参数列表)或者super(参数列表)语句指定调用本类或者父类中相应的构造器,且必需放在构造器的第一行l 假设子类构造器中既未显式调用父类或本类的构造器,且父类中又没有无参的构造器,那么编译出错;s:0 x1243new Student()父类的属性age:0name:nullschool:null
11、Object类;调用父类构造器举例调用父类构造器举例 1 public class Student extends Person 2 private String school;34 public Student(String name, int age, String s) 5 super(name, age);6 school = s;7 8 public Student(String name, String s) 9 super(name);10 school = s;11 12 public Student(String s) / 编译出错: no super(),系统将调用父类 无
12、参数的构造方法。13 school = s;14 15 ;class Creature public Creature()System.out.println(Creature无参数的构造器无参数的构造器); class Animal extends Creature public Animal(String name)System.out.println(Animal带一个参数的构造器,该动物的带一个参数的构造器,该动物的name为为 + name); public Animal(String name , int age)this(name);System.out.println(Anim
13、al带两个参数的构造器,其带两个参数的构造器,其age为为 + age); public class Wolf extends Animal public Wolf()super(灰太狼灰太狼, 3);System.out.println(Wolf无参数的构造器无参数的构造器); public static void main(String args)new Wolf(); 练习:写出输出结果; 当我们编写一个类时,其实就是在描画其对象的属性和行为,而并没有产生本质上的对象,只需经过new关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用。我们有时候希望无论能否产生了
14、对象或无论产生了多少对象的情况下,某些特定的数据在内存空间里只需一份,例如一切的中国人都有个国家称号,每一个中国人都共享这个国家称号,不用在每一个中国人的实例对象中都单独分配一个用于代表国家称号的变量。四、关键字四、关键字static;c2:c1:radius:2.0name:radius:3.0name:静态域name:这是一个圆;关键字关键字staticl class Circlelprivate double radius;lpublic Circle(double radius)this.radius=radius;lpublic double findArea()return Mat
15、h.PI*radius*radius;l 创建两个Circle对象l Circle c1=new Circle(2.0);/c1.radius=2.0l Circle c2=new Circle(3.0);/c2.radius=3.0l Circle类中的变量radius是一个实例变量(instance variable),它属于类的每一个对象,不能被同一个类的不同对象所共享。l 上例中c1的radius独立于c2的radius,存储在不同的空间。c1中的radius变化不会影响c2的radius,反之亦然。假设想让一个类的一切实例共享数据,就用类变量!假设想让一个类的一切实例共享数据,就用类
16、变量!;静态域堆栈country:CHINAstatic的属性a1:0 x1232name:Peterage:12country:a2:0 x1222name:Lileiage:21country:;class Circle private double radius;public static String name = 这是一个圆;public static String getName()return name;public Circle(double radius) getName();this.radius = radius;public double findArea() retu
17、rn Math.PI * radius * radius;public void display()System.out.println(name:+name+radius:+radius);public class TestStatic public static void main(String args) Circle c1 = new Circle(2.0);Circle c2 = new Circle(3.0);c1.display();c2.display();栈堆静态域c1:c2:radius:2.0name:radius:3.0name:name:圆;static修饰初始化块修
18、饰初始化块l 一个类中初始化块假设有修饰符,那么只能被static修饰,称为静态代码块(static block ),当类被载入时,类属性的声明和静态代码块先后顺序被执行,且只被执行一次。l static块通常用于初始化static (类)属性l class Person lpublic static int total;lstatic l total = 100;/为total赋初值 ll /其它属性或方法声明l ;l 非静态代码块:没有非静态代码块:没有static修饰的代码块修饰的代码块l 1.可以有输出语句。可以有输出语句。l 2.可以对类的属性、类的声明进展初始化操作。可以对类的属性
19、、类的声明进展初始化操作。l 3.可以调用静态的变量或方法。可以调用静态的变量或方法。l 4.假设有多个非静态的代码块,那么按照从上到下的顺序假设有多个非静态的代码块,那么按照从上到下的顺序依依l 次执行。次执行。l 5.每次创建对象的时候,都会执行一次。且先于构造器执每次创建对象的时候,都会执行一次。且先于构造器执行行l 静态代码块:用静态代码块:用static 修饰的代码块修饰的代码块l 1.可以有输出语句。可以有输出语句。l 2.可以对类的属性、类的声明进展初始化操作。可以对类的属性、类的声明进展初始化操作。l 3.不可以对非静态的属性初始化。即:不可以调用非静态的不可以对非静态的属性初
20、始化。即:不可以调用非静态的属属l 性和方法。性和方法。l 4.假设有多个静态的代码块,那么按照从上到下的顺序依次假设有多个静态的代码块,那么按照从上到下的顺序依次执行。执行。l 5.静态代码块的执行要先于非静态代码块。静态代码块的执行要先于非静态代码块。l 6.静态代码块只执行一次静态代码块只执行一次;静态初始化块举例静态初始化块举例class Person public static int total; static total = 100;System.out.println(in static block!); public class Test public static void
21、 main(String args) System.out.println(total = + Person.total);System.out.println(total = + Person.total);练习:练习:TestLeaf.java输出:输出:in static blocktotal=100total=100;五、方法的参数传送五、方法的参数传送l 方法只需被调用才会被执行l 方法调用的过程分析;方法的参数传送方法的参数传送l 方法,必需有其所在类或对象调用才有意义。假方法,必需有其所在类或对象调用才有意义。假设方法含有参数:设方法含有参数:l 形参:方法声明时的参数形参:方法
22、声明时的参数l 实参:方法调用时实践传给形参的参数值实参:方法调用时实践传给形参的参数值l Java的实参值如何传入方法呢?的实参值如何传入方法呢?l Java里方法的参数传送方式只需一种:值传里方法的参数传送方式只需一种:值传送。送。 即将实践参数值的副本复制品传入方法即将实践参数值的副本复制品传入方法内,而参数本身不受影响。内,而参数本身不受影响。;方法的参数传送方法的参数传送 根本数据类型的参根本数据类型的参数传送数传送 ;方法的参数传送方法的参数传送 援用数据类型的参援用数据类型的参数传送数传送;方法的参数传送方法的参数传送 援用数据类型的参援用数据类型的参数传送数传送;方法的参数传送
23、方法的参数传送public class TestTransfer public static void swap(int a , int b)int tmp = a;a = b;b = tmp;System.out.println(swap方法里,a的值是 + a + ;b的值是 + b);public static void main(String args) int a = 6;int b = 9;swap(a , b);System.out.println(交换终了后,变量a的值是 + a + ;变量b的值是 + b); 请输出结果请输出结果;a:6b:9main()swap();dw:
24、0 x1233d:0 x1233a:9b:6 new DataSwap();方法的参数传送方法的参数传送class DataSwappublic int a;public int b;public class TestTransfer1 public static void swap(DataSwap ds)int tmp = ds.a;ds.a = ds.b;ds.b = tmp;System.out.println(swap方法里,方法里,a Field的值是的值是+ ds.a + ;b Field的值是的值是 + ds.b);public static void main(String
25、args) DataSwap ds = new DataSwap();ds.a = 6;ds.b = 9;swap(ds);System.out.println(交换终了后,交换终了后,a Field的值是的值是 + ds.a + ;b Field的值是的值是 + ds.b);请输出结果请输出结果;mainswapi=6j=9i=6j=9i=9j=6;mainswapds:0 x7654new DataSwap()a = 9b = 6;class Value int i = 15;class Test public static void main(String args)Test t = n
26、ew Test();t.first();public void first() int i = 5;Value v = new Value();v.i = 25;second(v, i);System.out.println(v.i);public void second(Value v, int i) i = 0;v.i = 20;Value val = new Value();v = val;System.out.println(v.i + + i);练练 习:写出输出结果习:写出输出结果;t:0 x1234i = 5v:0 x8765i = 1525v:0 x8765i = 5 020v
27、al:0 x4567i = 150 x4567;class BirthDateprivate int day;private int month;private int year;public BirthDate(int d,int m,int y)day = d; month = m; year = y;public void setDay(int d)day = d;public void setMonth(int m)month = m;public void setYear(int y)year = y;public int getDay()return day;public int getM
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 软件设计师考试快速掌握试题及答案
- 操作系统基础知识试题及答案
- 高考数学实践2024年试题及答案
- 网络服务的级别试题及答案分析
- 企业竞争策略与风险分析试题及答案
- 2025年软考设计师备考情绪管理试题及答案
- 2025农民土地流转合同范本
- 2025企业租赁合同标准范文
- 棉业公司范本章程
- 法学概论研究的国际视野与试题与答案
- 《平凡的世界》中孙少平人物形象分析8500字(论文)
- 《结构式家庭疗法提升“丧偶式育儿”家庭亲密度的个案研究》
- 化学实验室废物处理管理制度
- 2024年六西格玛黄带认证考试练习题库(含答案)
- 第三章-足球-基本技术 足球运球绕杆 教学设计 人教版初中体育与健康七年级全一册
- 2024年同等学力英语考试真题及详解
- 会展活动场地布置与搭建技术规范手册
- “非遗”之首-昆曲经典艺术欣赏智慧树知到期末考试答案章节答案2024年北京大学
- 《药事管理学》习题库
- 水文地质技术员技能鉴定理论考试题库-下(多选、判断题)
- DZ∕T 0054-2014 定向钻探技术规程(正式版)
评论
0/150
提交评论