




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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(“Eati
3、ng.); 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 中类与对象中类与对象 栈堆p1:0 x
4、1234new 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 Person St
6、ring 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(); /运用对象的方法运用对象的方法c2.show();
8、 对象内存构造对象内存构造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;public String
10、 getInfo()return 姓名: + name + ,年龄: + age ; 重载构造器的迭代运用重载构造器的迭代运用调用父类的构造器调用父类的构造器l 子类中一切的构造器默许都会访问父类中空参数的构造器l 当父类中没有空参数的构造器时,子类的构造器必需经过this(参数列表)或者super(参数列表)语句指定调用本类或者父类中相应的构造器,且必需放在构造器的第一行l 假设子类构造器中既未显式调用父类或本类的构造器,且父类中又没有无参的构造器,那么编译出错s:0 x1243new Student()父类的属性age:0name:nullschool:nullObject类调用父类构造器
11、举例调用父类构造器举例 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(),系统将调用父类 无参数的构造方法。13 scho
12、ol = 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(Animal带两个参数的构造器,其带两个
13、参数的构造器,其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、某些特定的数据在内存空间里只需一份,例如一切的中国人都有个国家称号,每一个中国人都共享这个国家称号,不用在每一个中国人的实例对象中都单独分配一个用于代表国家称号的变量。四、关键字四、关键字staticc2:c1:radius:2.0name:radius:3.0name:静态域name:这是一个圆关键字关键字staticl class Circlelprivate double radius;lpublic Circle(double radius)this.radius=radius;lpublic double findArea()return Math.PI*radius*radius;
15、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,反之亦然。假设想让一个类的一切实例共享数据,就用类变量!假设想让一个类的一切实例共享数据,就用类变量!静态域堆栈country:CHI
16、NAstatic的属性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() return Math.PI * radius *
17、 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修饰初始化块修饰初始化块l 一个类中初始化块假设有修饰符,
18、那么只能被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.可以对类的属性、类的声明进展初始化操作。可以对类的属性、类的声明进展初始化操作。l 3.可以调用静态
19、的变量或方法。可以调用静态的变量或方法。l 4.假设有多个非静态的代码块,那么按照从上到下的顺序假设有多个非静态的代码块,那么按照从上到下的顺序依依l 次执行。次执行。l 5.每次创建对象的时候,都会执行一次。且先于构造器执每次创建对象的时候,都会执行一次。且先于构造器执行行l 静态代码块:用静态代码块:用static 修饰的代码块修饰的代码块l 1.可以有输出语句。可以有输出语句。l 2.可以对类的属性、类的声明进展初始化操作。可以对类的属性、类的声明进展初始化操作。l 3.不可以对非静态的属性初始化。即:不可以调用非静态的不可以对非静态的属性初始化。即:不可以调用非静态的属属l 性和方法。
20、性和方法。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 main(String args) Syste
21、m.out.println(total = + Person.total);System.out.println(total = + Person.total);练习:练习:TestLeaf.java输出:输出:in static blocktotal=100total=100五、方法的参数传送五、方法的参数传送l 方法只需被调用才会被执行l 方法调用的过程分析:方法的参数传送方法的参数传送l 方法,必需有其所在类或对象调用才有意义。假方法,必需有其所在类或对象调用才有意义。假设方法含有参数:设方法含有参数:l 形参:方法声明时的参数形参:方法声明时的参数l 实参:方法调用时实践传给形参的参数
22、值实参:方法调用时实践传给形参的参数值l Java的实参值如何传入方法呢?的实参值如何传入方法呢?l Java里方法的参数传送方式只需一种:值传里方法的参数传送方式只需一种:值传送。送。 即将实践参数值的副本复制品传入方法即将实践参数值的副本复制品传入方法内,而参数本身不受影响。内,而参数本身不受影响。方法的参数传送方法的参数传送 根本数据类型的参根本数据类型的参数传送数传送 :方法的参数传送方法的参数传送 援用数据类型的参援用数据类型的参数传送数传送:方法的参数传送方法的参数传送 援用数据类型的参援用数据类型的参数传送数传送方法的参数传送方法的参数传送public class TestTra
23、nsfer 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:0 x1233d:0 x1233a:9b:6 new Da
24、taSwap()方法的参数传送方法的参数传送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 args) DataSwap ds = new DataSw
25、ap();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=6mainswapds:0 x7654new DataSwap()a = 9b = 6class Value int i = 15;class Test public static void main(String args)Test t = new Test();t.first();public void f
26、irst() 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 020val:0 x4567i = 150 x4567class 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 getMo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025辽宁盘锦建设投资有限责任公司招聘工作人员和考前自测高频考点模拟试题及完整答案详解1套
- 2025内蒙古赤峰招聘乡镇卫生院事业编制人员32人(含护理9人)模拟试卷及答案详解(名校卷)
- 2025年呼吸科疾病治疗方案制定答案及解析
- 2025年康复医学功能评定评估考查答案及解析
- 2025年春季内蒙古包头铁道职业技术学院人才引进考前自测高频考点模拟试题及答案详解一套
- 2025年检验医学检验技术应用考核答案及解析
- 2025年骨科手术器械操作技能评估答案及解析
- 2025年药学知识与应用模拟测试卷答案及解析
- 2025年烟台市教育局所属事业单位卫生类岗位公开招聘工作人员(2人)模拟试卷完整答案详解
- 2025年心理咨询心理疾病病因考核答案及解析
- 型钢混凝土结构钢筋施工
- 石群邱关源电路(第1至7单元)白底课件
- JJF 1338-2012相控阵超声探伤仪校准规范
- GB/T 40529-2021船舶与海洋技术起货绞车
- GB 31603-2015食品安全国家标准食品接触材料及制品生产通用卫生规范
- 关于公布2016年度中国电力优质工程奖评审结果的通知
- 港口集团绩效考核方案
- 送达地址确认书(诉讼类范本)
- 2023版北京协和医院重症医学科诊疗常规
- 三坐标测量基础知识(基础教育)
- 宜家战略分析(课堂PPT)
评论
0/150
提交评论