请注意,本文编写于 359 天前,最后修改于 359 天前,其中某些信息可能已经过时。
课上内容
1.面向对象
面向对象是java的核心思想,万物皆对象.任何事物都可以定义成java中的对象
类:
类是对现实事物中一类具有共同属性和共同行为的事物的描述.
属性:
属性就是一些名词,java中把属性叫成员变量
行为:
行为就是一些动词,java中把行为叫做成员方法
对象:
对象是类的具体体现,一个类中有多个对象.
2.类的定义和对象创建
定义类:
public class 类名{
成员变量
成员方法
}
创建对象:
类名 对象名 = new 类名();
代码演示:
//学生类
public class Student {
//成员变量
String id; //学号
String name; //姓名
int age; //年龄
//成员方法
//吃饭
public void eat(){
System.out.println("学生爱干饭!!");
}
//学习
public void study(){
System.out.println("学生爱学习!!");
}
}
public class Demo06 {
public static void main(String[] args) {
//创建学生对象
Student s = new Student();
//变量赋值
s.id = "A001";
s.name = "石原里美";
s.age = 19;
//打印学生的成员变量
System.out.println(s.id +" " + s.name + " " + s.age );
//调用成员方法
s.eat();
s.study();
}
}
3.类的区别
测试类:
有main方法
所有方法目前都要加static
实体类:
没有main方法
所有方法目前都不加static
4.内存图
4.1一个对象的内存图
4.2两个对象的内存图
4.3两个变量一个对象的内存图
4.4打印对象的效果问题
//写toString()方法,这个方法在输出对象的时候会被默认调用
//这个方法也不用我们写,idea可以生成
//快捷键: alt + insert (+ fn) ---> toString()
@Override
public String toString() {
return "Student{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", age=" + age +
'}';
//在输出语句输出对象名的时候,系统会自动调用toString
System.out.println(s);
5.成员变量和局部变量的区别
定义位置不同:
成员变量是定义在类中方法外的
局部变量是定义在方法内或方法上
成员变量和局部变量的区别就是定义位置的区别,和数据类型无关!!!
内存中位置不同:
成员变量加载到堆内存中
局部变量加载到栈内存中
生命周期不同:
成员变量随着对象的创建而存在的,随着对象的消失而消失的.(对象的消失叫垃圾回收机制)
局部变量随着方法的调用而存在的,随着方法的结束而消失的.
初始值(默认值)不同:
成员变量有默认值
整数 0
小数 0.0
字符 空字符
布尔 false
引用类型 null
局部变量没有默认值
6.封装
private 私有的
他可以用来修饰成员变量和成员方法
使用private修饰之后,这个成员就相当于被封装了起来
private修饰的成员是私有成员,只能在本类中使用,不能被其他类中直接使用
set/get
set: 给成员变量设置值
get: 获取成员变量的值
封装的好处是什么呀?
提高了安全性.
7.this
作用:
1.this表示调用方法的对象,this表示本类的对象
2.this用来区分成员变量和局部变量(在成员变量和局部变量重名时)
8.构造方法
格式:
public 类名(){
}
特点:
1.构造方法的名字和类名一致
2.构造方法没有返回值类型
3.构造方法也可以重载,也可以写return
作用:
构造方法的作用是创建对象并且可以在创建对象的时候给成员变量赋值
创建对象new的时候就是在调用类的构造方法
注意事项:
1.如果一个类中不写构造方法,那么系统会默认提供一个空参构造
2.如果手动写了构造方法,系统就不会再默认提供了
3.初期:如果要不写就一个也不写,如果要写就写两个
9.标准类制作
package com.itheima03
//学生类
public class Student {
//成员变量
private String id;
private String name;
private int age;
//构造方法
public Student() {
}
public Student(String id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
//set get
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//toString
@Override
public String toString() {
return "Student{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", age=" + age +
'}';
}
//其他成员方法
//吃饭
public void eat(String food){
// 马冬梅爱吃羊肉
// 秋雅爱吃螺蛳粉
System.out.println(name + "爱吃" + food);
}
//学习
public void study(){
System.out.println("学生爱学习!!");
}
}
package com.itheima03;
public class Demo01 {
public static void main(String[] args) {
//创建对象空参构造
Student s1 = new Student();
s1.setId("A001");
s1.setName("马冬梅");
s1.setAge(23);
System.out.println(s1);
//吃饭
s1.eat("羊肉");
//创建对象有参构造
Student s2 = new Student("A002","秋雅",23);
System.out.println(s2);
//吃饭
s2.eat("螺蛳粉");
}
}
课后练习
面向对象
题目1(训练)
定义手机类,手机有品牌(brand),价格(price)和颜色(color)三个属性,有打电话call()和sendMessage()两个功能。
请定义出手机类,类中要有空参、有参构造方法,set/get方法。
定义测试类,在主方法中使用空参构造创建对象,使用set方法赋值。
调用对象的两个功能,打印效果如下:
正在使用价格为3998元黑色的小米手机打电话....
正在使用价格为3998元黑色的小米手机发短信....
训练提示
- 类中的属性就是成员变量,类中的行为功能就是成员方法。
- 成员变量要被private修饰。
解题方案
操作步骤
- 定义手机类,手机类中定义String类型的品牌,int类型的价格,String类型的颜色,三个成员变量都用privice修饰。
- 提供空参构造方法和有参构造方法。
- 提供set/get方法。
- 编写打电话的成员方法,方法中对成员变量进行使用。
- 编写发短信的成员方法,方法中对成员变量进行使用。
- 在测试类中创建手机对象,使用set方法赋值,分别调用各个方法。
参考答案
手机类:
public class Phone {
//定义品牌
private String brand;
//定义价格
private int price;
//定义颜色
private String color;
//提供空参构造
public Phone() {
}
//提供有参构造
public Phone(String brand, int price, String color) {
this.brand = brand;
this.price = price;
this.color = color;
}
//提供set/get方法
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public double getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
//定义打电话方法
public void call(){
System.out.println("正在使用价格为"+price+"元"+color+"的"+brand+"手机打电话....");
}
//定义发短信方法
public void sendMessage(){
System.out.println("正在使用价格为"+price+"元"+color+"的"+brand+"手机发短信....");
}
}
测试类:
public class Demo1 {
public static void main(String[] args) {
//创建手机对象
Phone p = new Phone();
//调用set方法赋值
p.setBrand("小米");
p.setPrice(3998);
p.setColor("黑色");
//调用打电话功能
p.call();
//调用发短信功能
p.sendMessage();
}
}
题目2(训练)
定义一个女朋友类。女朋友的属性包含:姓名,身高,体重。行为包含:洗衣服wash(),做饭cook()。另外定义一个用于展示三个属性值的show()方法。请在测试类中通过有参构造方法创建对象并赋值,然后分别调用展示方法、洗衣服方法和做饭方法。打印效果如下:
我女朋友叫凤姐,身高155.0厘米,体重130.0斤
女朋友帮我洗衣服
女朋友给我做饭
训练提示
- 类中的属性就是成员变量,类中的行为功能就是成员方法。
- 成员变量要被private修饰。
- 展示方法的作用就是打印姓名、身高、体重三个成员变量的值。
解题方案
操作步骤
- 定义女朋友类,定义String类型姓名,double类型身高和double类型体重三个成员变量,三个成员变量都用privice修饰。
- 提供空参构造方法和有参构造方法。
- 提供set/get方法。
- 编写展示方法show(),方法打印三个成员变量的值。
- 编写洗衣服wash()方法,输出洗衣服的语句。
- 编写做饭cook()方法,输出做饭的语句。
- 在测试类中使用有参构造创建女友对象,分别调用各个方法。
参考答案
女朋友类:
public class Girlfriend {
//姓名
private String name;
//身高
private double height;
//体重
private double weight;
//空参构造
public Girlfriend() {
}
//有参构造
public Girlfriend(String name, double height, double weight) {
this.name = name;
this.height = height;
this.weight = weight;
}
//set/get方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
//展示方法
public void show(){
System.out.println("我女朋友叫" +name+",身高" +height+"厘米,体重"+weight+"斤");
}
//洗衣服方法
public void wash(){
System.out.println("女朋友帮我洗衣服");
}
//做饭方法
public void cook(){
System.out.println("女朋友给我做饭");
}
}
测试类:
public class Demo2 {
public static void main(String[] args) {
//创建女朋友对象
Girlfriend gf = new Girlfriend("凤姐",155,130);
//调用展示方法
gf.show();
//调用洗衣服方法
gf.wash();
//调用做饭方法
gf.cook();
}
}
题目3(训练)
定义项目经理类Manager。属性:姓名name,工号id,工资salary,奖金bonus。行为:工作work()
定义程序员类Coder。属性:姓名name,工号id,工资salary。行为:工作work()
要求:
1.按照以上要求定义Manager类和Coder类,属性要私有,生成空参、有参构造,set和get方法
2.定义测试类,在main方法中创建该类的对象并给属性赋值(set方法或有参构造方法)
3.调用成员方法,打印格式如下:
工号为123基本工资为15000奖金为6000的项目经理正在努力的做着管理工作,分配任务,检查员工提交上来的代码.....
工号为135基本工资为10000的程序员正在努力的写着代码......
训练提示
- 类中的属性就是成员变量,类中的行为功能就是成员方法。
- 成员变量要被private修饰。
- 在工作work()方法中调用成员变量,输出成员变量的值。
解题方案
操作步骤
- 定义项目经理类,定义成员变量,构造方法,set和get方法,work方法,方法中根据打印格式输出id,salary,bonus的值。
- 定义程序猿类,定义成员变量,构造方法,set和get方法,work方法,方法中根据打印格式输出id和salary的值。
- 在测试类中使用有参构造创建项目经理对象并赋值,调用工作方法打印结果。
- 在测试类中使用有参构造创建程序员对象并赋值,调用工作方法打印结果。
参考答案
经理类:
public class Manager {
private String name;
private int id;
private int salary;
private int bonus;
public Manager() {
}
public Manager(String name, int id, int salary, int bonus) {
this.name = name;
this.id = id;
this.salary = salary;
this.bonus = bonus;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
public int getBonus() {
return bonus;
}
public void setBonus(int bonus) {
this.bonus = bonus;
}
public void work(){
System.out.println("工号为"+id+"基本工资为"+salary+"奖金为"+bonus+"的项目经理正在努力的做着管理工作,分配任务,检查员工提交上来的代码.....");
}
}
程序员类:
package com.day07;
public class Coder {
private String name;
private int id;
private int salary;
public Coder() {
}
public Coder(String name, int id, int salary) {
this.name = name;
this.id = id;
this.salary = salary;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
public void work(){
System.out.println("工号为"+id+"基本工资为"+salary+"的程序员正在努力的写着代码......");
}
}
测试类:
public class Demo3 {
public static void main(String[] args) {
//创建经理对象
Manager m = new Manager("老王",123,15000,6000);
//调用工作方法
m.work();
//创建程序员对象
Coder c = new Coder("小王",135,10000);
//调用工作方法
c.work();
}
}