面向对象编程
面向对象Object Oriented Programming(OOP)与面向过程procedure oriented programming(POP):
➢ 二者都是一种思想,面向对象是相对于面向过程而言的。面向过程,强调的是功能行为。面向对象,将功能封装进对象,强调具备了功能的对象。
➢ 面向对象更加强调运用人类在日常的思维逻辑中采用的思想方法与原则,如抽 象、分类、继承、聚合、多态等。
面向对象的三大特征 :封装 (Encapsulation) 、继承 (Inheritance) 、多态 (Polymorphism)。
Java代码是由诸多不同功能的类(class)组成,类包含:
- 属 性:对应类中的成员变量
- 行 为:对应类中的成员方法
Field = 属性 = 成员变量,Method = (成员)方法
面向对象程序设计的重点是类的设计
定义类其实是定义类中的成员(成员变量和成员方法)
类的语法格式
修饰符 class 类名 {
属性声明; 方法声明;
}
修饰符public:类可以被任意访问
类的正文要用{ }括起来
举例:
public class Person{
public int age ; //声明公有变量 age
public void showAge() { //声明方法showAge( )
System.out.println(age);
}
}
创建Java自定义类
步骤: 1. 定义类(考虑修饰符、类名)
- 编写类的属性(考虑修饰符、属性类型、属性名、初始化值)
- 编写类的方法(考虑修饰符、返回值类型、方法名、形参等)
练习: 定义Person、Animal等类,加以体会。
对象的创建和使用
Java类和类的成员,通过Java类的实例化来使用,即创建类的对象
- 使用new + 构造器创建一个新的对象;
- 使用“对象名.对象成员"的方式访问对象成员(包括属性和方法);
//在方法体外,类体内声明的变量成为成员变量;在方法体内部声明的变量成为局部变量。
区分
成员变量:
- 定义在类中,在整个类里可以被访问;
- 可以分为类成员变量和实例成员变量,实例变量存在于对象所在的堆内存里;
- 有默认初始化值;
- 可以根据需要选择一个权限修饰符;
局部变量:
- 定义在局部范围内,方法内,代码块内等;
- 存在于栈内存里; 作用的范围结束,变量空间会自动释放;
3.没有默认初始化,每次必须显示初始化; - 声明时不指定权限修饰符;
方法
修饰符 返回值类型 方法名(参数列表){
... ...
}
//return语句传递返回值,void没有返回值
练 习 1
编写教师类和学生类,并通过测试类创建对象进行测试
学生类 属性: 姓名 年龄 参加的课程 兴趣 方法: 显示学生的个人信息
教师类 属性: 姓名 专业 教授的课程 教龄 方法: 显示教师的个人信息
已完成,代码放在最后
方法:是类或者对象行为特征的抽象。Java里方法不能独立存在,所有的方法必须定义在类里。方法只有被调用才会执行。
定义方法时,方法的结果应该返回给调用者,交由调用者处理;
方法中只能调用方法,不可以在方法内部定义方法。
当一个对象被创建时,会对其中各种类型的成员变量自动进行初始化赋值。除了基本数据类型之外的变量类型都是引用类型,引用类型的默认初始值是null。
匿名对象
如果一个对象只需要调用一次,就可以不定义对象的句柄,直接调用这个对象的方法。
匿名对象可以作为实参传递给一个方法调用。
实参:调用方法时实际传递给函数形式参数的数据
形式参数:在方法被调用时,用于接收外部传入的数据的变量
练 习 2
1.创建一个Person类,其定义如下:
要求:(1)创建Person类的对象,设置该对象的 name、age和sex属性,调用study方法,输出字 符串“studying”,调用showAge()方法显示age值, 调用addAge()方法给对象的age属性值增加2岁。 (2)创建第二个对象,执行上述操作,体会同一 个类的不同对象之间的关系。
2.利用面向对象的编程方法,设计类Circle计算圆的面积。
tips:
类的访问机制:
❖在一个类中的访问机制:类中的方法可以直接访问类中的成员变量。(例外: static方法访问非static的成员变量,编译不通过。)
❖在不同类中的访问机制:先创建要访问类的对象,再用对象访问类中定义的 成员。
方法的重载(overload)
在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同就可以。
与返回值类型无关,只看参数列表,参数列表必须不同。也就是说,参数个数或者参数类型不同。调用时,根据方法参数列表的不同来区别。
练习
与void show(int a,char b,double c){}构成重载的有:
a) void show(int x,char y,double z){} //no
b) int show(int a,double c,char b){} //yes顺序不同也是重载
c) void show(int a,double c,char b){} //yes顺序不同也是重载
d) boolean show(int c,char b){} //yes
e) void show(double c){} //yes
f) double show(int x,char y,double z){} //no
g) void show<u>s</u>(){double c} //no
2.编写程序,定义三个重载方法并调用。方法名为mOL。
➢三个方法分别接收一个int参数、两个int参数、一个字符串参数。分别执行平方运算并输出结果,相乘并输出结果,输出字符串信息。
➢在主类的main ()方法中分别用参数区别调用三个方法.
3.定义三个重载方法max(),第一个方法求两个int值中的最大值, 第二个方法求两个double值中的最大值,第三个方法求三个 double值中的最大值,并分别调用三个方法。
public class Student {
//姓名
//年龄
//参加的课程
//兴趣
//方法:
//显示学生的个人信息
public String name;
public int age;
public String course;
public String interest;
public void showInfo(){
System.out.println("姓名: "+ name);
System.out.println("年龄: "+ age);
System.out.println("参加的课程:"+ course);
System.out.println("兴趣:" + interest);
}
}
public class Teachers {
public String name;
public int age;
public String course;
public String interest;
public void showInfo() {
System.out.println("姓名: " + name);
System.out.println("年龄: " + age);
System.out.println("课程:" + course);
System.out.println("兴趣:" + interest);
}
}
public class Circle {
public double area(double r){
return r*r*3.14;
}
}
public class Test {
public static void main(String[] args){
//编写教师类和学生类,并通过测试类创建对象进行测试
Student student1 = new Student();
student1.name = "simon";
student1.age = 18;
student1.course = "java";
student1.interest = "java";
student1.showInfo();
System.out.println();
Teachers t =new Teachers();
t.name = "tom";
t.age = 36;
t.course = "php";
t.showInfo();
System.out.println();
Person p1 = new Person();
p1.name = "chole";
p1.age = 37;
p1.study();
p1.showAge();
p1.addAge();
//)创建第二个对象,执行上述操作,体会同一个类的不同对象之间的关系。
Person p2 = new Person();
p2.name = "lily";
p2.age = 22;
p2.study();
p2.showAge();
p2.addAge();
System.out.println();
//设计类Circle计算圆的面积
Circle c1 = new Circle();
// double r = c1.area(2);
System.out.println(c1.area(3));
Test mol = new Test();
mol.mOL(3);
mol.mOL(2, 4);
mol.mOL("hello,reload~");
mol.max(2,3);
mol.max(0.2,0.017);
mol.max(0.5,0.77,0.1);
}
//2.编写程序,定义三个重载方法并调用。方法名为mOL。
//三个方法分别接收一个int参数、两个int参数、一个字符串 参数。分别执行平方运算并输出结果,相乘并输出结果,输 出字符串信息。
//在主类的main ()方法中分别用参数区别调用三个方法。
public void mOL(int i){
System.out.println(i*i);
}
public void mOL(int i,int j){
System.out.println(i*j);
}
public void mOL(String i){
System.out.println(i);
}
//3.定义三个重载方法max(),第一个方法求两个int值中的最大值, 第二个方法求两个double值中的最大值,
//第三个方法求三个 double值中的最大值,并分别调用三个方法。
public void max(int x,int y){
if(x > y){
System.out.println("the max :"+x);
}else{
System.out.println("the max :"+y);
}
}
public void max(double x, double y) {
if (x > y) {
System.out.println("the max :" + x);
} else {
System.out.println("the max :" + y);
}
}
public void max(double x, double y,double z){
if(x > y){
if(x > z){
System.out.println("the max :" + x);
}else{
System.out.println("the max :" + z);
}
}else{
if(y > z){
System.out.println("the max :" + y);
}else{
System.out.println("the max :" + z);
}
}
}
}