补Java基础之重生(13)类与对象(补充版)+面向对象综合案例
在过去的10天里,终于把毕业论文定稿了,进度拖沓了,但是我还是会赶进度的,原计划的进度已经拖了很久了,我将在本周和下周三之前结束Java进阶技术的内容。
一、封装
(1)面向对象三大特征之一:封装
(2)封装的概念
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。
(3)封装的两个大致原则:
把尽可能多的东西藏起来,对外提供便捷的接口
把所有的属性藏起来。
(4)封装的步骤
- 把属性的public访问修饰符改为private
private:只能在本类中进行访问
- 编写设置值与获取值的方法
一般来说,类名,属性名全部都是名词,方法名为动词
(5)如何实现封装
- 修改属性的可见性:设为private,防止错误的修改。
- 创建公有的getter/setter方法:用于属性的读写。
- 在getter/setter方法中加入属性控制语句:对属性值的合法性进行判断。
(6)封装的好处
- 便于使用者正确使用系统,防止错误修改属性。
- 有助于系统之间的松耦合,提高系统独立性。
- 提高软件的可重用性。
- 降低了构建大型系统的风险。
例子1:
自定义学生类
package FengZhuang;
/**
* user:liaoxinyue
* 学生类
**/
public class Student {
private String name;
private int age;
private String sex;
private double score;
public String getName ( ) {
return name;
}
public void setName ( String name ) {
if ( name.length ( ) == 0 || name.length ( ) > 20 ) {
return;
} else {
this.name = name;
}
}
public int getAge ( ) {
return age;
}
public void setAge ( int age ) {
this.age = age;
}
public String getSex ( ) {
return sex;
}
public void setSex ( String sex ) {
if ( !sex.equals ( "男" ) && !sex.equals ( "女" ) ) {
this.sex = sex;
}
return;
}
public double getScore ( ) {
return score;
}
public void setScore ( double score ) {
if ( score < 0 || score > 100 ) {
return;
} else {
this.score = score;
}
}
}
自定义学生管理测试类
package FengZhuang;
/**
* user:liaoxinyue
**/
public class StudentManager {
public static void main ( String[] args ) {
Student student = new Student ( );
student.setName ( "lxy" );
student.setAge ( 22 );
student.setSex ( "女" );
student.setScore ( 90 );
System.out.println ( "{" + student.getName ( ) + "},{" + student.getAge ( ) + "},{" + student.getSex ( ) + "},{" + student.getScore ( ) + "}" );
}
}
二、访问控制
(1)方法修饰符的权限
- public
最高权限,跨包,跨类都可以。
- default
默认的意思,在同一个包下,可以访问。跨包不可以访问。
- protected
低于public一级,在子类中可以访问。(继承的概念)
- private
最低权限,只能在本类中访问。
类成员的访问修饰
作用域\修饰符 | 一个类中 | 同一个包中 | 子类中 | 外部包 |
---|---|---|---|---|
private | 可以 | 不可以 | 不可以 | 不可以 |
default | 可以 | 可以 | 不可以 | 不可以 |
protected | 可以 | 可以 | 可以 | 不可以 |
public | 可以 | 可以 | 可以 | 可以 |
注意事项: 在修饰类的访问修饰符只有public和default两种。类采用的默认修饰符只能在同包中使用
三、static修饰符
定义在属性和方法之上,加上此修饰符之后,这个属性或者方法就是类的静态成员。它是类级别的,公共的了,不是属于一个对象所私有的。
static可以修饰那些东西?
- 成员变量
静态变量,可以直接通过类名访问
- 成员方法
静态方法,可以直接通过类名访问
- 代码块
静态代码块,当Java虚拟机加载类时,就会执行该代码块。
小练习:选民投票案例
例子1:
自定义选民类
package com.JavaCode.FengZhuang.Toll;
/**
* 选民类
* user:liaoxinyue
**/
public class XuanMin {
// 总票数
public static int num;//内存上只有一份,被所有的实例对象()所共享
public String name;
// 投票
public void Poll(){
if ( XuanMin.num>=3 ){
return;
}
XuanMin.num++;
}
}
自定义测试类
package com.JavaCode.FengZhuang.Toll;
/**
* user:liaoxinyue
**/
public class Test {
public static void main ( String[] args ) {
XuanMin xuanMin=new XuanMin ();
xuanMin.name="廖心悦";
xuanMin.Poll ();
System.out.println ("总票数为:"+XuanMin.num );
XuanMin xuanMin1=new XuanMin ();
xuanMin1.name="廖继皓轩";
xuanMin1.Poll ();
System.out.println ("总票数为:"+XuanMin.num );
XuanMin xuanMin2=new XuanMin ();
xuanMin2.name="廖加全";
xuanMin2.Poll ();
System.out.println ("总票数为:"+XuanMin.num );
XuanMin xuanMin3=new XuanMin ();
xuanMin3.name="廖小狗";
xuanMin3.Poll ();
System.out.println ("总票数为:"+XuanMin.num );
XuanMin xuanMin4=new XuanMin ();
xuanMin4.name="邓书香";
xuanMin4.Poll ();
System.out.println ("总票数为:"+XuanMin.num );
}
}
四、static静态代码块
static代码块
- jvm加载类时,加载静态代码块
如果有多个静态代码块,按顺序加载
每个静态代码块只会被执行一次。
static执行时机,当类加载的时候就去执行。
特征:只能执行一次
应用场景:连接数据库的时候,把数据库的连接对象
作用:给一些静态属性赋初始值。
目的:节省内存空间,减少不必要的内存资源浪费。节省程序的性能开销。
小练习
自定义学生类
package com.JavaCode.FengZhuang.entity;
/**
* user:liaoxinyue
**/
public class StudentDemo {
public StudentDemo(){
System.out.println ("无参构造方法" );
}
// static执行时机,当类加载的时候就去执行。特征:只能执行一次
// 应用场景:连接数据库的时候,把数据库的连接对象
// 作用:给一些静态属性赋初始值。
// 目的:节省内存空间,减少不必要的内存资源浪费。节省程序的性能开销。
private String name;
private int age;
private static double money = 0.0;
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;
}
public static double getMoney ( ) {
return money;
}
public static void setMoney ( double money ) {
StudentDemo.money = money;
}
static {
//静态代码块:只能访问静态的成员
StudentDemo.money += 100;
}
static {
//静态代码块:只能访问静态的成员
StudentDemo.money +=150;
}
public static void main ( String[] args ) {
StudentDemo studentDemo = new StudentDemo ( );
System.out.println ( studentDemo.money );
}
}
自定义测试类
package com.JavaCode.FengZhuang.entity;
/**
* user:liaoxinyue
**/
public class StudentDemoManager {
public static void main ( String[] args ) {
StudentDemo stu = new StudentDemo ( );
System.out.println ( stu.getMoney ( ) );
StudentDemo stu1 = new StudentDemo ( );//实例化对象之前就会执行,实例化对象就会触发类加载。
System.out.println ( stu1.getMoney ( ) );
}
}
2、电影案例
自定义电影类
package Demo;
/**
* user:liaoxinyue
**/
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 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;
}
public int getId ( ) {
return id;
}
public void setId ( int id ) {
this.id = id;
}
}
自定义电影操作类
package Demo;
import java.util.*;
/**
* user:liaoxinyue
**/
public class MovieOperator {
private Movie[] movie;
private int age;
public MovieOperator ( Movie[] movie ) {
this.movie = movie;
}
public void showAllMovie ( ) {
System.out.println ( "=========全部电影信息如下============" );
for ( int i = 0 ; i < movie.length ; i++ ) {
Movie movies = movie[ i ];
System.out.println ( movies.getId ( ) + "\t" + movies.getName ( ) + "\t" + movies.getPrice ( ) + "\t" + movies.getActor ( ) );
}
}
public void getMovieById ( ) {
System.out.println ("请输入你要查询的电影id" );
System.out.println ("要查询的电影信息如下:" );
Scanner scanner=new Scanner ( System.in );
int id=scanner.nextInt ();
for ( int i = 0 ; i < movie.length ; i++ ) {
Movie movies = movie[ i ];
if ( movies.getId ()==id ){
System.out.println ( movies.getId ( ) + "\t" + movies.getName ( ) + "\t" + movies.getPrice ( ) + "\t" + movies.getActor ( ) );
return;
}
}
System.out.println ("查无此电影" );
}
}
自定义测试类
package Demo;
/**
* user:liaoxinyue
**/
public class MovieDemo {
public static void main ( String[] args ) {
//目标:掌握电影信息的开发
//1、每个电影是一个电影对象,首先设计电影类,用于创建电影对象,封装电影数据
//2、准备电影对象数据(电影信息):由一个一个的电影对象存储
Movie[] movie = new Movie[ 5 ];
movie[ 0 ] = new Movie ( 1 , "热辣滚筒" , 46.5 , "贾玲" );
movie[ 1 ] = new Movie ( 2 , "飞驰人生" , 49.6 , "沈腾" );
movie[ 2 ] = new Movie ( 3 , "非诚勿扰" , 50 , "葛优" );
movie[ 3 ] = new Movie ( 4 , "第二十条" , 46 , "赵丽颖" );
movie[ 4 ] = new Movie ( 5 , "熊出没" , 38 , "光头强" );
//3、把电影对象数据交给电影操作对象进行业务处理
MovieOperator movieOperator = new MovieOperator ( movie );
movieOperator.showAllMovie ( );
movieOperator.getMovieById ( );
}
}