一、面向对象语言编程
Java是一门面向对象的编程语言(OOP),万物皆对象
面向对象初步认识,在大多数编程语言中根据解决问题的思维方式不同分为两种编程语言
1、面向过程编程
2、面向对象编程
面向过程 | 面向对象 | |
---|---|---|
区别 | 事物比较简单,可以使用线性思维解决,具体每一个实现步骤清晰可见 | 事物比较复杂使用简单的线性思维无法解决,存在对象与对象之间的引用 |
共同点 | 1、都是为了解决实际问题的一种方式 2、当解决复杂问题时,面向对象是从宏观角度把握问题的整体,面向过程是从微观角度实现具体细节,两者之间相辅相成 | |
以 每天下楼吃饭为例:
面向过程: 面向对象
1、下楼找餐厅 1、下楼找餐厅
2、看菜品,并熟悉掌握你吃的每一道菜的 2、我要开吃了 (不关注具体菜的细节)
来源,制作流程,烹饪手法等具体细节 3、吃完了
3、吃这道菜
二、Java的面向对象编程
Java作为面向对象的语言,关于面向对象语言的核心概念
1、类和对象
类: 一类事物的抽象的模板,在现实世界中 类就是任意一类事物 ,在程序中类就是一个描述这类事物的类文件。
对象: 在这一类事物中,具体的某一个个体就是对象 ,在程序中对象就是new出来的有内存空间
2、类和对象的关系
类和对象的关系: 类是抽象的而对象是具体的, 对象是由类创建的实例(new出来的)
类的组成(人类):
类名: 给某一类事物取个名字: People
静态的特征称为属性: 姓名,年龄,身高,体重 (定义变量的语法)
动态的行为称为方法: 吃饭,睡觉,打豆豆 (方法的定义依然满足之前所学)
类的实现:
在一个类文件(People)中,定义属性和方法
对象的实现
通过类名创建这个类的对象。
注意 类名不能直接访问 它里面的属性和方法的,必须由类的对象访问
package com.j2008.init;
/**
* ClassName: People
* 创建一个People类 ,并定义这个类的属性(静态的特征)
* 和 这个类的方法(动态的行为)
*/
public class People {
// 定义姓名属性 数据类型 和属性名 = [初始值]
String name="张三";
// 定义性别属性
String sex="男";
// 定义身高属性
double height =1.75;
// 定义体重属性
double weight = 140;
/**
* 定义吃饭的行为(方法)
*/
public void eat(){
System.out.println("正在吃饭");
}
/**
* 定义睡觉方法
*/
public void sleep(){
System.out.println("正在睡觉");
}
/**
* 定义打豆豆方法
*/
public void playGame(){
System.out.println("正在打豆豆");
}
// 计算两个数相加
public int add(int a, int b){
return a+b;
}
}
public static void main(String[] args) {
// 不同通过People直接访问它 需要创建类的实例,也就是对象
// 创建对象的过程称为类的实例化
// 语法: 类名 对象名 = new 类名() ;
People people = new People();
// 这时候才可以通过对象名 访问这个对象具有的属性 和 方法
// 对象名.属性名
// 对象名.方法名([实参])
System.out.println("这个对象的属性name :"+ people.name);
System.out.println("这个对象的属性 sex :" + people.sex);
System.out.println("这个对象的属性 weight :"+ people.weight);
System.out.println("这个对象的属性height:"+ people.height);
// 调用对象的访问
people.eat();
people.sleep();
people.playGame();
int result = people.add(2,4);
System.out.println("这个对象还可以计算 结果:"+result);
}
在类中定义的属性,称为“成员属性” ,在类中定义的方法称为“成员方法”
3、面向对象的特征
面向对象的三大特征: 封装、继承、多态
封装: 将类中成员属性 私有化,并提供公有的访问属性的方法。 为了最大程度保护类中属性的隐蔽性(不被其他对象改变。)
继承: 用于定义类与类的关系的方式 ,一个类可以继承一个类。
多态: 在继承关系中,一个类的对象可能呈现不同的状态。
4、构造器(Construct):
定义: 在创建对象时被自动调用的特殊方法,也称为构造方法。 在一个类中除了包含属性,方法以外,还可以包含 构造器(构造方法)
每一个类都自带一个无参构造器,也可以在这个类中定义多个构造器,多个构造器之间称为“构造器重载”
语法:
访问修饰符 类名([参数列表]){
}
例如
public class Student{
//无参构造器
public Student (){
System.out.println("这是一个无参构造器");
}
}
构造器的作用:
1、用于创建对象自动调用 ,并可以给对象的属性赋初始值
public class Student{
String name;//对象的属性
//有参构造器
public Student (String name1){
name=name1;
}
//注意一个类中如果存在有参构造器,那么它的无参构造器被覆盖。
}
创建对象:
Student stu = new Student("张三");
//这里会自动调用有参构造器 并将“张三”赋值给name1,由于自动执行以上构造器,将name1的值赋值给name,这个name就是对象的属性
System.out.print(stu.name);//张三
类与类的关联关系 :
如果在一个类中引用另一个类,那么这两个类属于关联关系,
例如一个小明同学养了一条狗,如何通过面向对象的方式定义小明同学用于狗的关系
思路: 定义一个People类,其中name属性 ,
定义一个Dog类 包含dogName ,dogColor
将People类与Dog类关联关系 ,在People类中 创建Dog类的引用
public class People {
String name;
// 在People类中 建立 People对象与Dog对象的关系
Dog dog;
public People(String name){
this.name = name; // 将形参name 赋值给 当前对象的成员属性name
}
}
public class Dog {
// 由于以下属性 属于狗的特征,所以必须放在Dog类中,而不能放在People类
String dogName;
String dogColor;
/**
* 创建Dog对象时 初始化狗的基本属性
* @param dogName
* @param dogColor
*/
public Dog(String dogName ,String dogColor){
this.dogName = dogName;
this.dogColor = dogColor;
}
}
public static void main(String[] args) {
// 先创建一个小明同学
People people = new People("小明同学");
System.out.println("people.dog:"+people.dog);
// 再创建一个 Dog对象
Dog dog = new Dog("拉布拉多","灰白");
System.out.println("dog:"+dog);
//设置dog和people对象的关系
people.dog = dog;
System.out.println("people.dog:" +dog);
}
//结果:
people.dog:null
dog:com.j2008.construct.Dog@4554617c
people.dog:com.j2008.construct.Dog@4554617c
案例:玩一个小游戏(石头,剪刀,布),定义一个裁判类(Judger),属性包括裁判姓名,两个玩家对象,判断输赢的方法(赢的一方 加1分,输的一方减1分 平的不加不减。), 定义一个玩家类(Player),包含玩家姓名,积分,和出拳的行为(1:石头:2:剪刀:3:步,)并返回出拳值。 通过构造裁判对象时给玩家对象赋值
开始游戏: 创建1个裁判,2个玩家,分布玩10次,最后统计 玩家输赢和得分
public class Player {
String name;
int integral=0;
public Player(String name){
this.name=name;
}
//出拳的行为
public int hand(){
int hand=(int)(Math.random()*3+1);
switch (hand){
case 1:
hand=1;
break;
case 2:
hand=2;
break;
case 3:
hand=3;
}
return hand;
}
}