一、面向对象编程的理解
先写一个学生对象,也就是一个学生类,里面包括对象的属性以及一些功能。
public class student {
String name;
double chinese;
double math;
public void sum(){
System.out.println(name+"的总成绩是:"+(chinese+math));
}
public void average(){
System.out.println(name+"的平均成绩是:"+(chinese+math)/2.0);
}
}
另外新建一个test类,开发一个一个对象,把数据交给对象,在调用对象的方法来完成对数据的处理。
public class test {
public static void main(String[] args) {
//面向对象编程快速入门
//创建一个学生对象,封装波妞的数据
student s1=new student();
s1.name="波妞";
s1.chinese=100;
s1.math=100;
s1.sum();
s1.average();
//创建第二个学生的对象
student s2=new student();
s2.name="波仔";
s2.chinese=59;
s2.math=100;
s2.sum();
s2.average();
}
}
程序中的对象是什么?
- 对象本质上是一种特殊的数据结构
- class也就是类,也称为对象的设计图(或者对象的模板)
有了类就可以创建出对象: 类名 对象名=new 类名()
二、对象在计算机中的执行原理
- 每次new student(),就是在堆内存中开辟一块内存区域代表一个学生对象
- s1变量记住的是学生对象的地址。因此,s1也称为引用类型的变量
三、类和对象的一些注意事项
- 类名建议英文单词,首字母大写,满足驼峰式,有意义
- 类中定义的变量也称为成员变量(对象属性),类中定义的方法也称为成员方法(对象行为)
- 成员变量本身存在默认值,定义时不需要赋初始值。
- 一个代码文件中,可以写多个class类,但只能一个用public修饰,且public修饰的类名必须成为代码文件名
- 对象与对象之间的数据不会相互影响,但多个变量指向同一个对象时就会相互影响
- 如果某个对象没有一个变量引用它,则该对象无法被操作,成为垃圾对象。
四、面向对象的语法知识
1.this
- this就是一个变量,可以用在方法中,来拿到当前对象。
这里输出的this就是堆内存中对象的地址。
- this主要用来解决:变量名称冲突问题
public class student {
double score;
public void printPass(double score){
if(this.score>score){
System.out.println("恭喜");
}else{
System.out.println("落选了");
}
}
public class test {
public static void main(String[] args) {
student s1=new student();
s1.score=350;
s1.printPass(250);
}
}
2.构造器
2.1创建对象时,对象会去调用构造器。
构造器的名字要与类名相同。
public class Student {
//构造器,也可以重载 无参数构造器
public Student(){
System.out.println("无参数构造器");
}
//有参数构造器
public Student(String name,double score){
System.out.println("有参数构造器");
}
}
输出:无参数构造器
创建对象的时候,new student后面的()来选择用哪个构造器。选择了无参数构造器
public class test {
public static void main(String[] args) {
//认识构造器,掌握构造器的特点,应用场景,注意事项
Student s=new Student();
}
}
public class test {
public static void main(String[] args) {
//认识构造器,掌握构造器的特点,应用场景,注意事项
//Student s=new Student();
Student s=new Student("波仔",99);
}
}
输出:有参数构造器
2.2构造器的应用:创建对象时,完成对象成员变量的初始化赋值。
public class Student {
String name;
double score;
//构造器,也可以重载 无参数构造器
public Student(){
System.out.println("无参数构造器");
}
//有参数构造器
public Student(String name,double score){
System.out.println("有参数构造器");
this.name=name;
this.score=score;
}
}
public class test {
public static void main(String[] args) {
//认识构造器,掌握构造器的特点,应用场景,注意事项
//Student s=new Student();
Student s=new Student("波仔",99);
System.out.println(s.name);
System.out.println(s.score);
}
}
2.3构造器的注意事项
- 类在设计时,如果不写构造器,java是会为类自动生成一个无参构造器。
- 一旦定义了有参数构造器,java就不会帮我们的类自动生成无参构造器了,此时建议自己手写一个无参构造器
3.封装
3.1 什么是封装
- 用类设计对象处理某一个事物的数据时,应该把要处理的数据,以及处理这些数据的方法,设计到一个对象中去。
3.2 封装的设计规范
合理隐藏,合理暴露
public class Student {
private double score;
public void setScore(double score){
if(score>=0&&score<=100){
this.score=score;
}else{
System.out.println("数据非法");
}
}
public double getScore(){
return score;
}
public void printPass(){
System.out.println(score>60?"合格":"不及格");
}
}
将score设置为private,外部就无法访问,只能通过方法getscore和setscore来设置score的值和获得score的值,这样可以更加安全可靠。
public class test {
public static void main(String[] args) {
//掌握封装对象设计规范,合理隐藏,合理暴露
Student s=new Student();
s.setScore(99);
System.out.println(s.getScore());
}
}
4.实体JavaBean
4.1 什么是实体类
- 就是一种特殊形式的类:成员变量要私有,对外提供相应的getXX,setXX方法;类中必须有一个公共的无参的构造器。
- 就是保存某个事物的数据
public class Student {
//1.必须私有成员变量,提供每个成员变量get和set方法
private String name;
private double score;
//自动生成get和set方法。右键generate
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
//2、必须为类提供一个公开的无参数构造器(默认就有)
//右键generate生成一个有参构造器和无餐构造器
public Student() {
}
public Student(String name, double score) {
this.name = name;
this.score = score;
}
}
public class test {
public static void main(String[] args) {
//掌握实体类的书写要求,特点和应用场景
Student s1=new Student();
s1.setName("波妞");
s1.setScore(99);
System.out.println(s1.getName());
System.out.println(s1.getScore());
}
}
4.2 实体类应用场景
- 实体类只负责数据存取,而对数据的处理交给其他类来完成,以实现数据和数据业务处理相分离
学生对象模板:
public class Student {
//1.必须私有成员变量,提供每个成员变量get和set方法
private String name;
private double score;
//自动生成get和set方法。右键generate
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
//2、必须为类提供一个公开的无参数构造器(默认就有)
//右键generate生成一个有参构造器和无餐构造器
public Student() {
}
public Student(String name, double score) {
this.name = name;
this.score = score;
}
}
学生操作类,先将学生对象传过来,然后进行一个判断是否合格
public class StudentOperator {
private Student student;
public StudentOperator(Student student){
this.student=student;
}
public void printPass(){
if(student.getScore()>=60){
System.out.println(student.getName()+"合格");
}else{
System.out.println(student.getName() +
"不合格");
}
}
}
public class test {
public static void main(String[] args) {
//掌握实体类的书写要求,特点和应用场景
Student s1=new Student();
s1.setName("波妞");
s1.setScore(99);
System.out.println(s1.getName());
System.out.println(s1.getScore());
StudentOperator operator=new StudentOperator(s1);
operator.printPass();
}
}
5.面向对象编程综合案例
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
//1.设计一个电影类Movie
//2.设计一个电影操作类
//3.准备全部电影信息
Movie[] movies=new Movie[4];
Movie m1=new Movie(1,"水门桥",38.9,9.8,"徐克","吴京","12万人数想看");//创建第一个电影对象
Movie m2=new Movie(2,"出拳吧",39,7.8,"唐晓白","田雨","3.5万人数想看");
Movie m3=new Movie(3,"月球陨落",42,7.9,"罗兰","贝瑞","17.9万人数想看");
Movie m4=new Movie(4,"一点就到家",35,8.7,"徐宏宇","刘昊然","10.8万人数想看");
movies[0]=m1;
movies[1]=m2;
movies[2]=m3;
movies[3]=m4;
//4.创建一个电影操作类的对象,接收电影数据,对其进行业务处理
MovieOperator operator=new MovieOperator(movies);
// operator.printAllMovies();
// operator.searchMovieById(3);
Scanner sc=new Scanner(System.in);
while (true) {
System.out.println("电影操作系统===");
System.out.println("1.查询全部电影信息");
System.out.println("2.根据id查询某个电影详细信息");
System.out.println("请您输入操作命令:");
int command=sc.nextInt();
switch (command){
case 1:
operator.printAllMovies();
break;
case 2:
System.out.println("请您输入要查询的id");
int id=sc.nextInt();
operator.searchMovieById(id);
break;
default:
System.out.println("您输入的命令有问题");
}
}
}
}
public class Movie {
private int id;
private String name;
private double price;
private double score;
private String director;
private String actor;
private String info;
//右键,generete-get and set-全选 确定
//右键 generate-constructor-全选 -确定
//右键 generate-constuctor-select none
public Movie() {
}
public Movie(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;
}
}
public class MovieOperator {
private Movie[] movies;//定义数组
//定义有参构造器,把电影数组传递进来
public MovieOperator(Movie[] movies){
this.movies=movies;
}
/*写一个方法,展示系统全部电影信息*/
public void printAllMovies(){
System.out.println("系统全部电影信息如下------");
for (int i = 0; i < movies.length; i++) {
Movie m=movies[i];//定义电影类型的变量m来记电影对象的地址,
System.out.println("编号:"+m.getId());
System.out.println("名称:"+m.getName());
System.out.println("价格:"+m.getPrice());
System.out.println("------------------------");
}
}
/*2.根据电影的编号查询电影详细信息展示*/
public void searchMovieById(int id){
for (int i = 0; i < movies.length ; i++) {
Movie m=movies[i];
if(m.getId()==id){
System.out.println("电影详情:");
System.out.println("编号:"+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("没有该电影信息");
}
}
6.成员变量、局部变量的区别
- 类中位置不同,成员变量(类中,方法外),局部变量(常见于方法中)
- 成员变量(有默认值,不需要初始化),局部变量(没有默认值,需要赋值)
- 内存位置不同,成员变量(存在于堆内存),局部变量(栈内存)
- 作用域不同,成员变量(整个对象),局部变量(所属大括号)
- 生命周期不同,成员变量(与对象同生共死),局部变量(方法调用生,方法结束亡)
五、总结