面向对象语言特性之封装

来源:互联网 发布:em getsel vb 编辑:程序博客网 时间:2024/05/22 06:36

面向对象语言有三大特性:封装,继承,多态。

封装 (encapsulation),隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读取和修改的访问级别。

封装就是把类的一些信息隐藏起来,不允许外部程序直接访问,而是通过这个类提供的方法来实现对内部隐藏的信息的访问和操作。

一句话:什么是封装?封装就是隐藏内部实现,稳定外部接口,保护数据安全。

封装的好处显而易见:便于使用者正确使用,防止错误修改属性;松耦合,提高了系统独立性;提高了代码重用性。

封装的步骤

  1. 把属性用private修饰符修饰,成员变量只能在当前类中访问
  2. 设置public的setter和getter方法,供外部调用
  3. 使用public的方法访问

示例:

public class Person {    //用private修饰属性    private String name;     private int age;    //设置setter和getter方法    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;    }}class Test{    public static void main(String[] args) {        Person p = new Person();        //调用etter和getter方法访问属性        p.setName("张三");              p.setAge(18);        System.out.println(p.getName());    }}

包是封装思想的一种体现。包的实质是一种访问控制机制。
包,使用package关键字,用来管理类文件,包的声明必须是在JAVA源文件的第一句非注释语句,一个源文件只能有一个包的声明语句。
使用包的好处:1,类似文件夹的概念,方便查找相应的类文件;2,防止命名冲突,在不同包中的类可以重名;3,在更广的范围内保护类、数据和方法。

 package 包名; //例如 package cn.beida.javagroup.mypackage;

在当前包中访问其他包中的类,要先导入那个类所在的包,使用关键字import,
package只能有一句,但是import 可以有多句。

 package cn.beida.javagroup.mypackage; import java.util.Scanner; import cn.beida.online.*; import cn.beida.animal.Dog;

同名不同包的类出现在同一个类中时,要用完整的包限定名来声明类

com.oop.Dog     dog1 = new com.oop.Dog();com.oop.pet.Dog dog2 = new com.oop.pet.Dog();

访问权限控制

类的访问修饰符有两个,public 和 默认修饰符;public 修饰的类在不在同一个包中都可以访问;默认修饰符修饰的类只能在同包中访问。(默认修饰符就是类名前什么也不写)

public class Person{  //public 修饰的类}class Student{  //默认修饰符修饰的类}

类的成员访问修饰符有四个,用来修饰成员变量和成员方法:

同一个类中 同一个包中 子类中 其他地方 private 可以访问 不可以访问 不可以访问 默认修饰符 可以访问 可以访问 不可以访问 protected 可以访问 可以访问 可以访问 public 可以访问 可以访问 可以访问

static修饰符

static 用来修饰成员变量和成员方法,使用static修饰的属性和方法属于类,可以通过类名加“.”直接调用,(也可以通过实例访问,但不建议)。
使用static修饰的变量叫做静态变量;
使用static修饰的方法叫做静态方法;
使用static修饰的代码块叫做静态代码块;

静态变量或静态方法,静态代码块位于JVM的方法区,当JVM加载类时,会把静态区一起加载到内存中去。当main方法里的语句还没执行时,静态区的代码已经执行完了。

静态变量

也叫做类变量,在内存中只有一个拷贝;在类的内部可以直接访问,在其他类中通过类名访问;
而实例变量是通过实例访问,每创建一个实例,就会为实例变量分配一次内存。

静态变量会在编译期间系统自动初始化并赋默认值为0;静态变量的好处是能被所有实例共享,如果类的所有实例包含一个相同的常量属性,可以把这个属性定义为静态常量类型,从而节省内存,如:static final PI = 3.14;

注意:静态变量只能定义在类里,不能定义在方法里。

静态方法

静态方法由类名直接调用;不能直接访问实例变量和实例方法,只能访问静态变量和静态方法;静态方法必须被实现;静态方法中不能有this或super;

实例方法由实例调用,可以访问静态变量,静态方法,实例变量,实例方法。

静态代码块

JVM加载类时加载静态代码块,如果有多个静态块,就按顺序加载,每个静态块只会被执行一次。

示例:

public class Vote {    //static修饰属性    private static int count;   //投票数, 所有人都会改变同一个数    private static final int MAX_COUNT = 100;//最大投票数,    private String name;//投票人的姓名    //构造方法    public Vote(String name){        this.name = name;    }    //投票方法    public void voteFor(){        if(count == MAX_COUNT){            System.out.println("投票结束");        }else{            System.out.println("谢谢  "+this.name+"  的投票");            count++;        }    }    //static 修饰方法    public static void printResult(){        System.out.println("投票总数是"+count);    }}public class VoteTest {    public static void main(String[] args) {        Vote v1 = new Vote("jim");        Vote v2 = new Vote("jane");        v1.voteFor();        v2.voteFor();        for(int i = 1; i < 99; i++){            Vote v = new Vote("v"+i);            v.voteFor();        }        Vote v3 = new Vote("tom");        v3.voteFor();        //静态方法用类名来调用        Vote.printResult();    }}
原创粉丝点击