一、什么是面向对象编程(OOP)
面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)是一种编程思想,它将对象作为问题解决问题的基本元素,利用对象和对象之间的相互作用来设计程序。
面向对象思想把整个世界看成由各种对象来组成的。这些对象具有属性和行为(方法)。
面向对象思考问题的方式
1、首先考虑在问题域中设计到的对象有哪些
2、其次考虑这些对象有怎样的特征和功能
3、最后考虑对象和对象之间的关系
面向对象的设计思想----示例
五子棋:
面向对象:整个五子棋可以分为1、黑白双方,这两方的行为是完全一样的2、棋盘系统,负责绘制画面3、规则系统,负责判定诸如犯规、输赢等。
面向对象实例:
package oop;
public class Student {
String name; //姓名属性(成员变量)
int age; //年龄属性
double score; //成绩属性
public void study() {
System.out.println("姓名为" + name + ",年龄为" + age + "的学生正在学习...");
}
public void exam() {
System.out.println(name + "正在考试...");
}
}
package oop;
public class StudentTest {
public static void main(String[] args) {
Student stu = new Student();
stu.name = "小明";
stu.age = 20;
stu.score = 89.5;
stu.study();
stu.exam();
}
}
运行结果:
姓名为小明,年龄为20的学生正在学习...
小明正在考试...
二、类与对象
1、对象:用来描述客观事物的一个实体,由一组属性和行为构成
2、类:类是一个模板,它描述一类对象的行为和状态,是Java语言中最重要的“数据类型”
万物皆对象
对象的特征----属性
属性-对象具有的各种特征
比如有一个顾客对象,他有三个属性,分别是姓名(name)、年龄(age)和重量(weight)
行为-是对象执行的各种操作
比如有一个收银员对象,他有三种动作,分别是收银(cash)、打印账单(PrintBill)和刷卡(CreditCard),收银员的三个动作都是他的行为
对象的属性和行为:
列出小狗对象的属性和行为
属性:
颜色:白色(或者黄色等其他颜色) 品种:贵宾犬
行为:叫、跑、吃、睡
类是从对象中抽取出来的,比如说抽取出凯迪拉克、保时捷、玛莎拉蒂、在超市里买包的人、买酱油醋盐的人等等,以上解释对象,但我们可以从上面的对象中抽取出共同的特征及共同的属性和行为,一类是车类,另一类是顾客类
类是一个模板定义对象将会拥有的特征(属性)和行为(方法),类是对象的类型,但和int类型等不一样
类和对象的关系
类是抽象的概念,仅仅是模板,比如说:“人”
对象是一个你能够看的到、摸得着的具体实体也称为类的实例(instance)
三、类与对象的创建
定义类的语法:
[访问修饰符] class 类名{
//属性和方法的声明
}
eg:
public class Person {
String name;//姓名
boolean sex;//性别
int age; //年龄
public void speak(String word) {//说话
System.out.println(name + "说:" + word);
}
public void tread() {//行走
System.out.println("四处游走...");
}
}
类中成员变量的定义
1、定义成员变量的语法:
[访问修饰符] 数据类型 成员变量名 [=初始值];
2、成员变量的类型可以使用Java语言中的任何一种数据类型(包括基本类型和引用类型)。
3、在定义成员变量时可以对其进行初始化。如果不对其进行初始化,Java会使用默认的值对其进行初始化。
4、成员变量的作用域是整个类体。
局部变量和成员变量
类中方法的定义
定义方法的语法:
[访问修饰符] 返回值类型 方法名(参数类型 参数名1,...){
//方法的具体实现语句
}
对象的产生和使用
怎样根据设计好的类来创建一个对象?
利用new关键字调用类的构造方法(类的一种特殊方法)就可创建该类的一个对象。
构造方法
1、构造方法的名字和类名相同,并且没有返回值,不要加void
2、构造方法作用在于构造并初始化对象
3、每个类中都至少包含一个构造方法
两种构造方法
1、默认的构造方法
2、带参的构造方法
默认构造方法
1、默认构造方法就是指不带参数的构造方法。
2、Java的类都要求有构造方法,如果没有定义构造方法,Java编译器会为我们提供一个默认的无参构造方法
eg:
public class Person {
String name; //姓名
char sex; //性别
int age; //年龄
public void tread() {//行走
System.out.println("走走...");
}
public static void main(String[] args) {
Person person = new Person();//用new调用该类的默认构造方法来创建一个对象
person.tread();
}
}
3、如果类中有一个自己编写的构造方法时,编译器就不会为我们再提供那个默认的构造方法。
eg:
public class Person {
String name; //姓名
char sex; //性别
int age; //年龄
public Person(String name, char sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
public void tread() {//行走
System.out.println("随便走走...");
}
public static void main(String[] args) {
Person person = new Person("小明",'男',21);//用new调用该类的已有构造方法来创建一个对象
person.tread();
}
}
如果我们创建对象时,仍然使用默认的构造方法,则编译器会报错,我们必须使用自己编写的构造方法才可以通过编译。
四、方法重载
重载(Overloading)
public class Player{
public void play(歌曲){ //演唱歌曲 }
public void play(钢琴){ //弹奏钢琴 }
public void play(剧本){ //根据剧本表演 }
}
方法重载:同一个类中,方法名相同,参数列表不同(参数类型不同、参数个数不同、参数顺序不同)实例1:猫捉老鼠
package cat;
public class Cat {
String color;
public Cat() {
}
public Cat(String c) {
color = c;
}
public void catchMouse(Mouse mouse) {
System.out.println("一只" + color + "的猫抓住了" + mouse.color + "、" + mouse.size + "大的老鼠!");
}
}
package cat;
public class Mouse {
String color;
double size;
public Mouse() {
}
public Mouse(String c,double s) {
color = c;
size = s;
}
}
package cat;
public class Test {
public static void main(String[] args) {
Mouse mouse = new Mouse("白颜色",12.5);
Cat cat = new Cat("黑颜色");
cat.catchMouse(mouse);
}
}
运行结果:
一只黑颜色的猫抓住了白颜色、12.5大的老鼠!
实例2:在指定坐标点处画出规定的矩形
package draw;
/**
* 坐标点类
*/
public class Point {
double x;//x轴坐标
double y;//y轴坐标
public Point() {
}
public Point(double xPoint,double yPoint) {
x = xPoint;
y = yPoint;
}
}
package draw;
/**
* 矩形类
*/
public class Rectangle {
double len;//矩形的长
double width;//矩形的宽
public Rectangle() {
}
public Rectangle(double l, double w) {
len = l;
width = w;
}
}
package draw;
/**
* 画图类
*/
public class Drawing {
public static void drawRectange(Point point,Rectangle r) {
System.out.println("在坐标为("+point.x+","+point.y+")处画一个长为"+r.len+"宽为"+r.width+"的矩形...");
}
}
package draw;
public class Test {
public static void main(String[] args) {
Point p = new Point(3,1);
Rectangle r = new Rectangle(5,6);
Drawing.drawRectange(p, r);
}
}
运行结果:
在坐标为(3.0,1.0)处画一个长为5.0宽为6.0的矩形...
实例3:方法重载实例
package overloading;
public class Person {
String name;
int age;
char sex;
public Person() {
}
public Person(String n, int a) {
name = n;
age = a;
}
public Person(String n, int a, char s) {
name = n;
age = a;
sex = s;
}
public void say() {
System.out.println("我叫" + name + ",今年" + age + "岁了,性别:" + sex);
}
}
package overloading;
public class TestOverloading {
public static void main(String[] args) {
Person per = new Person();
per.say();
Person per2 = new Person("小青",20);
per2.say();
new Person("来福",52,'男').say();
}
}
运行结果:
我叫null,今年0岁了,性别:
我叫小青,今年20岁了,性别:
我叫来福,今年52岁了,性别:男
由实例3的结果可知,当我们没有给成员变量赋初值时,Java虚拟机就会使用默认值对其初始化。