Java高级--抽象和封装

1、类和对象的概念

  • 对象,万物皆对象。指的是生活中可见的任意的实体都可以看作对象。对象是具体的。

  • 对象的描述:属性,指的是固有的一些特性。方法,指的是动态的一些特性。

  • 类,具有相同属性和方法的对象的集合。抽象的。

  • 类和对象的关系:类规定了对象要有的属性和方法,可以看成是一个模板。

    • 对象就是类的具体实现。

  • 生活中的一个实体,应该对应程序中的一个对象。

2、构造方法

  • 构造方法的作用

    • 创建对象

    • 给属性赋初值

  • 语法

    • 访问修饰符一般为public

    • 方法名和类名相同,包括大小写

    • 没有返回值,也没有void

    • 可以有参数

    • 方法体中一般只用于给属性赋值

  • 调用

    • 通过new关键字调用构造方法,不可以通过对象去调用

    • new操作就是申请空间创建对象的过程

  • 特点

    • 可以有多个,通过参数列表区分

    • java类本身会提供一个无参的构造方法,隐藏的方法

    • 一旦我们手动编辑了一个构造方法,java类不再提供。

    • 建议给每个类加一个无参构造方法

3、方法重载

  • 指的是在一个类中,出现多个重名的方法overload

    • 方法名相同

    • 参数列表必须不同,个数、类型或者顺序不同,跟参数名称没有任何关系,和方法体没有任何关系

    • 与返回值没有关系,和访问修饰符也没有关系

    • 调用时根据参数来区分

4、静态的static

  • 用于修饰类的成员的,比如方法和属性

  • 被static修饰的成员,称为类级别的成员随着类的加载而加载,优于对象存在的

  • 静态成员只有一份,属于整个类,属于所有的对象,共享

  • 我们可以通过类名.形式访问,也可以通过属性.的形式访问,访问的都是同一个变量

  • 静态方法中只能访问静态变量,不能访问普通变量

  • 普通方法中可以访问静态变量

    public class Student {
        //属于对象的属性
        String name;
        double score;
        // 静态变量,类级别的变量
        static double avg;
    ​
        public void showInfo(){
            System.out.println(avg);
            System.out.println(name + ":" + score);
        }
    ​
        //静态方法,类级别的方法
        public static void showAvg(){
            System.out.println("平均分是" + avg);
            //静态变量随着类的加载而加载
            //System.out.println(name);
        }
    ​
        public static void main(String[] args) {
            Student s1 = new Student();
            s1.name = "张三";
            s1.score = 100;
    ​
            Student s2 = new Student();
            s2.name = "李四";
            s2.score = 95;
            //可以通过类名.的形式直接访问静态变量
            Student.avg = (s1.score + s2.score) /2;
            System.out.println(Student.avg);
    ​
            //也可以通过对象的形式去访问 访问的是同一个值
            System.out.println(s1.avg);
            System.out.println(s2.avg);
    ​
            Student.showAvg();
            s1.showAvg();
        }
    }

5、最终的final

  • final可以修饰变量

    • 修饰基本数据类型,值不可改变

    • 修饰引用数据类型,地址不可以改变

      //修饰基本数据类型 代表值不可更改
              final int num = 1;
              final Student s3 = new Student();
              s3.name = "张三";
              s3.name = "李四";
      ​
              //修饰引用数据类型,代表地址不可更改
              //s3 = new Student();
  • final修饰方法,代表方法不可以被重写

  • final修饰方法,方法不可以被继承

  • final的常用场景,和static关键字一起修饰常量

    //常量,常量的名称全大写,多个单词用下划线区分
        public static final double PI = 3.14;

6、this关键字

  • 指向当前对象,可以用于区分同名的局部变量和成员变量

    • 局部变量和成员变量可以重名,局部变量优先级较高

    • 当局部变量和成员变量重名时,如果想要调用成员变量,可以使用this关键字

    • public Student(String name) {
              this.name = name;
          }
  • this()可以调用本类的其他构造方法,如果要使用this()调用构造方法,必须放在方法的第一句话

    • public Student(String name) {
              this.name = name;
          }
          public Student(String name,int age){
              this(name); //使用this调用构造方法
              this.age = age;
          }
      ​
          public Student(String name,int age,String sex){
              this(name,age);
              this.sex = sex;
          }

  • 在能区分成员变量和局部变量时this可以省略,否则一定不能省。

7、封装

  • 什么是封装:将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对信息的操作和访问

  • 为什么使用封装:

    • 我们在类中定义的成员变量可以直接使用”对象名.属性“的形式访问,不合理的值无法做出限制或者限制比较麻烦,这样是不安全的

    • 我们在类中定义的属性和方法可以随便被其他类或对象访问,这样也是不安全的

  • 封装的实现

    • 包:为了更好的管理类,对封装提供支持,可见度控制机制

    • 访问修饰符

      • public : 所有类都可以访问

      • protected:同包中的类和其他包中的子类可以访问

      • 默认的(缺省的):同包才访问

      • private:只有自己可以访问

    • 方法:把具体的实现业务逻辑封装起来

  • 属性封装步骤:

    • 属性私有化private

    • 生成get/set方法,get取值,set赋值

    • 按照需求在方法中加入控制语句

      public void setName(String name){
          if (name.length() > 10){
              System.out.println("请输入合理的姓名");
              return;
          }
          this.name = name;
      }
      public String getName(){
          return name;
      }
      ​
      public void setAge(int age){
          if (age < 0){
              this.age = 0;
          }else {
              this.age = age;
          }
      ​
      }
      ​
      public int getAge() {
          return age;
      }

8、初始化块

  • 初始化块是java类中出现的第四类成员(前面有成员变量、成员方法、构造方法)

  • 其功能与构造方法类似,可以对java对象进行初始化操作

  • public class Dog{
        private String name; // 名字
        {
            name = "大黄";
        }
    }
    ​
  • 执行顺序:(创建成员变量,执行初始化块)——>执行构造方法

  • 初始化块特点:

    • 可以包含任何可执行语句,包括变量定义、调用方法、访问成员变量、分支、循环等

    • 一个类中可以出现多个初始化块(如果有多个,按书写顺序从上到下执行)

    • 创建对象时,系统默认调用,无法显示调用

  • 初始化块和构造方法的比较

    • 在某种程度上,初始化块可以看成是构造方法的补充,都是针对对象进行初始化操作

    • 不同的是,初始化块是一段固定的代码,不接受参数,也没有返回值,对所有对象的处理完全相同

    • 如果有一段代码无需接收任何参数,对所有对象的处理完全相同,就可以将其放入初始化块

  • 静态初始化块

    • 使用static修饰的初始化块

    • 类初始化块与其他静态成员一样,随着类的加载而加载,比普通初始化块先执行

      • 类加载就是在编译之后,代码(main方法)执行之前

    • 静态初始化块、静态方法等只能访问静态成员(因为静态成员初始化时,普通属性和方法还没有被初始化)

  • 执行顺序

    • (静态变量、静态初始化块)>(成员变量,初始化块)>构造方法

    • 静态变量和静态初始化块的执行顺序取决于他们的书写顺序

    • (成员变量,初始化块)的执行顺序取决于他们的书写顺序

  • 静态成员(被static修饰的)在类被编译时随着类的加载而加载;普通成员(没有被static修饰,属于对象),在创建对象时被创建

09-10 89
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值