1、第四课,类和对象(上),Java中的数组和字符串是基本数据类型还是引用数据类型? Java中使用哪个关键字在堆中分配内存? Java中的数组是被分配在堆中还是栈上? Java对象占用的内存空间需要程序员手动去释放么? Java虚拟机在什么情况下会回收对象占用的内存空间? Java中的数据由哪些声明方式? 获取Java数组的长度使用哪个属性? 使用命令行对Java程序传递参数时其控制台的参数之间使用什么分隔符分割?,回顾,本课案例,设计人类(Person类),描述人的年龄、身高、体重和吃饭、睡觉等行为,本章目标,了解什么是面向对象 面向对象的基本概念 类 对象 封装 继承 多态 如何定义类,如何
2、创建对象 成员运算符 访问控制权限:public和private 构造方法,面向对象的编程思想,OOP,旨在计算机程序中 模拟现实世界中的概念,在计算机程序中用相似的 实体模拟现实世界中的实体,在OOP中,现实世界的 所有事物全都被视为对象,设计和实现 软件系统的方法,面向对象的三大原则,封 装,继 承,多 态,对 象,对象是面向对象编程的核心部分,是实际存在的具体实体,具有明确定义的状态和行为 对象其实就是“状态”和“行为”的封装体,其中:数据表示自身的状态,也称作“属性”或“成员变量” 函数表示自身的功能和行为,也称作“方法”或“成员方法”。,状态,行为,类,人们为了更好地认识世界,将现实
3、生活中的事物(对象)划分成类同一类中的事物总是具有一些共性类以共同的属性和方法定义实体类是具有相同属性和方法的一组对象集合,属 性,事物的属性在类中用成员变量表示 不同对象的各个属性都拥有其特定的值 属性名称由类的所有对象共享,方 法,事物的行为和动作在类中用成员方法表示每个对象都有相同的动作和行为,即:每个对象共享类中的成员方法,类和对象的区别,类是用来描述实体的“模板”或“原型”对象是实际的实体,每一个对象都是类的一个具体实例类用来定义对象所有的属性和方法,同一类的所有对象都拥有相同的特征(成员变量)和操作(成员方法)可以将类理解成生产产品的模具,而对象则是根据此模具生产的一个个产品。,类
4、与结构,最简单的理解方式:,区别在于:结构体一般只有数据(属性)而没有函数(方法)。,封 装,将某些东西包装在一起,然后以新的完整形式呈现出来 隐藏属性、方法或实现细节的处理方式称为封装 封装其实就是有选择性地公开或隐藏某些信息,它解决了数据的安全性问题。,可以公开,无所谓,不可以公开,继 承,继承就是重用现有的类来生成新类的一种特征通俗地讲就是从现有的类(即父类或基类)创建新类(子类或派生类)的过程现实生活中,继承可以达到财产重用的目的,而在Java中,继承可以使代码重用,多 态,多态是指同一个类中存在相似行为的一系列不同操作或在继承关系中相同的动作行为在不同子类中具有的不同表现,前者表现为
5、静态多态,即:方法重载;后者表现为动态多态,即:方法重写(覆盖)多态的好处就是使类更灵活,更便于扩充,在Java中定义类,/*定义学生类*/ class Student String name; /姓名int age; /年龄float weight; /体重/*吃饭的方法*/void dining()System.out.println(“吃饱了.“);weight+;/*走路的方法*/void walk()System.out.println(“走累了.“);weight-; ,定义类的语法,习惯上,类名的首字母大写,如:Student,在Java中创建对象,/*Test类,用来容纳mai
6、n方法*/ public class Test /*main方法,程序入口*/public static void main(String args)Student std; /声明Student类型的引用std = new Student(); /创建Student类型的对象std.name = “张三“; /为姓名赋值std.age = 18; /为年龄赋值std.weight = 50; /为体重赋值std.dining(); /调用成员方法System.out.println(std.weight);std.walk();System.out.println(std.weight);
7、,创建对象的语法,和数组相似,对象也是引用数据类型,只能使用new运算符从堆中分配内存,此过程称为创建对象、类实例化或对象实例化,因此对象也称为实例 创建对象的一般语法:类名 引用变量名 = new 类名(); 使用已经定义好的类,创建该类对象的过程称为“实例化”,引用变量名又称为对象名,习惯上我们直接称为对象(实际上是指该引用变量所指向的堆中对象),注意:这里要有括号,成员运算符,实例化类的对象之后可以访问到类中的成员(成员变量和成员方法),但访问类中的某些成员并不一定需要实例化类的对象 使用成员运算符(.)来访问成员变量或成员方法 一般语法是:对象名.成员名 如:std.age = 18;
8、 /为成员属性赋值std.dining(); /调用成员方法,访问权限:public和private,C语言中结构体的成员可以从任何地方进行访问,这将给数据的安全留下极大的隐患 为了避免从类外部直接访问类成员而造成的数据损坏,Java对类成员的访问制定了约束 关键字public和private是访问修饰符,用来说明某个成员是否可以从类外部进行访问 public修饰的成员可以在任何地方进行访问,不受任何约束 private修饰的成员只能够被本类中的其它成员访问,而不能从类的外部进行访问,访问权限,无法从类的外部访问私有成员 其它类的私有成员对于当前类也是隐藏的,访问权限示例,class Stud
9、ent private String name; /姓名,私有的,不可以从类外部直接访问private int age; /年龄,私有的,不可以从类外部直接访问private float weight; /体重,私有的,不可以从类外部直接访问/吃饭的方法,公有的,可以从任何地方访问public void dining() System.out.println(“吃饱了.“);weight+; /dining方法是类内部成员,可以直接访问本类私有成员/走路的方法,公有的,可以从任何地方访问public void walk() System.out.println(“走累了.“);weight-;
10、 /walk方法是类内部成员,可以直接访问本类私有成员 public class Test public static void main(String args) Student std = new Student(); /实例化一个Student对象std.age = 18; /试图从类外部访问私有成员,将会报出一个错误std.dining(); /允许访问公有成员 ,访问权限(续),加上访问修饰符有时候可能会给操作数据带来不便,但可以在很大程度上保证数据的安全 一般地,我们会将成员属性声明为private,而将成员方法声明为public,但这样做并不是绝对的 有时候,类外部可能要操作到某
11、些私有数据成员,那么就可以增加一个公有的方法,再由这个方法来操作私有数据,避免因类外部的误操作而造成的数据损坏 因为main方法要由类外部的虚拟机来调用,所以main方法必须声明成public,修改Student类,class Student /定义学生类private String name; /姓名,私有private int age; /年龄,私有private float weight; /体重,私有public void setName(String n) /为姓名赋值的方法,公有name = n;public void setAge(int a) /为年龄赋值的方法,公有age =
12、 a;public void setWeight(float w) /为体重赋值的方法,公有weight = w;public void display() /将所有信息打印出来的方法,公有System.out.println(“姓名:“ + name + “,年龄:“ + age + “,体重:“ + weight);public void dining() /吃饭的方法,公有,代码略public void walk() /走路的方法,公有,代码略 public class Test public static void main(String args) Student std = new
13、 Student(); /实例化学生类对象std.setName(“张三“); /为姓名赋值std.setAge(18); /为年龄赋值std.setWeight(55); /为体重赋值std.dining(); /调用吃饭的方法std.display(); /将信息打印出来 ,对象初始化,在上例中,只能逐个地为数据成员赋值,如果想在对象实例化的同时就初始化成员变量,就使用到了构造方法构造方法是一种特殊的方法,它与类同名,但不属于类的成员,因此构造方法不能被继承,在对象实例化时由虚拟机自动调用请注意:构造方法没有返回值类型,也不能有返回值。,构造方法示例,/*定义ConstructorDemo
14、类,对构造方法进行测试*/ class ConstructorDemo /*构造方法,方法名与类名完全一致无需指定返回值类型,也不能有返回值*/public ConstructorDemo()System.out.println(“这是构造方法“); /*Test类,用来容纳main方法 一般将包含有main方法的类声明为public*/ public class Test /*main方法,程序入口*/public static void main(String args)/*实例化ConstructorDemo类的对象*/ConstructorDemo cd = new Construct
15、orDemo(); ,构造方法,正是由于在实例化对象的同时会自动调用构造方法,所以构造方法一般用来给成员变量分配资源或初始化成员变量构造方法的一般形式:访问权限 类名(形参列表) 方法体构造方法一般应定义成public,也有定义成private的特例。,为Student类添加构造方法,class Student /定义学生类private String name; /姓名,私有private int age; /年龄,私有private float weight; /体重,私有/构造方法,根据传递进来的参数,为数据成员赋值public Student(String n, int a, floa
16、t w) /分别为每个数据成员赋初始值name = n;age = a;weight = w;public void setName(String n) /为姓名赋值的方法,公有,代码略public void setAge(int a) /为年龄赋值的方法,公有,代码略public void setWeight(float w) /为体重赋值的方法,公有,代码略public void display() /将所有信息打印出来的方法,公有,代码略public void dining() /吃饭的方法,公有,代码略public void walk() /走路的方法,公有,代码略 public cl
17、ass Test public static void main(String args) /利用构造方法,为数据成员指定初始值Student std = new Student(“张三“, 18, 55);std.display(); /将信息打印出来 ,构造方法(续),每个对象生成时都必须执行构造方法,而且只能执行一次如果构造方法调用失败,那么对象也无法创建构造方法不属于类的成员,不可以显式地直接调用构造方法,构造方法只能通过new指令由虚拟机来调用在没有定义构造方法的情况下,类会自动产生一个无参数的默认构造方法,这个默认的构造方法什么都不做一旦显式定义了构造方法,默认无参构造方法自动消失。,总 结,对象由状态(属性或称成员变量)和行为(成员方法)组成 类是具有相同成员变量和成员方法的对象集合 封装可以隐藏对象实现的具体细节 成员运算符用于访问类中的成员 成员可以定义为公有,也可以定义为私有 构造方法一般用来初始化对象中的成员变量 如果不定义构造方法,将有默认的构造方法,一旦定义,默认的构造方法自动消失。,作 业,创建学生类,描述学生的姓名、年龄、身高、学历和听课、做作业等行为,Thank You!,