面向对象
一、面向对象简介
1.面向对象是什么
OOP: Object Oriented Programming
面向对象是一种程序的设计范型,是一种思想,使用类
和对象
的概念进行程序设计
一切皆对象,世间万物都是对象
2.两个概念
2.1类
类是具有相同特征和行为的一组对象的抽象
类是一个抽象的概念,没有具体的事务与之对应,如人类、动物
2.2对象
对象是类的实例
对象是某一个具体的事物,如这个学生、这只狗
3.产生
二、类的使用
1.定义类
语法:
class 类名
{
属性;
方法;
}
类:
- 一个类就是一个数据类型,定义一个类其实就是创建了一个数据类型
- 类名使用帕斯卡命名法,即所有单词首字母大写
- 一个文件中可以定义多个类,但只能有一个public修饰的类,且此类的名称必须与文件名相同
- 实际开发中都是一个类对应一个文件,不允许在一个文件中定义多个类
属性:
- 类的特征
- 定义方式:
数据类型 属性名;
- 属性名使用驼峰命名法,即第一个单词首字母小写,其他单词首字母大写
方法:
- 类的行为
- 定义方法:
public 返回值类型 方法名(参数) {方法体}
- 方法名使用驼峰命名法,且一般多使用动词
public class Car {
//属性(特征)
String name;
String color;
String direction;
int speed;
double price;
// 方法(行为)
public void run() {
System.out.println(name+"正在以"+speed+"的时速向"+direction+"行驶");
}
}
2.创建对象
语法:
//方式1
类名 对象名=new 类名();
//方式2
类名 对象名;
对象名=new 类名();
3.访问对象
访问对象的属性:对象名.属性名
访问对象的方法:对象名.方法名();
/*
* 使用面向对象记录车辆信息
*/
Car car1 = new Car();// 创建一个Car对象
car1.name = "奔驰";// 为属性赋值
car1.color = "黑";
car1.direction = "北";
car1.speed = 119;
car1.price = 96.3;
Car car2;// 创建一个Car对象的引用
car2 = new Car();//创建Car对象,car2指向此对象
car2.name = "北京现代";// 为属性赋值
car2.color = "白";
car2.direction = "西";
car2.speed = 89;
car2.price = 45.3;
System.out.println(car1.name);
System.out.println(car2.direction);
car1.run();//调用对象的方法
car2.run();
三、this关键字
1.全局变量和局部变量
全局变量:
- 在类中定义的变量,称为全局变量,也就是属性
- 在整个类中都可以使用
- 有默认值,可以直接使用
局部变量:
- 除全局变量以外的其他变量,称为局部变量,如在方法或代码块中定义的变量
- 只能在局部访问
- 没有默认值,必须先赋值才可以使用
- 局部变量和全局变量同名,局部变量优先级更高,即默认访问的是局部变量
可以使用this关键字解决局部变量和全局变量同名的问题
2.this用法
this表示当前类的一个对象
- 只能在类的方法中使用,表示方法的调用者,即调用该方法的对象
- 当局部变量和全局变量同名时,可以使用
this.
来访问全局变量 - 当局部变量和全局变量不同名时,可以省略不写
this.
public static void main(String[] args) {
Account account = new Account();
//account.queryMoney();
Account account1 = new Account();
account1.name = "张三";
account1.getMoney(); // 此时this代表的是account1对象
System.out.println();
Account account2 = new Account();
account2.name = "李四";
account2.getMoney();// 此时this代表的是account2对象
}
}
/*
* 账户类
*/
class Account {
/*
* 全局变量
*/
String name = "tom";// 有默认值
double money;
// 查询余额
public void queryMoney() {
System.out.println("姓名:" + name + " " + "余额:" + money);
}
// 存钱
public void saveMoney(double money) {// 形参也是局部变量
this.money += money;
}
// 取钱
public void getMoney() {
int a = 5;// 局部变量
System.out.println(a);
// int b;
// System.out.println(b);
String name = "alice";// 局部变量
System.out.println("局部变量name" +" "+ name);// 局部变量优先级更高
System.out.println("全局变量name" + " "+this.name);
System.out.println(money);// 当局部变量和全局变量不同名时,可以省略this.
}
四、static关键字
static 表示静态的,可以修饰变量和方法,分别称为静态变量和静态方法
1.静态变量
使用static修饰的变量,称之为静态变量 或 类变量(非static修饰的变量称为实例变量)
静态变量为类的所有对象所共有,属于整个类
访问方式:对象名.属性名
或类名.属性名
(推荐)
2.静态方法
使用static修饰的方法,称之为静态方法 或 类方法(非static修饰的方法称为实例方法)
访问方式:对象名.方法名
或类名.方法名
(推荐)
静态方法中只能访问静态变量或静态方法,不能访问实例变量和实例方法
Cannot make a static reference to the non-static method
变量分类:
- 从作用域上划分:全局变量、局部变量
- 从变量所属上划分:实例变量、类变量
public static void main(String[] args) {
Student stu1 = new Student();
stu1.name = "tom";
System.out.println(stu1.name);
// stu1.hobby="吃饭";
Student.hobby = "睡觉";// 推荐
// System.out.println(stu1.hobby);
Student stu2 = new Student();
stu2.name = "jack";
Student.hobby = "编程";
System.out.println(stu2.name);
System.out.println(stu1.hobby);
stu1.show();
// stu2.print();
Student.print();// 推荐
}
}
/*
* 学生类
*/
class Student {
String name;// 实例变量
static String hobby;// 静态变量(类变量)
// 实例方法
public void show() {
System.out.println("实例方法show");
System.out.println("姓名:" + name);
System.out.println("爱好:" + hobby);// 实例方法中可以访问静态变量
}
// 静态方法
public static void print() {
System.out.println("静态方法print");
// System.out.println("姓名:"+name);//静态方法中不能访问实例变量
System.out.println("爱好:" + hobby);
// show();//静态方法中不能访问实例方法
}
五、方法重载
一个类中包含两个或两个以上同名的方法,其参数不同,称为方法重载overload
- 在同一个类中
- 方法名相同
- 参数列表不同(参数个数、类型、顺序至少有一项不同),即方法签名不同
- 与方法修饰符、返回值类型、形参名无关
作用:提供同一种功能的多种实现方式,根据调用者传递的参数来决定采用哪一种方式
public static void main(String[] args) {
Calculator c = new Calculator();
// 调用时会根据传递的参数的不同调用相应的重载方法
System.out.println(c.sum(3, 5));
System.out.println(c.sum2(3, 5, 2));
System.out.println(c.sum(3, 5.8));
System.out.println(c.sum(5.8, 3));
}
}
/*
* 计算器类
*/
class Calculator {
/*
* 方法重载
*/
public int sum(int num1, int num2) {
return num1 + num2;
}
public int sum2(int num1, int num2, int num3) {
return num1 + num2 + num3;
}
public double sum(int num1, double num2) {
return num1 + num2;
}
public double sum(double num1, int num2) {
return num1 + num2;
}
对象数组:
package code07_面向对象;
import java.util.Scanner;
public class 练习_对象数组 {
public static void main(String[] args) {
String[] names = new String[3];
Car[] cars = new Car[3];
inputInfo(cars);
displayInfo(cars);
}
/*
* 录入车辆信息
*/
public static void inputInfo(Car[] cars) {
Scanner input = new Scanner(System.in);
for (int i = 0; i < cars.length; i++) {
cars[i] = new Car();
System.out.println("----------请输入第" + (i + 1) + "辆车的信息---------------");
System.out.print("请输入车的名称");
cars[i].name = input.next();
System.out.print("请输入车的颜色");
cars[i].color = input.next();
System.out.print("请输入车的方向");
cars[i].direction = input.next();
System.out.print("请输入车的时速");
cars[i].speed = input.nextInt();
System.out.print("请输入车的价格");
cars[i].price = input.nextDouble();
}
}
/*
* 显示车辆信息
*/
public static void displayInfo(Car[] cars) {
System.out.println("名称\t颜色\t方向\t时速\t价格");
System.out.println("---------------------------------da---");
for (Car car : cars) {
System.out.println(car.name + "\t" + car.color + "\t" + car.direction + "\t" + car.speed + "\t" + car.price);
}
}
}