Java面向对象编程-2

面向对象目录
1 类与对象
2 封装 
  2.1 构造方法
  2.2 类的结构 
3 继承
  3.1 类的设计与扩展 
4 接口
  4.1 事件监听器
5 抽象类
6 泛型
7 枚举

2 封装

2.1 构造方法

1)访问权限修饰符

都可以修饰成员:作用于代码编译阶段,使用不当导致语法错误,编译不通过。 

访问权限修饰符及其规定的可访问区域见下表。

访问权限修饰符可访问区域
public - 公共的整个项目
private - 私有的本类
protected - 受保护的子类中&同包中
缺省/不写同包中

2)属性封装

封装属性即私有化属性。

e.g. 封装User中的属性

public class User {

    private String userName;
    private int id;
    private String password;
    private String phoneNum;
    private int userAge;
    private double score;
    private boolean isOnline;
    private long time;

}

对属性的操作有两种:赋值与使用。

赋值:修改变量的值

使用:不修改变量的值

属性被封装后不可以在类外直接访问、操作,这就需要在类中定义方法用于在类外操作变量。set/get属性名,属性名首字母大写。

set:赋值

get: 获取属性值

e.g. 定义方法setUserName和getUserName,在类User外操作属性userName。

public class User {

    private String userName;

    public void setUserName(String userName) {
// this指代调用这个方法的对象,直接调用成员属性
// 使用变量时:就近原则
        this.userName = userName;
    }

    public String getUserName(){
        return userName;
    }

}



class Test{
    
    public static void main(String[] args) {
    
        User user1 = new User();
        user1.setUserName("0000");
        user1.getUserName();

    }

}

封装的优点: 

1、可以在属性赋值时校验参数的合法性;而未经封装的属性在创建对象时,其合法性则需要格外校验。e.g. 通过在setUserAge方法中加入判断语句校验参数userAge是否合法。(必须大于0)

    private void setUserAge(int userAge){
        if(userAge<=0){
            System.err.println("输入参数错误!");
        }else {
            this.userAge = userAge;
        }
    }

2、实现读写分离。可以实现只读、只写、读写。

3、格式更规范。避免直接使用“=”等运算符对属性进行操作。

4、数据更规范。可以在读取数据时完成数据转换。e.g.User中的getTime方法可以将long型时间数据(1667086476790)转换为规范的时间数据(Sun Oct 30 07:34:36 CST 2022)。

import java.util.Date;

public class User {

    private long time;

    public void setTime(long time){
        this.time = time;
    }

    public String get_Time() {
        return time;
    }

    public String getTime() {
        return new Date(time).toString();
    }
}

class Test{
    
    public static void main(String[] args) {

        User user1 = new User();
        long time = System.currentTimeMillis();
        user1.setTime(time);
        System.out.println(user1.get_Time());   
        System.out.println(user1.getTime());

    }
}

运行结果

1667086476790
Sun Oct 30 07:34:36 CST 2022

3)构造方法

格式:访问修饰符 类名(参数){ }

每个类都自带一个隐式的空参数构造方法。

显式的写了构造方法之后,就会覆盖隐式的,不管有无参数。

方法重载: 一个类中有多个同名的方法。要求:参数不一致。创建对象时,选择调用,只会执行一次。

每个对象至少调用两个构造方法,因为会调用父类的构造方法 ,每个类都会继承一个类Object。 

e.g.

public class User {

    private String userName;
    private int id;
    private String password;
    private String phoneNum;
    private int userAge;
    private double score;
    private boolean isOnline;
    private long time;

    public User(){}
    public User(String userName, int id, String password, String phoneNum, int
            userAge, double score, boolean isOnline,
                 long time) {
        this.userName = userName;
        this.id = id;
        this.password = password;
        this.phoneNum = phoneNum;
// this.userAge = userAge;
        this.setUserAge(userAge);
        this.score = score;
        this.isOnline = isOnline;
        this.time = time;
    }

    private void setUserAge(int userAge){
        if(userAge<=0){
            System.err.println("输入参数错误!");
        }else {
            this.userAge = userAge;
        }
    }

class Test{
    public static void main(String[] args) {

        User user1 = new User();
        User user2 = new User("",,"","",,...);

    }
}

4)单例模式与工厂模式

单例模式:这个类只会有唯一的一个对象。

例如,一个系统只有一个超级管理员账号 ,一个班级只有一个班主任 ,一个国家只有一个国王。

因此,不允许使用方创建对象,应当将构造方法设置为私有。同时在类中创建对象(使用static关键字,static修饰的变量只会存在一份)。

e.g. 

public class User {

    private String userName;

    // static 修饰的变量 只会存在一份
// 单例 这个类只会有唯一的一个对象
    static User king = new User();
    
    private User(){}
   
    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserName(){
        return userName;
    }

}

class Test{
    public static void main(String[] args) {

// 静态的 可以由类名直接调用
        User user1 = User.king;
        user1.setUserName("King A");
        User user2 = User.king;
        System.out.println(user2.getUserName());

    }
}

运行结果

King A

工厂模式:当有些对象创建过程太复杂,需要的参数等使用方没有办法轻易给到,因此需要在这个类中定义好创建对象的方法,直接返回一个成品对象。

同样,在工厂模式中,应当将构造方法设置为私有。

e.g. 

public class User {

    private String userName;
    private int id;
    private String password;
    private String phoneNum;
    private int userAge;
    private double score;
    private boolean isOnline;
    private long time;

    // 当有些对象创建过程太复杂,需要的参数等 第三方使用没有办法轻易给到 ,
// 工厂模型,这个类中定义好创建对象的方法,直接返回一个成品对象
    public static User createUser(){
// TODO
         String userName = ...;
         int id = ...;
         String password = ...;
         String phoneNum = ...;
         int userAge = ...;
         double score = ...;
         boolean isOnline = ...;
         long time = ...;

         return new User(userName, id, password, phoneNum, 
                    userAge, score, isOnline, time);
    }

    private User(String userName, int id, String password, String phoneNum, int
            userAge, double score, boolean isOnline,
                 long time) {
        this.userName = userName;
        this.id = id;
        this.password = password;
        this.phoneNum = phoneNum;
// this.userAge = userAge;
        this.setUserAge(userAge);
        this.score = score;
        this.isOnline = isOnline;
        this.time = time;
    }

    private void setUserAge(int userAge){
        if(userAge<=0){
            System.err.println("输入参数错误!");
        }else {
            this.userAge = userAge;
        }
    }

}

class Test{
    public static void main(String[] args) {
        
        User user1 = User.createUser();

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值