一、面向对象-封装
1.1 概念
对类隐藏内部执行代码与数据细节,提供公开简单方式进行使用、
方法的封装:将多行执行的代码封装成方法使用方法名进行标识使用
类的封装:将书写与方法封装为类。为指定的类创建对象提供属性与行为
但是,现在的封装指的最多的是对属性的封装,使用private对象属性进行修饰使其只对当前类可见,提供公开的方法进行访问
**最终:**使用访问权限修饰符对属性进行封装,使其只对可见类进行访问,大大的提高了系统的安全性
1.2 封装的书写
使用 private 关键字来修饰成员变量。
对需要访问的成员变量,提供对应的一对 `getXxx` 方法 、` setXxx` 方法。
public class Student {
private String name;//属性私有化
private int age;
//提供公开的getter setter方法
//用于外部其他类通过方法进行属性的操作
public void setName(String n){
name=n;
}
public void setAge(int a){
if(a==18){
System.out.println("臭不要脸");
}else{
age=a;
}
}
public String getName(){
return name;
}
public void say(){
System.out.println("我叫"+name+",今年"+age);
}
}
1.3 访问权限修饰符
用于修饰类、成员变量、方法的关键字,用于设置其使用范围(可见性)
public:公开的:安全性最低
默认: 如果没有书写访问权限修饰符会默认添加
protected:受保护的
private:私有的
①修饰类
只能使用默认以及public(一般用public)
默认是当前类以及当前包下其他类可用,类如果是私有的只有当前类能用,那么久没有意义
②修饰变量:
可以使用任意访问权限修饰符进行修饰(一般使用private)
只能用于成员变量
③修饰方法
可以使用任意访问权限修饰符进行修饰(一般使用public)
因为方法执行方法体书写可以进行逻辑书写,所以一般除核心方法不会进行私有
如果书写私有方法 那么在当前类其他方法中一定调用
二、this关键字
2.1 概念
在进行方法书写时,进行标识符命名时如果符合见名知意,会出现与属性名同名的情况(不同作用域),java默认就近原则,当获取变量值时,默认使用近的变量进行获取,这个时候去需要使用this关键字,将当期对象属性与方法执行传入的变量相区分
this:指代当前对象,书写在方法中,那个对象调用该方法 this指代的就是哪个对象
2.2 使用
调用属性
this.属性
调用方法
this.方法
三、构造方法
3.1 概念
还可以称之为构造函数、构造器,在使用new关键字创建对象时,由jvm调用根据传入的参数创建对象并对属性进行赋值
作用:创建对象并进行初始化赋值
3.2 书写
修饰符 构造方法名(参数列表){
// 方法体
}
修饰符多为public
无返回值(void也没有)
方法名固定(类名)
参数列表已知(属性)
方法体多为赋值
3.3 构造方法的重载
构造方法虽然与普通方法存在区别,但是也可以实现方法的重载,只不过由于构造方法执行的特点,所以构造方法重载,一般指的是参数个数不同
class People {
private String name;
private boolean alive=true;
private String oldName;
public People(String name){
this.name=name;
}
public People(String name,boolean alive){
this.name=name;
this.alive=alive;
}
}
3.4 构造方法的特点
①构造方法没有返回值
②构造方法的方法名就是类名
③所有的类都有构造方法,如果在代码书写中没有显式定义构造方法,那么在编译时jvm会自动添加一个无参构造方法
④如果类中书写了任意构造方法,那么不会在提供无参构造方法
四、javabean的书写
4.1 概念
javaBean:在java中用于存储数据或描绘对象的类
4.2 书写
//计算机类
public class Computer {
//属性
private String manufacturer;//厂商
private double price;//价格
private String color;//颜色
private int size;//尺寸
//构造方法的书写
//使用默认构造方法有时不能满足需求
//无参构造方法
public Computer(){}
//全参构造方法
public Computer(String manufacturer,double price,String color,int size){
this.manufacturer=manufacturer;
this.price=price;
this.color=color;
this.size=size;
}
//其余构造方法根据实际需求进行创建
//封装对属性使用private修饰符
//提供公开的getter setter方法
public void setManufacturer(String manufacturer){
this.manufacturer=manufacturer;
}
public String getManufacturer (){
return manufacturer;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
//行为
public void open(){
System.out.println(size+"寸的"+manufacturer+"电脑开机了");
}
public void close(){
System.out.println(color+"颜色的"+manufacturer+"电脑关机了");
}
}
五、面向对象-继承
5.1 概念
子类继承父类,继承父类非私有的属性与方法
继承描述的是事物之间的所属关系,这种关系是: is-a 的关系。例如,图中兔子属于食草动物,食草动物属于动
物。可见,父类更通用,子类更具体。我们通过继承,可以使多种事物之间形成一种关系体系。
5.2 特点
java中的继承是单继承(一个子类只能拥有一个父类,但是一个父类可以拥有多个子类)
继承关键字书写在子类
子类可以继承父类非私有的属性与方法
子类可以书写额外的属性与方法
类与类之间产生了关系,是多态的前提。
5.3 书写
在java书写过程中两个类之间的关系使用关键字进行设置,在子类中通过 关键字设置当前类继承的父类。
class 子类 extends 父类 { ... }
/**
定义员工类Employee,做为父类
*/
class Employee {
String name; // 定义name属性
// 定义员工的工作方法
public void work() {
System.out.println("尽心尽力地工作"); }
}
/*
* 定义讲师类Teacher 继承 员工类Employee
*/
class Teacher extends Employee {
// 定义一个打印name的方法
public void printName() {
System.out.println("name=" + name); }
}
/*
* 定义测试类
*/
public class ExtendDemo01 {
public static void main(String[] args) {
// 创建一个讲师类对象
Teacher t = new Teacher();
// 为该员工类的name属性进行赋值
t.name = "小明";
// 调用该员工的printName()方法
t.printName(); // name = 小明
// 调用Teacher类继承来的work()方法
t.work(); // 尽心尽力地工作
}
}
作业
书写类创建对象完成如下功能
书写银行账号类
拥有属性
卡号 String cardNumber
真实姓名 String name
密码String password
身份证号String idCard
余额 double money
手机号 String phone
拥有方法
存钱
取钱
查询余额
根据如下需求创建对应的构造方法
创建银行账号时必须指定真实姓名与身份证号手机号余额可以指定也可以不指定卡号随机生成
//拥有属性
//
//卡号 String cardNumber
//真实姓名 String name
//密码String password
//身份证号String idCard
//余额 double money
//手机号 String phone
//
//**拥有方法**
//存钱
//取钱
//查询余额
//
//根据如下需求创建对应的构造方法
//创建银行账号时必须指定真实姓名与身份证号手机号余额可以指定也可以不指定卡号随机生成
public class Account {
private String cardNumber;
private String name;
private String password;
private String idCard;
private double money;
private String phone;
public Account(){
}
public Account(String cardNumber,String name,String password, String idCard,double money,String phone){
this.cardNumber = cardNumber;
this.name = name;
this.password = password;
this.idCard = idCard;
this.money = money;
this.phone = phone;
}
public String getCardNumber() {
return cardNumber;
}
public void setCardNumber(String cardNumber) {
this.cardNumber = cardNumber;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getIdCard() {
return idCard;
}
public void setIdCard(String idCard) {
this.idCard = idCard;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public void saveMoney(double savemoney){
money+=savemoney;
}
public void drawMoney(double drawmoney){
if(money>=drawmoney){
money-=drawmoney;
}else{
System.out.println("取钱失败,你的余额没有这么多,请重新操作");
}
}
public void inquire(){
System.out.println("账户上的余额为:"+money);
}
}
public class Test {
public static void main(String[] args) {
Account user = new Account("","张三","","412702",1000,"1329814");
long cn =(long) ((Math.random()*90000)+10000);
// String cn1 = String.valueOf(cn);
String cn1 = ""+ cn;
user.setCardNumber(cn1);
// System.out.println("账户为:"+cn1);
user.saveMoney(11000);
user.drawMoney(2000);
user.inquire();
}
}