5.面向对象基础篇
什么是对象
可以理解为是一个表格
//设计一个刀剑对象(表格)
package com.fan.Oop;
import org.w3c.dom.Attr;
public class Sword {
String name;
double Dmg;
public double Atk (double count) {
if (count < 0) {
return 0;
}
return (count * Dmg);
}
}
//对刀剑对象执行攻击操作 (可以用Scanner接收数据,这里为了省事就直接定义了刀剑的属性)
package com.fan.Oop;
public class Atk {
public static void main(String[] args) {
Sword sword1 = new Sword();
sword1.name = "尚方宝剑";
sword1.Dmg = 9;
System.out.println("本轮"+ sword1.name +"的攻击造成的伤害为:" + sword1.Atk(5));
Sword sword2 = new Sword();
sword2.name = "绣丸";
sword2.Dmg = 12;
System.out.println("本轮"+ sword2.name +"的攻击造成的伤害为:" + sword1.Atk(3));
}
}
对象的执行原理
- 类(clsss)存储在方法区
- main方法存储在栈内存
- 变量(图中的Student s1... 中的s1存储的是对象地址)存储在栈内存的main方法内
- 对象(表)存储在堆内存
- 执行流程为 栈内存(对象地址) --->堆内存【更新变量】(类地址)--->方法区【执行方法】
类与对象的注意事项
-
类中定义的变量称为成员变量(对象的属性),定义的方法称为成员方法(对象行为)
-
成员变量本身存在默认值,一般不用赋初始值
-
一个代码文件里面可以有多个class类,但只能用一个public修饰,且public修饰的类名必须是代码文件名
//该代码文件名为 Sword.java package com.fan.Oop; public class Sword {...} class bow{...} class spear{...} -
对象之间的数据具有独立性,但多变量指向同一个对象就破坏了这种独立性
Student s2 = s1; //意思是将s1中所存储的对象地址赋值给s2
此时我们调用或修改s2,将会访问与s1相同的对象以及类
-
如果某个对象的对象地址没有被存储在任何该类的变量中(且没有变量去引用它),该对象就会成为“垃圾对象”
会被Java的回收机制处理掉
This关键字
是什么
是一个变量,用在方法中,用来获取当前对象(的对象地址)
应用场景
用来解决对象的成员变量与方法内部变量名称一致时,导致访问冲突问题
package com.fan.Oop.thisDemo;
public class Test {
public static void main(String[] args) {
Student s1 = new Student();
s1.score = 701;
s1.Pass(700);
}
}
package com.fan.Oop.thisDemo;
public class Student {
double score;
public void Pass(double score) {
if (this.score > score){
System.out.println("过线!");
}else {
System.out.println("努力!");
}
}
}
构造器
构造器语法
public class 类名{
public 类名(){...}
}
构造器的应用
- 创建对象时,可以指定对象调用哪一个构造器执行
- 构造器常用于完成对象的初始化(常见于完成对象的成员变量的初始化赋值)
使用构造器的注意事项
- 类在设计时,如果不写构造器,java会为类自动生成一个无参构造器
- 一旦定义了有参构造器,java就不会自动为类生成无参构造器了,此时建议手写一个无参构造器,方便调用
封装
***** 面向对象的三大特征:封装、继承、 多态
什么是封装
用类设计对象处理某一个事物的数据时,应该把要处理的数据,以及处理这些数据的方法,设计到一个对象中去
封装的设计规范
合理隐藏(private)、合理暴露(public)
上图中的学生成绩score是暴露的(public)
任何人可以随便访问,随便赋值,危险!
上图对学生成绩score进行了隐藏(private)
只能通过对象中的方法赋值,进而我们可以在方法中对所赋值进行约束,避免有心人的恶意赋值,安全!
简而言之:成员变量一般选择隐藏,通过方法对成员变量进行赋值;
好处:安全!
实体JavaBean
实体类
- 特殊形式的类
- 成员变量全部私有(ptivate),有对应的getxxx,setxxx方法
- 有一个公共的无参构造器
应用场景
数据填表与数据处理分离
练习:简单电影系统
主程序:负责收集数据并交给表格对象,负责编写运行框架
import java.util.Scanner;
public class main {
public static void main(String[] args) {
//填表
Movies[] movies = new Movies[4];
movies[0] = new Movies(1, "水门桥", 38.9, 9.8, "徐克", "吴京", "12万人想看");
movies[1] = new Movies(2, "出拳吧", 39, 7.8, "唐晓白", "伍俩", "3.5万人想看");
movies[2] = new Movies(3, "月球陨落", 42, 7.9, "罗兰", "贝瑞", "17.9万人想看");
movies[3] = new Movies(4, "一点就到家", 35, 8.7, "许宏宇", "刘昊然", "10.8万人想看");
moviesOperator operator = new moviesOperator(movies);
//operator.showMovies();
//operator.showMOviesById(2);
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("查询电影请按1");
System.out.println("查询电影详情请按2");
int command = sc.nextInt();
switch (command) {
case 1:
operator.showMovies();
break;
case 2:
System.out.println("请输入电影Id:");
int id = sc.nextInt();
operator.showMOviesById(id);
break;
default:
System.out.println("???");
}
}
}
}
表格对象:负责整理来自主程序的数据,填入表格,并将填好的表格返回主程序(臆想,实际返回的是地址)
package com.fan.Oop.javaBean.Movies;
public class Movies {
private int id;
private String name;
private double price;
private double score;
private String director;
private String actor;
private String info;
public Movies() {
}
public Movies(int id, String name, double price, double score, String director, String actor, String info) {
this.id = id;
this.name = name;
this.price = price;
this.score = score;
this.director = director;
this.actor = actor;
this.info = info;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
public String getDirector() {
return director;
}
public void setDirector(String director) {
this.director = director;
}
public String getActor() {
return actor;
}
public void setActor(String actor) {
this.actor = actor;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
}
操作程序:接收主程序的表格,并对表格数据进行处理(业务需求)
package com.fan.Oop.javaBean.Movies;
public class moviesOperator {
private Movies[] movies;
public moviesOperator(Movies[] movies){
this.movies = movies;
}
public void showMovies(){
System.out.println("所有电影简介如下:");
for (int i = 0; i < movies.length; i++) {
System.out.println("电影Id:" + movies[i].getId());
System.out.println("电影名称:" + movies[i].getName());
System.out.println("电影价格:" + movies[i].getPrice());
System.out.println("------------------------------");
}
}
public void showMOviesById(int id){
for (int i = 0; i < movies.length; i++) {
if (movies[i].getId() == id){
Movies m = movies[i];
System.out.println("该电影详情如下:");
System.out.println("电影Id:" + m.getId());
System.out.println("电影名称:" + m.getName());
System.out.println("电影价格:" + m.getPrice());
System.out.println("电影评分:" + m.getScore());
System.out.println("电影导演:" + m.getDirector());
System.out.println("电影主演:" + m.getActor());
System.out.println("其他:" + m.getInfo());
return;
}
}
System.out.println("没有该电影!");
}
}

浙公网安备 33010602011771号