Java基础7

gjwqz / 2024-08-11 / 原文

面向对象的特征一:封装性

随着我们系统越来越复杂,类会越来越多,那么类之间的访问边界必须把握好,面向对象的开发原则要遵循“高内聚、低耦合

高内聚:类的内部数据操作细节自己完成,不允许外部干涉;

低耦合:仅暴露少量的方法给外部使用,尽量方便外部调用。

何为封装性?

所谓封装性,就是把客观事物封装成抽象概念的类,并且类可以把自己的数据和方法只向可信的类或者对象开发,向没必要开放的类或对象隐藏信息。

权限修饰符

4种权限修饰符: private / 缺省 / protected / public

可以使用4种权限修饰符修饰类及类的内部成员。当这些成员被调用时,体现可见性的大小。

实际案例: 在题目中,我们给Animal的对象的legs属性赋值。在实际的常识中,我们知道legs不能赋值为负数的。到那会是如果直接调用属性legs没事不可以加入逻辑判断的,为了解决这个问题:

> 将legs属性私有化(private),禁止在Animal类的外部直接调用此属性

> 提供给legs属性赋值的setLegs()方法,在此方法中加入legs赋值的判断逻辑  if(l >= 0 && l % 2 == 0) 将此方法暴露出去,使得Animal类的外部调用此方法,对legs属性赋值。

> 提供给legs属性获取的getLegs()方法,此方法对外暴露。使得在Animal类的外部还可以调用此属性的值。

public class AnimalTest {
    public static void main(String[] args){
        Animal animal1 = new Animal();
        animal1.name = "小兔";
        // animal1.legs = -4; 这里的赋值其实是不合理的,所以为了将这种不合理的赋值消灭 我们可以写一个赋值的方法,并取消这种.的赋值方法
        animal1.setLegs(4);
        // 那么相应的我们输出就不能写:
        // System.out.println(animal1.legs);   因为我们不能够.的方式调用  所以我们还需要一个获取legs值的方法
        System.out.println(animal1.getLegs());
        animal1.eat();
    }
}

class Animal{
    String name;
    private int legs; // 为了防止用户用.的方式去赋值legs

    public void eat(){
        System.out.println("动物觅食");
    }

    public void setLegs(int l){
        if(l >= 0 && l % 2 == 0){
            legs = l;
        }else{
            System.out.println("你输入的数据非法!");
        }
    }
    public int getLegs(){
        return legs;
    }
}

权限修饰符的范围

 类: 只能使用public / 缺省 修饰

类的内部成员: 可以使用4种权限修饰

封装性的体现

> 场景1: 私有化(private)类的属性,提供公共(public)的get和set方法,对此属性进行获取或修改

> 场景2: 将类中不需要对外暴露的方法,设置为 private

> 场景3: 单例模式中构造器private(私有)的了,避免在类的外部创建实例。

 构造器

作用1:搭配new关键字,创建类的对象。

作用2:在创建对象的同时,可以给对象的相关属性赋值

格式: 权限修饰符 类名(形参列表){ }

注意: 创建类以后,在没有显示提供任何构造器的情况下,系统会默认提供一个空参的构造器,且构造器的权限与类声明的权限相同。

    一旦类中显示声明了构造器,则系统不再提供默认的空参的构造器。

public class Student {
    String name;
    int age;
    String school;
    String major;
    /*
     *与类名一致的方法名
     * 构造方法是在创建对象的时候调用
     * 类在没有定义构造方法的时候有一个默认的无参构造
     * 初始化成员变量
     */
    public Student (String n, int a){
        name = n;
        age = a;
    }
    public Student (String n, int a, String s){
        name = n;
        age = a;
        school = s;
    }
    public Student (String n, int a, String s, String m){
        name = n;
        age = a;
        school = s;
        major = m;
    }
    public String getInfo(){
        return "name = " + name + ",age = " + age + ",school = " + school + ",major = " + major;
    }
}

public class StudentDemo {
    public static void main(String[] args){
        Student s=new Student("小明", 19);
        System.out.println(s.age);
        System.out.println(s.getInfo());
    }
}

属性赋值过程

在类的属性中,有哪些位置给属性赋值:

① 默认初始化;

② 显式初始化;

③ 构造器中初始化;

④ 通过“对象.方法”的方式赋值;

⑤ 通过“对象.属性”的方式赋值;

执行的先后顺序: ① - ② - ③ - ④ / ⑤

以上操作在对象创建过程中可以执行的次数如何:  

> 只能执行一次: ①、②、③

> 可以多次执行: ④、⑤ 

JavaBean

JavaBean是一种Java语言写成的可重用组件。

好比做了一个扳手,这个扳手会在很多地方被拿去用。这个扳手也提供多种功能(可以拿这个扳手扳、锤、撬等),而这个扳手就是一个组件。

所谓JavaBean,是符合如下标准的java类:

① 类是公共的     ② 有一个无参的公共的构造器     ③ 有属性,且有对应的

UML类图

常用的UML工具软件有 PowerDesinger、RoseEnterprise Architect

UML工具软件不仅可以绘制软件开发中所需的各种图表,还可以生成对应的源代码。

在软件开发中,使用UML类图可以更加直观地描述类内部结构(类的属性和操作)以及类之间的关系(如关联、依赖、聚合等)

  • + 表示public类型, - 表示private类型, # 表示protected类型
  • 方法的写法:  方法的类型(+、-) 方法名(参数名:参数类型):返回值类型
  • 斜体表示抽象方法或类