上海传智播客JAVASE_day07学习笔记

《第七天总结》 张伦琦
《封装,构造,this,static》
1.面向对象的回顾
    这个不再详细的总结了,给自己的建议是,
    放弃之前写C语言程序的思维,要用面向对象的思维去思考,
    写程序的时候学会做“大爷”!让别人做事!


2.封装    
    A.封装的引入(通过写class Student的例子)
       1.因为age=-18居然通过了,不让通过。
         办法是加private,私有的,只有本类有效,类外无效。
         你不让通过,我student类外面无法访问age;
       2.现在的问题是学生没有年龄,咋办?
         在Student类中定义方法来访问age;一个用来赋值。一个用来取值。
       3. 一开始的问题(age=-18),转了一大圈,没有解决.咋办?
         在堆age赋值时加判断。保证数据的安全
       4.方法名称比较恶心,我要弄一个有规范的方法名字。
        赋值setAge():变异器:有参数,无返回,有输入,无输出。
        取值getAge():取值器:无参数,有返回,无输入,有输出。
            举例:如果你的变量名称是xxxYyyZzz
            赋值:setXxxYyyZzz()
            取值:getXxxYyyZzz()

    
    B.写程序的正确步骤
       1.对变量加private ,为了控制变量的访问,保证数据的安全。
       2.提供方法来访问private变量,对外提供访问接口。
       3.设计getter,setter。就是访问接口的具体体现
       4.创建对象,使用getter,setter对对象中的属性进行操作。
         访问接口的具体操作。
    

    C.内存图解:(见图)



    D.封装总结:
        A.封装定义:是指隐藏对象的属性(加private)和实现细节(private方法,还没学),
                    仅对外提供公共访问方式(public getter和setter)。
        B.封装分类;
           1.类封装:封装了属性和方法。因为他们属于创建对象的类。
           2.方法封装:将代码,功能封装到方法中,为了便于复用。
           3.数据封装:将数据加private,对外提供 public setter和getter
        C.封装好处:
            将变化隔离。(代码各司其职,相互关系不大,一旦一个对象的功能发改变,不影响其他对象)
                        (扩展:高内聚,相关的东西定义到一起,低耦合,你别影响我,我别影响你)
            便于使用。 (方法和属性都有所属,只要找到所属的对象就能找到方法和属性。)
            提高重用性。(功能封装到方法中,一次定义多次调用。属性和方法封装到对象中,一次创建对象多次使用对象)
            提高安全性。(数据不让直接访问,通过方法来访问,方法中可以有安全性控制)
        D.private关键字:
            1.是一个访问权限修饰符。
            2.用于修饰成员(成员变量和成员函数)
            3.被私有化的成员只在本类中有效。
            4.应用场景:
                将成员变量私有化,对外提供对应的set ,get方法对其进行访问。
                提高对数据访问的安全性。

3.构造方法    
    3.1构造方法概述    
     A.构造方法的默认情况:
        如果你不写,系统将默认提供一个。javac 编译的时候提供
        如果你写了,系统将不在提供默认构造方法。javac 编译的时候不提供
        默认构造,无参构造,建议手动写出。
        为啥要自己写?
        盖楼房
           1.如果业主不给图纸,按照一个默认的图纸进行盖房。
           2.如果业主给出图纸,按照业主给出的图纸进行盖房。
           3.建议业主给出默认图纸,
     B.构造方法作用:创建对象,初始化对象。
     C. 构造方法的特殊:(构造方法和普通方法的区别)(重要!)
          1.名称特殊:和类名一样。
          2.返回特殊:你不需要给它任何返回值,void也不写。
          3.作用特殊:成员方法代表对象的能力。构造方法,用于创建对象。
          4.调用特殊:成员方法是创建对象后多次调用,构造方法是创建对象的时一次调用。
      D. 构造放的注意(重要!)
         1.构造方法可以重载吗?可以!为啥要让构造方法重载呢?
           构造方法代表创建对象的一种方式,允许创建对象有多种方式。
         2.构造方法可以使用private吗?可以,如果有那么一种创建对象的方式,不想让外界使用可以加private
         3.构造方法没有void,那它可以有return语句吗?可以。为啥允许加return呢?
           如果你给的构造对象的条件非法,提前结束对象的构造

    3.2构造方法内存图解(很重要,很详细的^-^)
    
