Java基础第3天总结(面向对象)
- 用面向对象的编程方式,存储学生信息,打印总成绩和平均成绩
package com.itheima.object; //把数据和对数据的处理放到一个类中去 public class Student {String name;double chinese;double math;public void printAllScore(){System.out.println(name + "的总成绩是:" + (chinese + math));}public void printAvgScore(){System.out.println(name + "的平均成绩是:" + ((chinese + math) / 2));} }
package com.itheima.object;public class Test2 {public static void main(String[] args) {Student s1 = new Student();s1.name = "张三";s1.chinese = 90;s1.math = 80;s1.printAllScore();s1.printAvgScore();} }
- 对象是啥?如何得到?
答:对象是一种特殊的数据结构。对象是用类new出来的,有了类就可以创建出对象。
public class 类名{
1、变量,用来说明对象可以处理什么数据
2、方法,描述对象有什么功能,也就是可以对数据进行什么样的处理
...
}
类名 对象名 = new 类名( );
万物皆对象,谁得数据谁存储。
- 类的基本语法--构造器
没有返回值类型声明,方法名必须与类名相同(这种特殊的方法称为构造器)
public class Student {/*构造器*/public Student(){...} }
- 对象创建时,我们可以指定对象去调用哪个构造器执行。
- 构造器常用于完成对象初始化(常见的应用场景是完成对象的成员变量的初始化赋值)
- 类默认就自带一个无参构造器
- 如果为类定义了有参构造器,类默认的无参数构造器就没有了,如果要用无参的,还要手写一个无参的
package com.itheima.object; //把数据和对数据的处理放到一个类中去 public class Student {String name;int age;char sex;public Student(){}public Student(String n){}public Student(String n,int a,char s){name = n;age = a;sex = s;} }
package com.itheima.object;public class Test2 {public static void main(String[] args) {Student s1 = new Student();Student s2 = new Student("张三", 18, '男');} }
- 类的基本语法--this
- this就是一个变量,可以用在方法中,用来拿到当前对象;哪个对象调用方法,this就指向哪个对象,也就是拿到哪个对象。
- this用来解决对象的成员变量与方法内部变量的名称一样时,导致访问冲突问题的。
package com.itheima.object; //把数据和对数据的处理放到一个类中去 public class Student {String name;public void print(){System.out.println(this);System.out.println(this.name);}public void printHobby(String name){System.out.println(this.name + "喜欢" + name);}}
package com.itheima.object;public class Test2 {public static void main(String[] args) {Student s1 = new Student();s1.name = "张三";s1.print();s1.printHobby("唱歌!");} }
运行结果:
com.itheima.object.Student@1b6d3586
张三
张三喜欢唱歌!
- 类的基本语法--封装
package com.itheima.object; //把数据和对数据的处理放到一个类中去 public class Student {String name;//1、如何隐藏:使用private关键字(私有、隐藏)修饰成员变量,//就只能在本类中被直接访问,其他任何地方不能直接访问private int age;//2、如何暴露(合理暴露):使用public修饰(公开)的get和set方法合理暴露//成员变量的取值和赋值public void setAge(int age) {if (age >= 0 && age <= 120) {this.age = age;} else {System.out.println("你输入的age有误");}}public int getAge() {return age;} }
package com.itheima.object;public class Test2 {public static void main(String[] args) {Student s1 = new Student();s1.setAge(19);System.out.println(s1.getAge());} }
- 合理隐藏,合理暴露。
- 公开成员,可以使用public(公开)进行修饰。
- 隐藏成员,使用private(私有,隐藏)进行修饰。
- 类的基本语法--javabean(实体类)
package com.itheima.object; //实体类 public class Student {//1、私有成员变量private String name;private double chinese;private double math;//写有参构造器了,就得提供无参的public Student() {}//提供一个有参数构造器(可选)public Student(String name, double chinese, double math) {this.name = name;this.chinese = chinese;this.math = math;}//2、提供公开的getter和setter方法public String getName() {return name;}public void setName(String name) {this.name = name;}public double getChinese() {return chinese;}public void setChinese(double chinese) {this.chinese = chinese;}public double getMath() {return math;}public void setMath(double math) {this.math = math;} }
package com.itheima.object;public class StudentOperator {private Student s;//用于记住将来要操作的学生对象。public StudentOperator(Student s){this.s = s;}//提供方法:打印学生对象的总成绩public void printTotalScore(){System.out.println(s.getName() + "的总成绩是:" + (s.getChinese() + s.getMath()));}//提供方法:;打印学生的平均成绩public void printAvgScore(){System.out.println(s.getName() + "的平均成绩是:" + (s.getChinese() + s.getMath()) / 2);} }
package com.itheima.object;public class Test2 {public static void main(String[] args) {//实体类的基本作用:创建它的对象,存取数据(封装数据)Student s = new Student("波仔", 100, 100);//创建一个学生的操作对象专门负责对学生对象的数据进行业务处理。StudentOperator operator = new StudentOperator(s);operator.printTotalScore();operator.printAvgScore();} }
- 什么是实体类?有啥特点?
- 答:成员变量必须私有,且要为他们提供get、set方法(鼠标右键->Generate->Getter and Setter ->按住shift键,点击最后一个,完成全选->点击ok就自动生成了);必须有无参数构造器。 特点:仅仅只是一个用来保存数据的java类,可以用它创建对象,保存某个事物的数据。
- 实现数据和数据的业务处理相分离。
- 自动生成有参构造器快捷键:鼠标右键->Generate->Constructor->按住shift键,点击最后一个,完成全选->点击ok就自动生成了
- 自动生成无参构造器快捷键:鼠标右键->Generate->Constructor->点击Select None就生成了
- 类的基本语法--static
package com.itheima.staticfield;public class Student {//静态变量:有static修饰,属于类,只加载一份,可以被类和类的全部对象共享访问static String name;//实例变量:没有static修饰,属于对象,每个对象都有一份int age; }
package com.itheima.staticfield;public class Test {public static void main(String[] args) {//1、类名.静态变量(推荐)Student.name = "袁华";System.out.println(Student.name);//袁华//2、对象名.静态变量(不推荐)Student s1 = new Student();s1.name = "马冬梅";Student s2 = new Student();s2.name = "秋雅";System.out.println(s1.name);//秋雅System.out.println(s2.name);//秋雅System.out.println(Student.name);//秋雅//因为静态变量是所有对象共享的,只有一份,所以只看最后修改成了什么就行//最后name变成了秋雅,所以打印结果都是秋雅//3、对象名.实例变量s1.age = 18;s2.age = 19;System.out.println(s1.age);//18System.out.println(s2.age);//19//实例变量是每个对象单独拥有的,所以打印结果都是单独的//不能用类名.实例变量,因为不知道访问的是哪个对象的//System.out.println(Student.age);报错} }
- 静态变量:数据只需要一份,且需要被共享访问和修改
- 实例变量:每个对象都有一份,数据都是独立的
- 访问自己类中的类变量,可以省略类名不写
- 在某个类中访问其他类里的类变量,必须带类名访问
package com.itheima.staticmethod;public class Student {private double score;//静态方法:有static修饰,属于类持有,建议用类名访问,也可以用对象访问public static void printHelloWorld(){System.out.println("hello world");System.out.println("hello world");}//实例方法:无static修饰,属于对象持有,建议用对象访问public void printPass(){System.out.println(score >= 60 ? "通过" : "未通过");}public void setScore(double score){this.score = score;} }
package com.itheima.staticmethod;public class Test {public static void main(String[] args) {//1、类名.静态方法(推荐)Student.printHelloWorld();//2、对象.静态方法(不推荐)Student s1 = new Student();s1.printHelloWorld();//3.对象名.实例方法//Student.printPass();//报错s1.setScore(59.5);s1.printPass();//规范:如果这个方法只是为了做一个功能且不需要直接访问对象的数据,用静态方法//如果这个方法是对象的行为,需要访问对象的数据,用实例方法} }
- 如果这个方法只是为了做一个功能且不需要直接访问对象的数据,用静态方法
- 如果这个方法是对象的行为,需要访问对象的数据,用实例方法
- 静态方法可以用来设计工具类
- 工具类中的方法都是静态方法,每个类方法都是用来完成一个功能的
- 工具类不用实例方法的原因:需要创建对象来调用,会浪费内存
- 工具类不需要创建对象,建议将工具类的构造器私有化 private 类名( ) { }
- 静态方法中可以直接访问静态成员,不可以直接访问实例成员。
- 实例方法中既可以直接访问静态成员,也可以直接访问实例成员。
- 实例方法中可以出现this关键字,静态方法中不可以出现this关键字。
小案例:1、展示系统中全部的电影信息
2、允许用户根据电影编号(id)查询某个电影的信息
3、使用所学的面向对象编程实现以上两个需求。
package com.itheima.demo;public class Movie {private int id;private String name;private double price;private String actor;public Movie() {}public Movie(int id, String name, double price, String actor) {this.id = id;this.name = name;this.price = price;this.actor = actor;}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 String getActor() {return actor;}public void setActor(String actor) {this.actor = actor;} }
package com.itheima.demo;import java.util.Scanner;public class MovieOperator {private Movie[] movies;public MovieOperator(Movie[] movies) {this.movies = movies;}public void printAllMovies() {for (int i = 0; i < movies.length; i++) {Movie movie = movies[i];System.out.println(movie.getName() + " " + movie.getPrice());}}public void searchMovieById() {System.out.println("请输入要查询的编号id:");Scanner sc = new Scanner(System.in);int id = sc.nextInt();for (int i = 0; i < movies.length; i++) {Movie m = movies[i];if (m.getId() == id) {System.out.println(m.getName() + " " + m.getPrice());return;}}System.out.println("没有找到该编号的影片");} }
package com.itheima.demo;public class Test {public static void main(String[] args) {//1、设计电影类Movie,以便创建电影对象,封装电影数据//2、封装系统中的全部电影数据。(自己造一些数据)Movie[] movies = new Movie[6];movies[0] = new Movie(1, "唐顿庄园", 9.5, "Tim Allen");movies[1] = new Movie(2, "唐顿庄园2", 9.5, "Tim Allen");movies[2] = new Movie(3, "唐顿庄园3", 9.5, "Tim Allen");movies[3] = new Movie(4, "唐顿庄园4", 9.5, "Tim Allen");movies[4] = new Movie(5, "唐顿庄园5", 9.5, "Tim Allen");movies[5] = new Movie(6, "唐顿庄园6", 9.5, "Tim Allen");//3、创建电影操作对象出来,专门负责电影数据的业务操作MovieOperator mo = new MovieOperator(movies);//选中movies后Alt+Enter+Enter会在MovieOperator类中自动添加构造方法mo.printAllMovies();//先选中该方法后Alt+Enter+Enter自动在MovieOperator类中添加printAllMovies方法mo.searchMovieById();//同上} }