接着上次讲面向对象,这次先讲隐藏和封装,看了李刚的这本书我才知道,原来访问控制符共分四个级别,我一直以为先c+样只有private,protected,public原来还有default这种基于private和protected之间,和private的区别就是default支持同一个包间的访问。看到default大家不要以为是什么关键字,其实就是private,protected,public一个都不写,我一直以为不写就是private这下长见识了。然后给了个良好封装的例子eg
- public class Person
- {
- private String name;
- private int age;
- public Person()
- {
- }
- public Person(String name , int age)
- {
- this.name = name;
- this.age = age;
- }
- public void setName(String name)
- {
- //执行合理性校验,要求用户名必须在2~6位之间
- if (name.length() > 6 || name.length() < 2)
- {
- System.out.println("您设置的人名不符合要求");
- return;
- }
- else
- {
- this.name = name;
- }
- }
- public String getName()
- {
- return this.name;
- }
- public void setAge(int age)
- {
- //执行合理性校验,要求用户年龄必须在0~100之间
- if (age > 100 || age < 0)
- {
- System.out.println("您设置的年龄不合法");
- return;
- }
- else
- {
- this.age = age;
- }
- }
- public int getAge()
- {
- return this.age;
- }
- }
也就是符合javabean的类。
然后讲了包的概念,这个用IDE的花就不需要花太多时间关心,然后讲了个jdk1.5后的一个新用法 import static用于引入类的静态属性eg
- public class TestStaticImport
- {
- public static void main(String[] args)
- {
- //out是java.lang.System类的静态属性,代表标准输出
- //PI是java.lang.Math类的静态属性,表示常量
- out.println(PI);
- }
- }
接下来到了面向对象的重点:继承,多态。这里所讲的东西和我以前总结的差不多,明天我将整理好贴出来。
但书中也讲了个不错的多态的例子,eg
- class BaseClass
- {
- public int book = 6;
- public void base()
- {
- System.out.println("父类的普通方法");
- }
- public void test()
- {
- System.out.println("父类的被覆盖的方法");
- }
- }
- public class SubClass extends BaseClass
- {
- //重新定义一个book实例属性覆盖父类的book实例属性
- public String book = "轻量级J2EE企业应用实战";
- public void test()
- {
- System.out.println("子类的覆盖父类的方法");
- }
- public void sub()
- {
- System.out.println("子类的普通方法");
- }
- public static void main(String[] args)
- {
- //下面编译时类型和运行时类型完全一样,因此不存在多态
- BaseClass bc = new BaseClass();
- //输出 6
- System.out.println(bc.book);
- //下面两次调用将执行BaseClass的方法
- bc.base();
- bc.test();
- //下面编译时类型和运行时类型完全一样,因此不存在多态
- SubClass sc = new SubClass();
- //输出"轻量级J2EE企业应用实战"
- System.out.println(sc.book);
- //下面调用将执行从父类继承到的base方法
- sc.base();
- //下面调用将执行从当前类的test方法
- sc.test();
- //下面调用将执行从当前类的sub方法
- sc.sub();
- //下面编译时类型和运行时类型不一样,多态发生
- BaseClass ploymophicBc = new SubClass();
- //输出 6 —— 表明访问的是父类属性
- System.out.println(ploymophicBc.book);
- //下面调用将执行从父类继承到的base方法
- ploymophicBc.base();
- //下面调用将执行从当前类的test方法
- ploymophicBc.test();
- //因为ploymophicBc的编译类型是BaseClass,BaseClass类没有提供sub方法
- //所以下面代码编译时会出现错误。
- //ploymophicBc.sub();
- }
- }
记住最重要的一点:子类对象直接赋给父类引用变量时,运行是调用的是子类的方法,父类的属性,属性不具多态性