4.This和this()    
    4.1this    
        A.this引入
        1.因为 int a 意义不明确 ,将a该成age
        2.问题成员变量age =0,没赋值成功
        3.因为成员变量和局部变量重名,局部变量把成员变量屏蔽了。
        4.对成员变量使用this

        B.啥时候用this.
         成员变量被同名的局部变量屏蔽的时候,我要用成员变量,必须用this指明。
             成员变量和局部变量不发生屏蔽的时候,就不需要用this来指明成员变量。
             stu的地址居然和this代表的地址一模一样,是咋过去的呢?
           我们                         系统
           定义getAge()                定义getAge(Student this)
          调用stu.getAge()             调用getAge(stu);

        C.this的注意
        1.this是一个隐式参数。
            2.代表当前对象。
            3.在定义对象的类中使用。


    4.2this练习---判定同龄人
        class Person{
        //属性 name age
             private String name;
             private int age;
             public void setAge(int age){
                this.age=age;
             }
            //方法 introduce()
            public void  introduce(){
             System.out.println("name="+name+", age="+age);
            }
            public boolean isEqualAge(Person p){
                /*
                //1.是不是同一个人,
                if (this==p){
                    return true;
                }else{
                   //2.如果不是同一个人,判定年龄
                   //如果年龄相同就true
                   if (this.age==p.age){
                       return true;
                   }else{
                   //否则就false
                      return false;
                   }
                }
                */
                return this==p?true:this.age==p.age?true:false;
            
            }
        }

        class PersonDemo
        {
            public static void main(String[] args)
            {
                Person p1=new Person();
                p1.setAge(18);
                Person p2=new Person();
                p2.setAge(19);

                boolean b=p1.isEqualAge(p1);
                //b=p1.isEqualAge(p2);
                //b=p2.isEqualAge(p1);
                System.out.println(b);

                //System.out.println(p1);
                //System.out.println(p2);
            }
        }

    
    4.3this()
        A.this()引入
        学生的年龄不能为负数和0
        应该在构造学生对象的时候加控制语句
        问题:控制语句重复。怎去去掉重复。
        构造方法去调用构造方法。不能直接叫构造方法的名称
        只好用this();
        B.this()本质:
        代表本类的一个构造方法。
        C.this()注意
        1.只能用于构造方法中。
            2.只能是第一个语句。
        3.只能调用一次。
        4.不能存在循环的构造方法调用。


    4.4封装,构造,this,this()代码模板    
/*
学生
   成员属性:id name age
   构造方法:Student() Student(String name) Student(String name , int age)
            Student(String name , int age ,String id)
   成员方法:study() sleep()
           :getter() setter()
*/
class Student{
      //成员属性:id name age
      private String id;
      private String name;
      private int age;
      /*
      构造方法:
      Student() Student(String name) Student(String name , int age)
      Student(String name , int age ,String id)
      */
      public Student(){
      }
      public Student(String name){
          if (name==null){
              name="";
          }
          this.name=name;
      }
      public Student(String name , int age){
          this(name);
          //this.name=name;
          this.age=age;
      }
     public Student(String name , int age ,String id){
          this(name,age);
          // this.name=name;
          // this.age=age;
          this.id=id;
     }
     //:getter() setter()
     public String getId(){
       return id;//this可以不加
     }
     public void setId(String id){
       this.id=id;
     }
     public String getName(){
       return name;//this可以不加
     }
     public void setName(String name){
       this.name=name;
     }
     public int getAge(){
       return age;
     }
     public void setAge(int  age){
       this.age=age;
     }
     public void study(String kecheng){
       System.out.println("正在学校"+kecheng);
     }
     public void sleep(){
      System.out.println("学生正在休息");
     }
}

class StudentZhongJieDemo
{
    public static void main(String[] args)
    {
        System.out.println("Hello World!");
    }
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值