美文网首页程序员java架构经验分享
【建议收藏】关于面向对象、封装,还没有见过总结的这么详细的!

【建议收藏】关于面向对象、封装,还没有见过总结的这么详细的!

作者: 前程有光 | 来源:发表于2020-09-25 21:17 被阅读0次

    类和对象

    什么是类

    类是一组相关属性和行为的集合,可以看作是一类事物的模板,比如说:无论中年人、老年人还是小孩,都有身高、体重(这是属性),都会吃饭、睡觉(这是行为),那么我们就可以抽取出这些共有的属性和行为,封装为一个类。类由两部分组成:

    • 属性:事物的状态信息
    • 行为:事物能够做啥

    什么是对象

    对象是某类事物的具体体现,对象是类的一个实例,比如说:一株蒲公英是植物类的具体实例。

    对象和类的关系

    • 类是对象的抽象
    • 对象是类的具体

    类的定义

    格式

    修饰符 class关键字 类名{
        //成员变量(属性)
        //成员方法(行为)
    }
    
    

    定义类

    public class Student{
        String name;//姓名
        int age;//年龄
    
        //吃饭
        public void eat(){
            System.out.println("吃饭");
        }
    }
    
    

    Student是类名,name和age是成员变量(属性),定义的方式和声明普通变量一样;eat是成员方法(行为)。

    创建和使用对象

    格式

    类名 对象名=new 类名();
    
    
    public static void main(String[] args){
        //创建Student类实例
        Student s=new Student();
        //使用成员变量
        System.out.println(s.name);//null
        System.out.println(s.age);//0
        //调用eat方法
        s.eat();
    }
    
    

    成员变量的默认值

    如果没有对成员变量进行赋值的话,那么将会使用它们的默认值

    public class Student {
        int age;
        float weight;
        char sex;
        boolean isMan;
        String name;
    
        public void eat(){
            System.out.println("吃饭");
        }
    
        public static void main(String[] args) {
            Student s=new Student();
            System.out.println(s.age);//0
            System.out.println(s.weight);//0.0
            System.out.println(s.isMan);//false
            System.out.println(s.name);//null
            System.out.println(s.sex=='\u0000');//true
        }
    }
    
    

    局部变量

    局部变量在方法内部定义

    public class Student {
        int age;
    
        public void say(){
            //定义局部变量a
            int a=1;
            System.out.println(a);
        }
        //形参也是局部变量
        public void hel(int a){
          System.out.println(a);
        }
    }
    
    

    成员变量和局部变量的区别

    • 在类中的位置不同

      成员变量定义在类中、方法外

      局部变量定义在方法中或方法声明上(形参)

    • 作用范围不同

      成员变量作用范围是整个类

      局部变量的作用范围是它所在的方法

      public class Student {
          int age;
      
          public void say(){
              //定义局部变量a
              int a=1;
              System.out.println(age);
              System.out.println(a);
          }
      
          public void hel(){
              System.out.println(age);
              //System.out.println(a);  无法访问到a
          }
      
      }
      
      
    • 是否有默认值

      成员变量有默认值

      局部变量没有默认值,必须定义赋值,然后使用

       public void say(){
              int a;
              //System.out.println(a);  未赋值无法使用
          }
      
      
    • 在内存的位置

      成员变量在堆内存

      局部变量在栈内存

    • 生命周期不同

      成员变量随着对象的创建而存在,随着对象的消失而消失

      局部变量随着方法的调用而存在,方法调用完毕它便消失

    封装概述

    封装是指将数据和操作数据的方法绑定起来,对数据的访问只能通过定义的接口。我们在类中编写的方法就是对实现细节的一种封装;我们编写的类就是对数据和数据操作的封装。

    封装步骤

    • 使用private修饰符将变量修饰为私有变量(只有本类中可以访问)

    • 对外提供公有的可以访问私有变量的方法,如getXXX()方法和setXXX()方法

        public class Test1 {
            public static void main(String[] args) {
                Person p=new Person();
                //System.out.println(p.name);  无法直接访问
                System.out.println(p.getName());//null 只能通过对外提供的接口进行访问
            }
        }
    
        class Person{
            private String name;
            private int age;
    
            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;
            }
        }
    
    

    注意

    一个.java文件中可以定义多个类,但是只能有一个类使用public修饰符

    this关键字代表正在操作的那个对象,this.name表示该对象的成员变量name,区别于局部变量name

    构造方法

    我们知道,想要使用对象内的东西,必须要先使用new关键字创建对象,那么它是怎么创建出来的呢?答案就是构造方法,可是我们的类中没有定义构造方法啊?虽然没有定义,但是我们每个类都有一个默认值的无参构造方法,我们在new对象的时候就会调用构造方法。那么我们该如何定义自己的构造方法呢?

    格式

      【修饰符】 类名(【参数列表】){
        //代码
      }
    

    注意点

    • 构造方法的名字必须和类名一致
    • 构造方法没有返回值(其实是省略了,因为构造方法只能返回本类的类型)
    • 一旦自己DIY了构造方法,那么默认的无参构造方法就无效了
    • 没有参数列表的是无参构造方法,有参数列表的是有参构造方法
    • 我们可以在一个类中定义多个构造方法
       public class Test1 {
           public static void main(String[] args) {
              //使用无参构造创建对象
               Person p1=new Person();
               //使用有参构造创建对象
               Person p2=new Person("张三");
           }
       }
    
       class Person{
           private String name;
           private int age;
    
           //无参构造方法
           public Person(){
               System.out.println("我是无参构造方法");
           }
    
           //我是有参构造方法
           public Person(String name){
               System.out.println(name);
               System.out.println("我是有参构造方法");
           }
    
       }
    
    

    执行结果:
    我是无参构造方法
    张三>
    我是有参构造方法

    使用构造实现封装

    前面通过编写setXXX方法和getXXX方法以及私有化成员变量实现封装,这里我们通过构造方法实现封装

       class Person{
           private String name;
           private int age;
    
           //无参构造方法
           public Person(){
               System.out.println("我是无参构造方法");
           }
    
           //我是有参构造方法
           public Person(String name,int age){
               System.out.println("我是有参构造");
               this.name=name;
               this.age=age;
           }
       }
       public class Test1 {
           public static void main(String[] args) {
              //使用无参构造创建对象
               Person p1=new Person();
               //使用有参构造创建对象
               Person p2=new Person("张三",23);
           }
       }
    
    

    我们无法访问对象的成员变量(属性),只能通过构造进行访问

    JavaBean

    JavaBean是java语言编写类的一种标准规范,符合JavaBean`的类必须要满足以下条件:

    • 类必须是具体和公开的(使用public修饰)
    • 类必须有无参构造方法(有参构造建议加上)
    • 必须要有操作成员变量的setXXX方法和getXXX方法
       class Person{
           private String name;
           private int age;
    
           //无参构造方法
           public Person(){
               System.out.println("我是无参构造方法");
           }
    
           //我是有参构造方法
           public Person(String name,int age){
               System.out.println("我是有参构造");
               this.name=name;
               this.age=age;
           }
    
           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;
           }
       }
    
    

    最后

    感谢你看到这里,文章有什么不足还请指正,觉得文章对你有帮助的话记得给我点个赞,每天都会分享java相关技术文章或行业资讯,欢迎大家关注和转发文章!

    相关文章

      网友评论

        本文标题:【建议收藏】关于面向对象、封装,还没有见过总结的这么详细的!

        本文链接:https://www.haomeiwen.com/subject/lbcquktx.html