zoukankan      html  css  js  c++  java
  • java面向对象2-封装

    2 封装

    封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式,面向对象三大特点之一。
    好处:

    • 防止数据被任意篡改,提高安全性
    • 隐藏了实现细节,仅暴露方法

    如何实现封装?

    • 使用private关键字修饰成员变量
    • 对外提供公有的setter和getter方法

    2.1private(私有的)

    • private关键字:

        是一个权限修饰符,用于修饰成员(成员变量和成员方法),被私有化的成员只在本类中可以直接访问。

    • 常见用法:

        将成员变量设置为私有,这样就防止在类外进行访问,对外提供相应的公有的setXxx/getXxx方法

    • 好处:提高对数据访问的安全性。并且可以增加复杂的逻辑控制

    2.2this关键字

    作用:this代表当前正在调用方法的对象

    使用场景:
    1.setXxx方法中对成员变量赋值:区分成员变量和局部变量
    2.构造方法互相调用:
    this(...);
    注意:构造方法中使用this或者super调用其它构造方法的话必须是构造方法的第一条语句(后面详讲)
    3.方法中调用本类其它方法

    2.3 构造方法/构造器-Constructor

    特点:
    构造方法是一种特殊的方法,它的方法名与类名相同
    不用定义返回值类型,不用return关键字
    其返回值可以理解为是新创建对象的引用,不用显式定义
    作用:
    给对象初始化,即:给成员变量赋值
    注意:
    如果没有写,系统提供一个默认构造方法
    多个构造方法是以重载的形式存在的
    使用new Student();实际上就是在调用空参构造方法

    2.4标准类的定义和使用

    定义标准的javabean

    1成员变量:属性必须私有化,私有修饰
    2成员方法:

    • 空参构造方法,这个Java类必须具有一个无参的构造函数
    • 普通成员方法:study() 可选
    • 【get方法(不是必要)】/【set方法】。私有化的属性必须通过public类型的方法暴露给其它程序,并且方法的命名也必须遵守一定的命名规范。

    note:
    如果不希望单独获取成员变量的值,可以不定义getXxx方法
    给成员变量赋值的方式有两种:set方法和构造方法

    JavaBean的属性:
    JavaBean的属性可以是任意类型,并且一个JavaBean可以有多个属性。每个属性通常都需要具有相应的setter、 getter方法,setter方法称为属性修改器,getter方法称为属性访问器。
    属性修改器必须以小写的set前缀开始,后跟属性名,且属性名的第一个字母要改为大写,例如,name属性的修改器名称为setName,password属性的修改器名称为setPassword。
    属性访问器通常以小写的get前缀开始,后跟属性名,且属性名的第一个字母也要改为大写,例如,name属性的访问器名称为getName,password属性的访问器名称为getPassword。
    一个JavaBean的某个属性也可以只有set方法或get方法,这样的属性通常也称之为只写、只读属性。

    this关键字在构造方法中的使用

    • 在某个构造方法中去调用本类的其它构造方法
    • 必须放在构造方法的第一句

    2.5对象初始化(实例化)过程

    以Student s = new Student();为例
    1.加载Student.class文件到方法区
    2.在栈内存中定义变量s
    3.在堆内存中开辟空间
    4.对成员变量进行默认初始化(0/0.0/false/null)
    5.对成员变量进行显式初始化(定义成员变量时赋值)
    6.调用构造方法(成员变量赋值)
    7.成员变量初始化完毕,将对象的地址值返回给栈中的变量s


    Note:成员变量最多有四次赋值:
    1.对成员变量进行默认初始化(0/0.0/false/null)
    2.对成员变量进行显式初始化(定义成员变量时赋值)
    3.调用构造方法(成员变量赋值)
    4.成员方法赋值(set...)

    Student s = new Student();

    s一般出现在栈中(因为一般是成员方法中调用);
    也会出现在堆中(在成员变量中时)

    什么时候将变量定义为成员变量?
        变量是用来描述类的,如果变量是这个类的描述信息,就定义为成员变量,否则,应该定义在方法形参或者方法体内,即:局部变量
        变量定义的原则:范围越小越好,能被及时回收
    
    练习:
    1.定义长方形类,其中包含求周长(perimeter)和面积(area)的方法
        注意:由于没有必要单独获取长和宽,所以不用定义get方法
    2.定义员工类,自己分析有什么成员变量,包含一个显示所有成员变量的方法,然后测试.
    3.自定义计算类,提供基本的加减乘除运算,并测试.
    被计算的数和类之间没有从属关系,最好不定义成成员变量,而是方法的参数
    思考与练习

    2.6static(静态)修饰符

    2.6.1static关键字

    用于修饰成员(成员变量和成员方法),称为类成员
    被修饰后的成员具备以下特点:

    • 随着类的加载而加载
    • 优先于对象存在
    • 被这个类的所有对象所共享
    • 可以直接被类名调用,也可使用对象调用,推荐用类名调用,因为static修饰的成员就是类成员

    使用注意

    1. 静态方法只能访问静态成员(变量,方法)(不可以访问非静态因为加载顺序的原因)
    2. 静态方法中不可以写this,super关键字
      1. 非静态的方法可以访问静态成员

    /*
        测试类    
    */
    public class PersonDemo{
        public static void main(String[] args){
            Person p1 = new Person();
                  p1.name = "tom";
              p1.show();
                  p1.country = "USA";
               p1.show();
            
                Person p2 = new Person();
                 p2.name = "toms";
              p2.show();
        }
    }
    /*
        演示static关键字
    */
    public class Person{
          static String country = "China"; 
        String name;
               public void show(){
                System.out.println(country +","+ name);
        }
    }
    结果:

    China,tom
    USA,tom
    USA,toms

    note:通过对象.类成员变量调用竟然改变了类里面的类成员变量 和python有区别

    class A:
        country='USA'
        def __init__(self,name):
            self.name=name
    
        def chaNation(self,nation):
            self.country=nation
            
    a=A('wang')
    a.chaNation('china')
    print(a.country)
    
    b=A('li')
    print(b.country)
    
    结果:
    china
    USA
    与python区别

    静态变量(static)和实例变量(没static)的区别

    • 所属不同
    1. 静态变量属于类,也称为类变量
    2. 实例变量属于对象,也称为对象(实例)变量
    • 在内存中的位置不同
    1. 静态变量在方法区中
    2. 实例变量在堆内存
    • 生命周期不同
    1. 静态变量随着类的加载而加载,随着类的消失而消失
    2. 实例变量随着对象的创建而存在,随着对象的消失而消失
    • 调用方法不同
    1. 静态变量可以通过类名和对象名两种方式调动,推荐使用类名调用
    2. 实例变量只能使用对象名的方式调用

    2.6.2main方法的格式及传参

    public static void main(String[] args){...}

      • public:修饰符,用来控制访问权限的,后面讲
      • static:说明main方法是属于类的,通过类名直接调用,JVM不用创建对象就直接调用
      • void:返回值为空,main方法不用返回任何值
      • main:默认的程序入口,不是关键字,JVM从这里开始执行
      • String[] args:形参列表,String类型的数组
      • args:形参名,也就是数组名

    如何使用?早期用来从键盘接收参数的
    java Demo hello world java

    JDK1.5之后有了Scanner,基本不使用它了

    2.6.3工具类的制作

    1.写一个类,包含一个方法用来遍历一维数组

    2.使用static修饰,可以直接使用类名调用,方便在main中调用

    3.将这个类单独放到一个文件中,形成工具类

    4.可以继续定义更多的关于数组的操作,获取最值等,丰富工具类

     

    2.6.3工具类说明书的制作

    1.写一个完整的工具类,类要用public修饰
    2.类名上加@author,@version标签 /** */
    3.方法上加@param,@return标签
    4.注意,方法上标签中不用加类型
    5.使用以下命令生成文档
      javadoc -d mydoc -author -version ArrayTool.java

     

    1.在线版
    2.离线版
    3.关注事项:
    所在包
    构造方法
    形参,返回值类型
    是否是static的
    从哪个版本开始
    
    练习:猜数字(在循环时讲过)
    随机产生一个1-100之间的int型值
    从键盘输入一个数值与之对比,给出对比结果
    可以多次输入:猜中则结束,猜不中则继续
    API的使用与练习

    3.7代码块

    1.局部代码块
      在方法内部,用于限定变量的生命周期,及时释放内存
    2.构造代码块
      定义在成员位置,用于抽取不同构造方法中相同的部分运行在局部代码块之前
    3.静态代码块
      static修饰的构造代码块,用于对类进行初始化(即:static修饰的类变量)

    面试题:
    静态代码块(1),构造代码块(2),构造方法(3)的执行顺序和特点

    面试题1:

    :

    面试题2

     

  • 相关阅读:
    HTML5 开发工具收集
    (转载)flash as滤镜效果总结
    线性表

    AS3 库资源 很多非常有用的类库
    设计模式之简单工厂
    strcpy,strncpy,strcmp,strncmp,strcat,strlen..还有啥?
    设计模式学习之前言
    转CString 用法小结
    String类的构造函数,析构函数,赋值函数
  • 原文地址:https://www.cnblogs.com/wqbin/p/11146977.html
Copyright © 2011-2022 走看看