8. 类和对象举例 //定义一个类
public class Animal
{
public int legs;
public void eat()
{
System.out.println(“Eating.”);
}
public void move()
{
System.out.println(“Moving.”);
}
}
//声明并创建一个Animal类的对象,将该对象命名为xb
Animal xb = new Animal();
//调用对象xb中的方法
xb.eat();Animal+leg:int+eat():void
+move():void
9. 类的定义 public class Animal
{
public int legs;
public void eat(){
System.out.println(“Eating.”);
}
public void move(){
System.out.println(“Moving.”);
}
}
legs是类的属性 ,也叫类 成员 变量 。
eat,move是方法也叫类的 成员 函数。
10. 声明类语法格式:
[< 修饰符>] class < 类名>
{
[<属性声明>]
[<构造器声明>]
[<方法声明>]
}
说明:修饰符public:类可以被任意访问
类的正文要用{ }括起来
举例:
public class Person{
private int age ; //声明私有变量 age
public void showAge(int i) { //声明方法showAge
age = i;
}
}
11. 声明属性语法格式:
[<修饰符>] 类型 < 属性名> [=初值] ;
说明:修饰符 private: 该属性只能由该类的方法访问。
修饰符 public: 该属性可以被该类以外的方法访问。
类型:任何基本类型,如int、boolean或任何类。
举例:
public class Person{
private int age; //声明private变量 age
public String name = “Lila”; //声明public变量 name
}属性有时也称为:数据成员(数据),成员变量(变量)
12. 声明方法语法格式:
<修饰符> <返回类型> <方法名>([< 参数表>]) {
[< 语句>]
}
说明: 修饰符:public,private,protected 等。
返回类型:return语句传递返回值。没有返回值:void。
举例:
public class Person{
private int age;
public int getAge() { return age; } //声明方法getAge
public void setAge(int i) { //声明方法setAge
age = i; //将参数i的值赋给类的成员变量age
}
}方法有时也称为:成员函数(函数)
13. 对象的创建和使用使用 new +构造方法 创建一个新的对象;
使用 “对象名.对象成员” 的方式访问对象成员(包括属性和方法);public class Animal {
public int legs;
public void eat(){
System.out.println(“Eating.”);
}
public viod move(){
System.out.println(“Move.”);
}
}举例:
public class Zoo{
public static void main(String args[]){
Animal xb=new Animal();
xb.legs=4;
System.out.println(xb.legs);
xb.eat();
xb.move();
}
}
14. 对象的创建和使用如果创建了一个类的多个对象,对于类中定义的属性,每个对象都拥有各自的一套副本,且互不干扰。
举例:
public class Zoo{
public static void main(String args[]){
Animal xb=new Animal();
Animal xh=new Animal();
xb.legs=4;
xh.legs=0;
System.out.println(xb.legs); //4
System.out.println(xh.legs); //0
xb.legs=2;
System.out.println(xb.legs); //2
System.out.println(xh.legs); //0
}
}
23. 信息的封装和隐藏(1) 使用者对类内部定义的属性(对象的成员变量)的直接操作会导致数据
的错误、混乱或安全性问题。(version1)
public class Animal {
public int legs;
public void eat(){
System.out.println(“Eating.”);
}
public void move(){
System.out.println(“Moving.”);
}
}
public class Zoo{
public static void main(String args[]){
Animal xb=new Animal(); xb.legs=4;
System.out.println(xb.legs);
xb.eat();xb.move();
}
}
问题:xb.legs=-1000;应该将legs属性保护起来,防止乱用。
保护的方式:信息隐藏
25. 信息的封装和隐藏(3) (version2)public class Animal{
private int legs; //将属性legs定义为private,只能被Animal类内部访问
public void setLegs(int i){ //在这里定义方法 eat() 和 move()
if (i != 0 && i != 2 && i != 4){
System.out.println("Wrong number of legs!");
return;
}
legs=i;
}
public int getLegs(){
return legs;
}
}
public class Zoo{
public static void main(String args[]){
Animal xb=new Animal();
xb.setLegs(4); //xb.setLegs(-1000);
xb.legs=-1000; //非法
System.out.println(xb.getLegs());
}
}
26. 1.创建程序,在其中定义两个类,Person和
TestPerson类的定义如下。用setAge()设置人的合法年龄(0~130),用getAge()返回人的年龄。在Test类中实例化Person类的对象b,调用setAge()和getAge()方法,体会Java的封装性。
练习2Person-age:int+setAge(i: int)
+getAge(): int
38. 函数的重载 函数的重载就是在同一个类中允许同时存在一个以上的同名函数,只要它们的参数个数或类型不同即可。 如:
public class Test
{
public static void main(String [] args){
int isum;
double fsum;
isum=add(3,5);
isum=add(3,5,6);
fsum=add(3.2,6.5);
}
public static int add(int x,int y) { reutrn x+y; }
public static int add(int x,int y,int z) { return x+y+z; }
public static double add(double x,double y){ return x+y; }
}
39. 在同一个类中可以定义多个同名方法—方法名重载(overload)
public class PrintStream{
public void print(int i) {……}
public void print(float f) {……}
public void print(String s) {……}
}
重载方法的参数列表必须不同
重载方法的返回值类型可以相同,也可以不同
调用时根据方法的参数类型来区别。
print(3);print(1.2f);print(“hello!”);函数的重载
41. 构造方法重载构造方法一般用来创建对象的同时初始化对象。如
class Person{
String name;
int age;
public Person(String n , int a){ name=n; age=a;}
}
构造方法重载使得对象的创建更加灵活,方便创建各种不同的对象。
构造方法重载举例:
public class Person{
public Person(String name, int age, Date d) {this(name,age);}
public Person(String name, int age) {…}
public Person(String name, Date d) {…}
public Person(){…}
}
构造方法重载,参数列表必须不同
42. 构造方法重载举例public class Person {
private String name;
private int age;
private Date birthDate;
public Person(String name, int age, Date d) {
this.name = name;
this.age = age;
this.birthDate = d;
}
public Person(String name, int age) {
this(name, age, null); //this.name=name; this.age=age;
//this.birthDate=null;
}
public Person(String name, Date d) {
this(name, 30, d); //this.name=name;
this.age=30;this.birthDate=d;
}
public Person(String name) {
this(name, 30); //this.name=name; this.age=30;
}
}
43.
(1)定义Person类,有4个属性:String name; int age; String school; String major,
(2)定义Person类的3个构造方法:
第一个构造方法Person(String n, int a)设置类的name和age属性;
第二个构造方法Person(String n, int a, String s)设置类的name,
age 和school属性;
第三个构造方法Person(String n, int a, String s, String m)设置类的name, age ,school和major属性;
(3)在main方法中分别调用不同的构造方法创建的对象,并输出其属性值。练习5
44. 学习目标类和对象
信息的封装和隐藏
构造方法
方法的重载
this 关键字
函数的参数传递
package语句/import语句
47. 学习目标类和对象
信息的封装和隐藏
构造方法
方法的重载
this 关键字
函数的参数传递
package语句/import语句
48. 函数的参数传递 —基本数据类型的参数传递
49. 函数的参数传递 —引用数据类型的参数传递
50. 函数的参数传递 —引用参数传递的一个问题分析
51. 源文件布局
52. 软件包包帮助管理大型软件系统:将语义近似的类组织到包中。
包可以包含类和子包。
53. package语句package语句作为Java源文件的第一条语句,指明该文件中定义的类所在的包。(若缺省该语句,则指定为无名包)。它的格式为:
package <顶层包名>[.<子包名>]* ;
举例:pack\Test.java
package p1; //指定类Test属于包p1
public class Test{
public void display(){
System.out.println("in method display()");
}
}
包对应于文件系统的目录,package语句中,用‘ .’ 来指明包(目录)的层次;
包通常用小写单词,类名首字母通常大写。
54. import语句为使用定义在不同包中的Java类,需用import语句来引入所需要的类。Import语句告诉编译器到哪里去寻找类。
语法格式:
import 包名[.子包名…]. <类名 |*>
应用举例:
import p1.Test; //import p1.*;表示引入p1包中的所有类
public class TestPackage{
public static void main(String args[]){
Test t = new Test(); //Test类在p1包中定义
t.display();
}
}