当我们创建一个对象的时候,我们可以通过‘对象、属性’的方式,对对象的属性进行赋值。 这里赋值操作要受到属性的数据类型和存储范围的制约,但是除此之外,没有其他制约条件。 但是实际问题中我们需要给这个属性赋值加入额外的限制条件这个额外条件就不能在属性的声明时体现,我们只能通过方法来进行限制条件的添加

private :私有的。当对属性加入这个条件的时候就不能直接调用这个方法了

public class fz {
    public static void main(String[] args) {
        Anim ani =new Anim();
        //ani.age=17;// 因为下面的年龄属性已经设置为私有的了 就不可以直接进行调用不然就以报错
        ani.setAge(13); // 设置年龄只能通过它内部提供的方法
        ani.name = "旺财";
        ani.info();   //名字是: 旺财,age: 13
        System.out.println(ani.getAge());  // 通过内部的获取方法
    }
}

class Anim{
    private int age;   // 给年龄加上限制条件
    String name;

    public void setAge(int num){
        if(num < 0){
            System.out.println("不好意思年龄不可以小于0");
        }else{
            age = num;
        }
    }

    public void info(){
        System.out.println("名字是: "+name+"age: "+age);
    }
    public int getAge(){   // 对外部提供一个获取的方法
        return age;
    }
}

封装代码性的体现:

我们将类的私有化(private)同时,提供了(public)方法来获取(get/set)来获取或者设置此属性的值

封装行性的体现:

1、private    2、不对外暴漏私有化方法  3、单例模式

封装的体现需要权限修饰符来配合:

java的4种权限(从小到大):private、缺省(什么都不写)、protected、pbulic

这4种权限都可以用来修饰类的内部结构:属性、方法、构造器、内部类

练习:

创建程序,在其中定义两个类:Person和PersonTest类。定义如下:
用setAge()设置人的合法年龄(0~130),用getAge()返回人的年龄。 在PersonTest类中实例化Person类的对象b,调用setAge()和 getAge()方法,体会Java的封装性。
public class Order {
    public static void main(String[] args) {
        PersonTest pt = new PersonTest();
        pt.info(17);
        System.out.println(pt.getinfo());

    }
}

class PersonTest{
    Person1 per = new Person1();
    public void info(int num){
        per.setAge(num);
    }

    public String getinfo() {
        return per.getAge();
    }
}

class Person1{
    private int age;

    public void setAge(int num){
        if(num >= 0 && num <=130 ){
            age = num;
        }else{
            System.out.println("您输入的年龄不合法");
        }
    }

    public String getAge(){
        return "您输入的年龄是:"+age;
    }
}

构造器:

其实我们之前就接触了构造器只不过是大家不清楚

Person per = new Person()   // 后面的Person()这个部分就是构造器

构造器的作用:

  创建对象,给对象初始化。  也就是构造器一步实现了。python中的__new__和__init__  方法

构造器的作用:创建对象;给对象进行初始化
如:Order o = new Order(); Person p = new Person(“Peter”,15);
如同我们规定每个“人”一出生就必须先洗澡,我们就可以在“人”的 构造器中加入完成“洗澡”的程序代码,于是每个“人”一出生就会自 动完成“洗澡”,程序就不必再在每个人刚出生时一个一个地告诉他们 要“洗澡”了。

说明:

  

如果没有现实构造器的话 系统默认提供一个空参数的构造器

构造器格式:
    权限修饰符   类名(形参列表){}  语法格式:        修饰符 类名 (参数列表) {        初始化语句;        }

eg:  public  person(){}  //这就是一个简答的构造器

在实例化类的时候就调用了 这个类的中的默认的构造器,一旦我们定义了构造器系统就不再提供默认的空参数构造器

 构造器的执行:当我们在实例化对象的时候 执行new就去调用了构造器

练习:

