资源预览内容
第1页 / 共45页
第2页 / 共45页
第3页 / 共45页
第4页 / 共45页
第5页 / 共45页
第6页 / 共45页
第7页 / 共45页
第8页 / 共45页
第9页 / 共45页
第10页 / 共45页
亲,该文档总共45页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
JavaJava中类对象的创中类对象的创建及内存解析建及内存解析讲师:宋红康讲师:宋红康 新浪微博:新浪微博:尚尚硅谷硅谷- -宋红康宋红康程序程序的执行过程的执行过程程 序代码操作系统代码内内存存硬硬 盘盘栈(stack)堆(heap)静态域方法区(常量池)new出来的类或数组的实例(含成员变量)局部变量、对象声明的引用静态变量2.找到main方法开始执行3.执行过程中的内存管理到内存区字符串常量众所周知,Java是由一个一个的“类”构成的,那么Java类可以由哪些部分组成?属性Field方法Method构造器Constructor:创建对象初始化对象代码块内部类一、一、Java类的最基本元素:类的最基本元素:Field & Methodl生活中描述事物无非就是描述事物的属性和行为。如:人有身高,体重等属性,有说话,打球等行为。lJava中用类class来描述事物也是如此属性:对应类中的成员变量。行为:对应类中的成员方法。l定义类其实是定义类中的成员(成员变量和成员方法)。Field = 属性属性 = 成员变量,成员变量,Method = (成员成员)方法方法 = 函数函数Java类的定义类的定义public class Animal public int legs; public void eat() System.out.println(“Eating.”); public void move() System.out.println(“Moving.”); llegs是类的属性 ,也叫类成员变量 。leat(),move()是函数,也叫类的成员方法。Java 类类数据1数据n方法1方法n属性属性方法方法Animallegseat()move()数据数据(属性属性)方法方法类名类名x2:Animallegs=0eat()move()x1:Animallegs=4eat()move()new Animal()new Animal()举例举例二、二、Java 中类与对象中类与对象 栈堆p1:0 x1234new Person()0 x1234age:12name:0 x2345常量池Lileip2:age:23name:HanMeimei24如果创建了一个如果创建了一个类的多个对象,对类的多个对象,对于类中定义的属性,于类中定义的属性,每个对象都拥有各每个对象都拥有各自的一套副本,且自的一套副本,且互不干扰。互不干扰。曰:“白马非马,可乎?”曰:“可。”曰:“何哉?”曰:“马者,所以命形也。白者,所以命色也。命色者,非命形也,故曰白马非马。”对象的创建和使用对象的创建和使用如果创建了一个类如果创建了一个类的多个对象,对于的多个对象,对于类中定义的属性,类中定义的属性,每个对象都拥有各每个对象都拥有各自的一套副本,且自的一套副本,且互不干扰。互不干扰。举例举例: public class Zoo public static void main(String args)Animal x1=new Animal();Animal x2=new Animal();x1.legs=4;x2.legs=0;); /4); /0 x1.legs=2;); /2); /0 Person String name = “Peter”; int age; public void addAge() int i = 2; age = age +i; main() Person p = new Person(); p.name = “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;练习:根据代码,画出内存图练习:根据代码,画出内存图class Car String color = red; int num = 4; void show()(color=+color+“num=+num); class TestCar public static void main(String args) Car c1 = new Car(); /建立建立对象对象c1Car c2 = new Car(); /建立建立对象对象c2c1.color = blue; /对对象的属性进行修改对对象的属性进行修改(); /使用对象使用对象的方法的方法c2.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注 意:Java语言中,每个类都至少有一个构造器语言中,每个类都至少有一个构造器默认构造器的修饰符与所属类的修饰符一致默认构造器的修饰符与所属类的修饰符一致一旦显式定义了构造器,则系统一旦显式定义了构造器,则系统不再不再提供默认构造器提供默认构造器一个类可以创建多个一个类可以创建多个重载重载的构造器的构造器父类的构造器不可被子类继承父类的构造器不可被子类继承class Person/ 定义Person类private String name ;private int age ;public Person() / 无参构造System.out.println(“调用无参构造器) ;public Person(String name)this(); / 调用本类中的无参构造方法this.name = name ;public Person(String name,int age)this(name) ; / 调用有一个参数的构造方法this.age = age;public String getInfo()return 姓名: + name + ,年龄: + age ; 重载重载构造器的迭代使用构造器的迭代使用调用父类的构造调用父类的构造器器l子类中所有的构造器默默认认都会访问父类中空空参参数数的构造器l当父类中没有空参数的构造器时,子类的构造器必须通过this(参参数数列列表表)或者super(参参数数列列表表)语句指定调用本类或者父类中相应的构造器,且必须放在构造器的第一行l如果子类构造器中既未显式调用父类或本类的构造器,且父类中又没有无参的构造器,则编译出错编译出错s:0 x1243new Student()父类的属性age:0name:nullschool:nullObject类调用父类构造调用父类构造器器举例举例 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 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);(Animal带两个参数的构造器带两个参数的构造器,其,其age为为 + age); public class Wolf extends Animal public Wolf()super(灰太狼灰太狼, 3);(Wolf无参数的构造器无参数的构造器); public static void main(String args)new Wolf(); 练习:写出输出结果 当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用。我们有时候希望无论是否产生了对象或无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份,例如所有的中国人都有个国家名称,每一个中国人都共享这个国家名称,不必在每一个中国人的实例对象中都单独分配一个用于代表国家名称的变量。四、关键字四、关键字staticc2:c1:name:name:静态域name:这是一个圆关键字关键字staticlclass Circleprivate double radius;public Circle(double radius)this.radius=radius;public double findArea()return Math.PI*radius*radius;l创建两个Circle对象lCircle类中的变量radius是一个实例变量(instance variable),它属于类的每一个对象,不能被同一个类的不同对象所共享。l上例中c1的radius独立于c2的radius,存储在不同的空间。c1中的radius变化不会影响c2的radius,反之亦然。如果想让一个类的所有实例共享数据如果想让一个类的所有实例共享数据,就用,就用类类变量!变量!静态域堆栈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() return 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:name:name:name:”圆”static修饰初始化修饰初始化块块l一个类中初始化块若有修饰符,则只能被static修饰,称为静静态态代代码码块块(static block ),当类被载入时,类属性的声明和静态代码块先后顺序被执行,且只被执行一次。lstatic块通常
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号