面向对象(oop)
类与对象
类:共同特征的描述;
对象:真实存在的具体实例
tips:
-
类名首字母建议大写,满足”驼峰模式“,不能用关键字且必须是合法标识符且有意义
-
一个Java文件中可以定义多个class类,但只能一个类是public修饰,而且public修饰的类名必须成为代码文件名
-
成员变量的完整定义格式是:
修饰符 数据类型 变量名称 = 初始化值
public String name = ”小明“
一般无需指定初始化值(便于创建对象时修改成员变量),存在默认值
数据类型 细则 默认值 基本类型 byte、short、char、int、long 0 基本类型 float、double 0.0 基本类型 boolean false 引用类型 类、接口、数组、String null 注意:实际开发中,还是建议一个代码文件只定义一个类
public class 类名{
1. 成员变量(属性n)
2. 成员方法(行为v)
3. 构造器
4. 代码块
5. 内部类
}
举例如下:
public class Car{
//成员变量(属性)
String name;
double price;
public void start(){
}
public void run(){
}
}
如何得到类的对象:
类名 对象名 = new 构造器();
Car car = new Car();
如何使用对象
- 访问属性:对象名.成员变量
- 访问行为:对象名.方法名(…)
定义一个学生类:
public class Student {
String name;//定义学生的姓名
String id;//定义学生的学号
public void playBasketball(){
System.out.println(name+"正在打篮球");
}
public void study(){
System.out.println(name+"的学号是"+id+",现在正在学习");
}
}
public class StudentTest {
public static void main(String[] args) {
Student xiaoming = new Student();
xiaoming.name = "小明";
xiaoming.id = "12201";
System.out.println(xiaoming.name);
System.out.println(xiaoming.id);
xiaoming.playBasketball();
xiaoming.study();
}
}
运行结果如下:
小明
12201
小明正在打篮球
小明的学号是12201,现在正在学习
内存运行机制
-
new出来的对象存放在堆内存中
-
Student xiaoming = new Student();
xiaoming存储的是对象在堆内存中的地址
-
成员变量(name、id)的数据放在对象中,存在于堆内存中
Student xiaohong = xiaoming;
xiaohong.id = 12202//赋值赋的是地址值,地址值是指向堆内存中的变量,相当于把小明的学号修改了
实例:商品购物
public class ShopTest {
public static void main(String[] args) {
int id = 0;
Goods[] goods = new Goods[100];//定义一个商品类型的数组
while (true) {
System.out.println("请选择你需要进行的操作!");
System.out.println("添加商品:add");
System.out.println("查询商品:query");
System.out.println("修改商品:update");
System.out.println("结算商品:pay");
Scanner sc = new Scanner(System.in);
String command = sc.next();
switch (command) {
case "add":
add(goods, sc);
//添加
break;
case "query":
query(goods);
//查询
break;
case "update":
update(goods);
//修改
break;
case "pay":
pay(goods);
//结算
break;
default:
System.out.println("没有该功能!!!");
}
}
}
private static Goods getGoodsByID(Goods[] goods, Scanner sc) {
int id;
Goods g = new Goods();
System.out.println("请输入需要查询商品的编号!");
id = sc.nextInt();
for (int i = 0; i < goods.length; i++) {
if (goods[i] != null && goods[i].id == id) {
g = goods[i];
return g;
}
}
return null;
}
private static void pay(Goods[] goods) {
Goods g = new Goods();
double money = 0;
for (int i = 0; i < goods.length; i++) {
if (goods[i] != null) {
g = goods[i];
money += (g.price * g.buyNumber);
}
}
System.out.println("您购买所有商品总价为:" + money);
}
private static void update(Goods[] goods) {
Scanner sc = new Scanner(System.in);
while (true) {
Goods g = new Goods();
g = getGoodsByID(goods, sc);
if (g != null) {
System.out.println("请输入需要修改的价格!");
g.price = sc.nextDouble();
System.out.println("修改成功!!!");
break;
} else {
System.out.println("您输入的id有误!请重新输入!");
}
}
}
private static void query(Goods[] goods) {
Goods g = new Goods();
System.out.println("商品编号|" + "商品名称|" + "商品金额|" + "购买数量");
for (int i = 0; i < goods.length; i++) {
if (goods[i] != null) {
g = goods[i];
System.out.println("\t" + g.id + "\t" + g.name + "\t" + g.price + "\t" + g.buyNumber);
}
}
}
private static void add(Goods[] goods, Scanner sc) {
Goods g = new Goods();
System.out.println("请输入需要添加商品的编号");
g.id = sc.nextInt();
System.out.println("请输入需要添加的商品名称");
g.name = sc.next();
System.out.println("请输入需要添加的商品金额");
g.price = sc.nextDouble();
System.out.println("请输入需要添加的商品购买数量");
g.buyNumber = sc.nextInt();
for (int i = 0; i < goods.length; i++) {
if (goods[i] == null) {
goods[i] = g;
break;
}
}
System.out.println("*********" + g.name + "添加成功!!!" + "*********");
}
}
构造器
- 定义在类中的,可以用于初始化一个类的对象,并返回对象的地址。
构造器分类和作用
- 无参构造器(默认存在):初始化对象时,成员变量的数据均采用默认值。
- 有参数构造器:在初始化对象的时候,同时可以接收参数为对象进行赋值
tips:
- 任何类定义出来,默认自带了无参数构造器,写不写都有
- 但是定义了有参数构造器,那么无参数构造器就没有了,如果还想用无参数构造器,此时就需要自己手写一个无参数构造器。
this关键字
this可以出现在构造器和方法中,代表当前对象的地址
this关键字的作用:
- 可以用于指定访问当前对象的成员变量、成员方法
有参构造器中,填入name = name,将无法正确赋值。
解决方法调用this,代表当前对象的地址。
封装
- 面向对象三大特征:封装、继承、多态
- 封装:告诉我们,如何正确设计对象的属性和方法
- 封装的原则:对象代表什么,就得封装对应的数据,并提供数据对应的行为。
tips:如果有一个人的类,人需要画圆这个方法,可以将圆定义为一个新的类,圆这个类中调用画圆这个方法,这样人可以直接使用画圆这个方法,狗也可以。
面向对象中,画圆、关门这些都应该是圆和门自己封装的方法。
如何更好地进行封装?
- 一般建议对成员变量使用private(私有、隐藏)关键字修饰(private修饰的成员只能在当前类中访问)
- 为每个成员变量提供配套public修饰的getter、setter方法暴露其取值和赋值
JavaBean
JavaBean可以称为实体类,其对象可以用于在程序中封装数据。
标准JavaBean须满足如下书写要求:
- 成员变量使用private修饰
- 提供成员变量对象的setXxx()/getXxx()方法。
- 必须提供一个无参构造器;有参构造器是可写可不写的。
新建一个Student类:
public class Student {
//成员变量
private String name;//姓名
private int id;//学号id
private double score;//分数
public Student() {//无参构造器
}
public Student(String name, int id, double score) {//有参构造器
this.name = name;
this.id = id;
this.score = score;
}
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 double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
}
Test:
public class StudentTest {
public static void main(String[] args) {
Student xiaoming = new Student();
xiaoming.setName("小明");
xiaoming.setId(122201);
xiaoming.setScore(100);
System.out.println("小明的名字"+xiaoming.getName());
System.out.println("小明的学号"+xiaoming.getId());
System.out.println("小明的分数"+xiaoming.getScore());
Student xiaohong = new Student("小明",122202,98);
System.out.println("小红的名字"+xiaohong.getName());
System.out.println("小红的学号"+xiaohong.getId());
System.out.println("小红的分数"+xiaohong.getScore());
}
}
Movie类:
public class Movie {
private String name;
private String actor;
private double score;
private String country;
public Movie(String name, String actor, double score, String country) {
this.name = name;
this.actor = actor;
this.score = score;
this.country = country;
}
public Movie() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getActor() {
return actor;
}
public void setActor(String actor) {
this.actor = actor;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
}
Test:
public class MovieTest {
public static void main(String[] args) {
Movie [] m = new Movie[3];
m[0] = new Movie("大话西游","周星驰",9.1,"中国");
m[1] = new Movie("泰坦尼克号","小李子",8.8,"美国");
m[2] = new Movie("海贼王","路飞",9.0,"日本");
showMovie(m);
}
public static void showMovie(Movie [] m){
Movie n = new Movie();
for (int i = 0; i < m.length; i++) {
n = m[i];
System.out.println("电影名称为:" + n.getName());
System.out.println("电影主演为:" + n.getActor());
System.out.println("电影评分为:" + n.getScore());
System.out.println("电影国籍为:" + n.getCountry());
System.out.println("------------------------------");
}
}
}
8792

被折叠的 条评论
为什么被折叠?