1. 在前面定义的Person类中添加构造器,利用构造器设置所有人的age属 性初始值都为18。
2. 修改上题中类和构造器,增加name属性,使得每次创建Person对象的同 时初始化对象的age属性值和name属性值。
编写两个类,TriAngle和TriAngleTest,其中TriAngle类中声明私有的底 边长base和高height,同时声明公共方法访问私有变量。此外,提供类 必要的构造器。另一个类中使用这些公共方法,计算三角形的面积。

this关键字

this关键字的使用:

用来修饰 属性、方法、 构造器

this理解为当前对象

eg:大家在给对象中的属性赋值的时候你的形参和当前的属性名一样的话 会被覆盖 会默认行参给行参传递参数,那么就需要用到this关键字了

通常情况下我们都选择省略this,如果方法的形参和属性同名时,我们必须显示使用this方法声明此变量是属性而非行参

我们可以通过this在另外一个方法中调用另外一个方法

    public PersonTest(int a, String name){

        this.getAge();   // 通过this来调用其他方法
        this.name =name;
        age = a;
    }

this调用构造器 :

当调用构造器的时候直接this(行参列表);来调用本类的指定的构造器;

构造器中不能通过this(行参列表);的方式调用自己,只能调用别的构造器
this(行参列表);必须声明在当前构造器的首行,(一个构造器内部只能有一个this调用其他的构造器)
 

练习:

public class lx {
    public static void main(String[] args) {
        Gol gol = new Gol("梁山伯",23);
        gol.shout();

        Girl girl = new Girl("朱丽叶", 38);
        girl.merry(gol);
        girl.compare(girl);
    }
}

class Gol{
    private int age;
    private String name;

    public Gol(){
    }

    public  Gol(String name){
        this.name = name;
    }

    public Gol(String name, int age){
        this.name = name;
        this.age = age;
    }
    public void setAge(int age){
        this.age = age;
    }
    public void setName(String name){
        this.name = name;
    }
    public int getAge(){
        return age;
    }
    public String getName(){
        return name;
    }
    public void merry(Girl girl){
        System.out.println("我想娶:"+girl.getName());
    }
    public void shout(){
        if(this.age > 22){
            System.out.println("你可以娶合法登记了");
        }else{
            System.out.println("滚回去长大了再来");
        }
    }

}

class Girl{
    private int age;
    private String  name;

    public Girl(){}
    public Girl(String name){
        this.name = name;
    }
    public Girl(String name, int age){
        this.name = name;
        this.age = age;
    }

    public void setAge(int age){
        this.age = age;
    }
    public void setName(String name){
        this.name = name;
    }
    public int getAge(){
        return age;
    }
    public String getName(){
        return name;
    }
    public void merry(Gol gol){
        System.out.println("我想嫁给:"+gol.getName());
        gol.merry(this);  // 把当前对象传递进去
    }

    /**
     *
     */
    public void compare(Girl girl){
        if(this.age >= girl.age){
            System.out.println("你可以嫁给他了");
        }else{
            System.out.println("不可以你需要再谈谈恋爱");
        }
    }

}

package关键字:

package关键字的使用:

1、为了更好的实现项目中类的管理,提供包的概念
2、使用package声明类或者接口属性,声明再源文件首行

同一个目录下不能命名相同的接口或者是类

.

