第 3章 面向对象技术
3.1 类和对象
3.2 类的创建
3.3 对象的创建
3.4 类的封装
3.5 类的继承
3.6 类的多态性
3.7 递归方法
3.1 类和对象
引入:现实生活中的类和对象类,具有 相同性质 的个体的 集合。
对象,类中的某个个体。
属性与能力
JAVA中的类和对象类,用 [基本 ]数据类型定义(构造)的一种引用数据类型。
对象,类中的常量或变量。
成员变量,说明属性的数据。
成员方法,说明对属性(数据)进行的操作。
学生类
属性姓名性别出生日期,年月日班级成绩
能力回答姓名回答性别回答年龄回答班级回答成绩
3.2 类的创建
3.2.1 类的声明
3.2.2 类的主体
1,声明成员变量
2,声明成员方法
3,方法体
4,变量的作用范围
5,类与程序 例 3.1
public class Date1 //类声明
{
int year,month,day; //成员变量,表示年、月、日
void setdate(int y,int m,int d) //成员方法,设置日期值
{ //公有的,无返回值,有三个参数
year = y;
month = m;
day = d;
}
boolean isleapyear() //判断年份是否为闰年
{ //布尔型返回值,无参数
return (year%400==0) | (year%100!=0) & (year%4==0);
}
void print() //输出日期值,无返回值,无参数
{
System.out.println("date is "+year+'-'+month+'-'+day);
}
public static void main(String args[])
{
Date1 a = new Date1() ; //创建对象
a.setdate(2002,4,18); //调用类方法
a.print();
System.out.println(a.year+" is a leap year,"+a.isleapyear());
}
}
3.3 对象的创建
对象的生命期,创建 → 使用 → 销毁
3.3.1 对象的创建
1.声明 2.实例化 3.声明同时实例化
3.3.2 对象的使用
1.引用成员变量 2.调用成员方法 3.参数传递原则
3.3.3 对象的初始化
1.系统对变量的初始化 2.构造方法 3.例 3.2
3.3.4 对象的销毁,析构方法
public class Date2
{
int year,month,day;
Date2(int y,int m,int d) //类的构造方法,用于初始化成员变量
{
year = y;
month = m;
day = d;
}
boolean isleapyear()
{
return (year%400==0)| (year%100!=0) & (year%4==0);
}
void print()
{
System.out.println("date is "+year+'-'+month+'-'+day);
}
}
class Date2_ex //其他类
{
public static void main(String args[])
{
Date2 a = new Date2(2002,6,30) ; //创建对象的同时,初始化
a.print();
System.out.println(a.year+" is a leap year,"+a.isleapyear());
}
}
3.4 类的封装
3.4.1 封装的概念
3.4.2 如何封装
1,访问权限
2,设置类的访问权限
3,设置类成员的访问权限 例 3.3
3.4.3 实例成员和类成员公共设施,西工院的图书馆允许本院师生使用,
不允许外单位人员使用,
1.实例变量和类变量
2.实例方法和类方法 例 3.4
3.4.1 封装的概念
日常生活中的封装与权限
1 你家的钱,我不知道有多少,我不知道在哪儿放着 ;我暂时没钱,要买东西,就得向你借 ;我有钱了,要向你还,
2 学生成绩的管理,上课老师可输入并修改所带课班级的成绩 ;其它人只能查看,
3 党委会的决议我不知道 …
public class Date3 //类的封装
{
private int year,month,day; //成员变量,私有的
public Date3(int y,int m,int d)
{ year = y;
month = (((m>=1) & (m<=12))? m,1);
day = (((d>=1) & (d<=31))? d,1); }
public int getyear() //成员方法,公有的
{return year; }
public boolean isleapyear()
{ return (year%400==0) | (year%100!=0) & (year%4==0); }
public void print()
{ System.out.println("date is "+year+'-'+month+'-'+day); }
}
class Date3_ex //其他类
{
public static void main(String args[])
{
Date3 a = new Date3(2002,6,28) ;
a.print();
System.out.println(a.getyear()+" is a leap year,"+a.isleapyear());
}
}
public class Date4
{
private int year,month,day; //实例变量,私有的
static int count=0; //类变量
public Date4(int y,int m,int d)
{ year = y;
month = (((m>=1) & (m<=12))? m,1);
day = (((d>=1) & (d<=31))? d,1);
count++; }
public static void print_count() //类方法,只能访问类变量
{ System.out.print("count="+count+" "); }
public void print() //实例方法
{ //可以访问类变量和实例变量
print_count(); //调用类方法
System.out.println("date is "+year+'-'+month+'-'+day); }
public void finalize() //析构方法
{ count--; }
}
class Date4_ex //其他类
{
public static void main(String args[])
{
Date4 a = new Date4(1980,4,28) ;
a.print_count(); //通过对象调用类方法
a.print(); //通过对象调用实例方法
Date4 b = new Date4(1981,2,12) ;
b.print();
a.finalize(); //调用对象的析构方法
Date4.print_count(); //通过类名调用类方法
}
}
count=1 count=1 date is 1980-4-28
count=2 date is 1981-2-12
count=1
3.5 类的继承
引入:人 → 学生 → 大学生 → 西工院的大学生超类、子类与根类( Object)
3.5.1 创建子类
1,说明类的 超类
2,子类继承的 成员变量 例 3.5
3,子类继承的 成员方法 例 3.6
3.5.2 this,super和 instanceof 例 3.7
3.5.3 最终类和抽象类 例 3.8
继承成员变量
public class Person1
{
String name; //姓名
int age; //年龄
}
class Student1
{
String name; //姓名
int age; //年龄
String dept; //系别
}
public class Person2
{
String name; //姓名
int age; //年龄
}
class Student2 extends Person2
//Student2是 Person2类的子类
{
String dept; //系别
}
public class Person3
{
protected String name; //保护成员
protected int age;
void setdata(String n1,int a1)
{
name = n1;
age = a1;
}
public void print()
{
System.out.println(name+","+age);
}
}
class Student3 extends Person3
{
protected String dept;
public static void main(String args[])
{
Person3 p1 = new Person3();
p1.setdata("李大广 ",21) ;
p1.print();
Student3 s1 = new Student3() ;
s1.setdata("陈小瑞 ",19); //调用超类的成员方法
s1.dept="计算机系 "; //访问本类的成员变量
s1.print();
}
}
public class Person4
{
static int count=0;
protected String name;
protected int age;
public Person4(String n1,int a1) //构造方法
{
this.name = n1;
this.age = a1;
this.count++;
}
public int olderthen(Person4 b) //比较两个人的年龄
{
Person4 a = this; //指代对象本身,我
return a.age - b.age;
}
public void print()
{
System.out.print(this.getClass().getName()+" ");
System.out.print("count="+this.count+" ");
System.out.println(" "+this.name+","+this.age);
}
}
class Student4 extends Person4
{
protected String dept;
Student4(String n1,int a1,String d1) //不能继承超类的构造方法
{
super(n1,a1); //调用超类的构造方法
dept = d1;
}
public static void main(String args[])
{
Person4 p1 = new Person4("李大广 ",21);
p1.print();
Student4 s1 = new Student4("陈小瑞 ",19,"计算机系 ") ;
s1.print();
System.out.println("年龄差 = "+p1.olderthen(s1));
}
} Person4 count=1 李大广,21
Student4 count=2 陈小瑞,19
年龄差 = 2
表示日期的抽象类
public abstract class Date5
{
public abstract boolean isValid(int year,int
month,int day);
public abstract Date5 daysAfter(int days);
public abstract int between(Date5 d2);
}
花瓶?
风景?
3.6 类的多态性
3.6 类的多态性:
图片的多义性自然语言中的多义性
Java语言中的多义性
3.6.1 方法的重载,
重载的概念 例 3.9构造方法的重载
3.6.2 方法的覆盖 (变异 ):例 3.10
多态性与语言四大组成,语法、语义、语用与语境
public class Person5
{
static int count=0;
protected String name;
protected int age;
public Person5(String n1,int a1)
{
name = n1;
age = a1;
count++;
}
public Person5(String n1) //构造方法重载
{
this(n1,0); //调用本类的构造方法
}
public Person5(int a1) //构造方法重载
{
this("未知名 ",a1);
}
public Person5() //构造方法重载
{
this("未知名 ");
}
public void print()
{
System.out.print(this.getClass().getName()+" ");
System.out.print("count="+this.count+" ");
System.out.println("a person is "+name+","+age);
}
}
class Student5 extends Person5
{
protected String dept;
Student5(String n1,int a1,String d1)
{
super(n1,a1);
dept = d1;
}
Student5()
{
this("未知名 ",0,"未知系 ");
}
public static void main(String args[])
{
Person5 p1 = new Person5("王小明 ",21) ;
p1.print();
Person5 p2 = new Person5("朱小安 ") ;
p2.print();
Person5 p3 = new Person5(19) ;
p3.print();
Person5 p4 = new Person5() ;
p4.print();
Student5 s1 = new Student5("陈小瑞 ",19,"计算机系 ");
s1.print();
Student5 s2 = new Student5();
s2.print();
}
}
Person5 count=1 a person is 王小明,21
Person5 count=2 a person is 朱小安,0
Person5 count=3 a person is 未知名,19
Person5 count=4 a person is 未知名,0
Student5 count=5 a person is 陈小瑞,19
Student5 count=6 a person is 未知名,0
Java语言中的多义性
public class Poly
{
public static void main(String args[])
{
System.out.println(123 + 456);
System.out.println("123"+"456");
}
}
自然语言的多义性罗钧旻,
A、老师,
B、学生,
C、父亲,
D、儿子,
E、消费者,
F、教职工,……
public class Person6
{
static int count=0;
protected String name;
protected int age;
public Person6(String n1,int a1)
{
name = n1;
age = a1;
this.count++; //超类对象计数
}
public String toString()
{
return this.name+","+this.age;
}
public void print()
{
System.out.println("本类名 ="+this.getClass().getName()+" "+
"超类名 ="+this.getClass().getSuperclass().getName()+" ");
System.out.print("Person6.count="+this.count+" ");
System.out.print("Student6.count="+Student6.count+" ");
Object s1=this;
if (s1 instanceof Person6) //判断对象属于哪个类
System.out.println(s1.toString()+"是 Person6类对象。 ");
if (s1 instanceof Student6)
System.out.println(s1.toString()+"是 Student6类对象。 ");
}
}
class Student6 extends Person6
{
static int count=0; //隐藏了超类的 count
protected String dept;
protected Student6(String n1,int a1,String d1)
{
super(n1,a1); //调用超类的构造方法
dept = d1;
this.count++; //子类对象计数
}
public String toString() //覆盖超类的同名方法
{
return super.toString() +"," + dept; //调用超类的同名方法
}
public void print()
{
super.print(); //调用超类的方法
System.out.println("super.count = "+super.count); //引用超类变量
System.out.println("this.count = "+this.count);
}
public static void main(String args[])
{
Person6 p1 = new Person6("王小明 ",21) ;
p1.print();
Student6 s1 = new Student6("陈小瑞 ",19,"计算机系 ");
s1.print();
}
}
Student6运行结果本类名 =Person6 超类名 =java.lang.Object
Person6.count=1 Student6.count=0 王小明,21是 Person6类对象。
本类名 =Student6 超类名 =Person6
Person6.count=2 Student6.count=1 陈小瑞,19,计算机系是 Person6类对象。
陈小瑞,19,计算机系是 Student6类对象。
super.count = 2
this.count = 1
3.7 递归方法
递归的概念,
日常生活中的递归:对视或照镜子老和尚讲故事:他说从前有座山,山上有座庙,
庙里有个老和尚在讲故事,他说从前有座山,
山上有座庙,庙里有个老和尚在讲故事,..,。
递归方法,在方法的定义中又有方法的调用。
例 3.11 求 f(n)=n!
例 3.12 求 Fibonacci序列。
例 3.13 无返回值的递归方法。
例 3.14 打印数字塔。
例 3.11 求 f(n)=n!
f(n)=n! =n*(n-1)*(n-2)*… *2*1=n*(n-1)!=n*f(n-1)
1 n=0 递归终止条件
f(n)=
n*f(n-1) n>0 递归形式
{
public class Nmul
{
static int f(int n) //递归方法
{
if (n==0)
return 1;
else
{
System.out.println(n+"!="+n+"*"+(n-1)+"!");
return n*f(n-1);
}
}
public static void main(String args[])
{
int i=5;
if (args.length>0)
i = Integer.parseInt(args[0]); //将 args[0]转化为 int值
System.out.println(i+"!="+f(i));
}
}
6!=6*5!
5!=5*4!
4!=4*3!
3!=3*2!
2!=2*1!
1!=1*0!
6!=720
java Nmul 6
例 3.12 求 Fibonacci序列。
0 n=0
fib(n)= 1 n=1
fib(n-1)+fib(n-2) n>1
{
public class Fib_d
{
static int fib(int n) //递归方法
{
if ((n==0) || (n==1))
return n;
else
return fib(n-2)+fib(n-1);
}
public static void main(String args[])
{
int i;
for (i=0;i<=20;i++)
System.out.print(" "+fib(i));
System.out.println();
}
}
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
例 3.13 无返回值的递归方法
public class Count
{
static void count(int n) //递归方法
{
if (n<10) count(n+1);
System.out.print(" "+n);
}
public static void main(String args[])
{
count(1);
System.out.println();
}
}
10 9 8 7 6 5 4 3 2 1
public class Dig9_d
{
final static int M=9;
static void count(int n,int k) //递归方法
{
int i;
if (n==1) //在 1前留空
for (i=1;i<=M-k;i++)
System.out.print(" ");
System.out.print(" "+n);
if (n<k)
{
count(n+1,k);
System.out.print(" "+n);
}
}
public static void main(String args[])
{
int i;
for (i=1;i<=M;i++)
{
count(1,i);
System.out.println();
}
}
}
数字塔
1
1 2 1
1 2 3 2 1
1 2 3 4 3 2 1
1 2 3 4 5 4 3 2 1
1 2 3 4 5 6 5 4 3 2 1
1 2 3 4 5 6 7 6 5 4 3 2 1
1 2 3 4 5 6 7 8 7 6 5 4 3 2 1
1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 1