面向对象的封装与隐藏 this的更多相关文章

  1. 2、C#面向对象:封装、继承、多态、String、集合、文件(上)

    面向对象封装 一.面向对象概念 面向过程:面向的是完成一件事情的过程,强调的是完成这件事情的动作. 面向对象:找个对象帮你完成这件事情. 二.面向对象封装 把方法进行封装,隐藏实现细节,外部直接调用. ...

  2. Java面向对象的封装

    封装是Java面向对象的三大特性之一,通常我们是通过包管理机制同时对类进行封装,隐藏其内部实现细节,通常开发中不允许直接操作类中的成员属性,所以属性一般设置为私有权限private,类中一般会给出一些 ...

  3. objective-c自学总结(三)---面向对象的封装,继承与多态

    面向对象的三大特性 封装 继承 多态 1.封装: 隐藏属性,方法或实现细节的过程称为封装 信息隐藏,隐藏对象的实现细节,不允许用户看到 将东西包装在一 然后以新的完整形式呈现出来 例如,两种或多种化学 ...

  4. 黑马程序员_Java面向对象1_封装

    3.面向对象_封装 3.1面向对象概念 3.1.1理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程:强调的是功能行为(执行者) 面向对象:将功能封装进对象,强调具备了 ...

  5. Java面向对象(封装性概论)

     Java面向对象(封装性概论) 知识概要:                   (1)面向对象概念 (2)类与对象的关系 (3)封装 (4)构造函数 (5)this关键字 (6)static关键 ...

  6. python 面向对象之封装与类与对象

    封装 一,引子 从封装本身的意思去理解,封装就好像是拿来一个麻袋,把小猫,小狗,小王八,小老虎一起装进麻袋,然后把麻袋封上口子.照这种逻辑看,封装='隐藏',这种理解是相当片面的 二,先看如何隐藏 在 ...

  7. Java面向对象之封装 入门实例(一)

    一.基础概念 (一)面向对象的三大特征:      1.封装         2.继承          3.多态 (二)封装:隐藏实现细节,对外提供公共的访问方式(接口). 封装的体现之一:将属性都 ...

  8. python面向对象编程 -- 封装、继承

    面向对象编程 -- 封装.继承 面向对象编程三要素:封装.继承和多态.本文主要看和封装.继承相关的概念:在python中多态的概念比较模糊,本文不做讨论. 1 封装 封装:将数据和操作组装到一起,对外 ...

  9. Python 入门基础19 --面向对象、封装

    2019.04.17 一.面向对象与面向过程 二.名称空间操作 三.类与对象的概念 四.语法 五.对象查找属性的顺序 2019.04.18 1.类与对象的所有概念:__init__方法 2.类的方法与 ...

随机推荐

  1. 使用background和background-image对CSS优先级造成影响

    在写一个关于背景图的CSS时候发现一个奇怪的现象, 原图: 如下代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitiona ...

  2. java窗口添加背景

    1.import javax.swing.ImageIcon; 2.import javax.swing.JFrame; 3.import javax.swing.JLabel; 4.import j ...

  3. iOS开发--轮播图

    在不少项目中,都会有图片轮播这个功能,现在网上关于图片轮播的框架层出不穷,千奇百怪,笔者根据自己的思路,用两个imageView也实现了图片轮播,这里说说笔者的主要思路以及大概步骤,具体代码请看这里, ...

  4. sdl2.0示例

    // gcc -o testDrone2_video testDrone2_video.c -lavcodec -lavformat -lswscale -lSDL2// g++ -o testDro ...

  5. IIC总线协议---以存储芯片at24c64为例

    IIC总线协议 前言:年前给老师做个红外抄表系统,,现在对当中用到的一些模块总结一下. 1.只有在总线空闲时才允许启动数据传送. 2.在数据传送过程中,当时钟线为高电平时,数据线必须保持稳定状态,不允 ...

  6. Unable to get the CMake version located at

    出现这个问题说明你没有安装CMake,这个是使用NDK的时候需要下载的,可以在as上点击下载, SDK Tool里面

  7. matlab知识

    matlab中cumsum函数通常用于计算一个数组各行的累加值. 调用格式及说明 matlab中cumsum函数通常用于计算一个数组各行的累加值.在matlab的命令窗口中输入doc cumsum或者 ...

  8. 第二章 微服务构建:Spring Boot

    此处介绍Spring Boot的目的除了它是Spring Cloud的基础外,也由于其自身的各项优点,如自动化配置.快速开发.轻松部署等,非常适合用作微服务架构中各项具体微服务的开发框架. 本章内容: ...

  9. js获取对象的最后一个

    Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致 (两者的主要区别是 一个 for-i ...

  10. sublime 可能卡的原因

    在重新安装编辑器的时候,配置javascript提示,发现这个插件安装之后,sublime变得非常卡,按照我电脑的性能,同时开着的atom敲代码都不卡.于是把这个插件卸载之后,sublime变得非常流 ...