Java面向对象(二)
来源:互联网 发布:怎么接淘宝家具安装 编辑:程序博客网 时间:2024/04/29 21:43
封装
封装就是先装再封的过程!
假如没有封装,可能是:
public class Person { public String name; public int age;}
Person p = new Person();p.age = 9527; // 合法,却不合理
为了避免合法,却不合理的使用类的属性,可以将类的属性使用更加严格的访问权限,避免外部恶意的访问:
public class Person { // ... private int age;}
为了使得类的外部,依然可以使用这个属性,则可以提供更加宽松的权限的方法:
public class Person { // ... private int age; public void setAge(int personAge) { age = personAge; }}
Person p = new Person();p.setAge(9527);
由于定义方法,在方法的内部,可以根据项目的业务,对属性的值进行控制:
public class Person { // ... private int age; public void setAge(int personAge) { if (personAge >= 18 && personAge <= 70) { age = personAge; } }}
Person p = new Person();p.setAge(9527); // 设置age属性的值失败!
为了保证在类的外部,还可以获取到该属性的值,还需要另外创建一个方法,用于获取该属性值:
public class Person { // ... private int age; // ... setAge() ... public int getAge() { return age; }}
Person p = new Person();System.out.println(p.getAge());
所以,封装最直接的目的是:
- 使用1种数据类型表示多种数据;
- 使得访问数据变得更加安全,避免出现合法却不合理的数据;
更多……
小结
所以描述类的特征的,特别是用于“装”多个属性的类,应该把所有的属性都声明成私有的,并且提供公有的set???()方法和get???()方法!
访问权限
继承
继承的本质是扩展,是一种利用已有的类,快速创建新的类的机制!
假如没有继承:
public class Cat { public void run() { } public void eat() { } public void sleep() { } public void catchMouse() { }}
public class Dog { public void run() { } public void eat() { } public void sleep() { }}
在没有继承的情况下,可能多种类都需要定义相同的属性,或相同的方法,创建类的过程就相对非常繁琐,当有了继承之后:
public class Animal { public void run() { } public void eat() { } public void sleep() { }}
public class Cat extends Animal { public void catchMouse() { }}
在继承关系中,被继承的类通常称之为父类,也可以称之为基类,或超类,英语为Super Class,得到继承关系的类通常称之为子类,也可以称之为派生类,英语为Sub Class!
在Java中,如果某个类没有显式的继承自其它类,则默认继承自java.lang.Object类;
Java语言是一门单继承的语言,所有的类都只可以有1个直接父类;
当实现了继承关系后,子类将获得父类中所有属性和方法,除了构造方法和static成员!
从Java官方(Oracle)的文档中,仅有具有访问权限的成员,才会被子类继承!
从创建对象的角度上来说,当创建子类的对象时,一定会先创建父类的对象,包括父类中声明为私有的成员!所以,基于父类扩展出来的子类的对象中,是包括父类的所有成员的!
重写
重写(Override / Overwrite)指的是在子类中,重新编写父类中已经声明的方法;
当父类中的方法不足以描述子类的行为特征时,则可以在子类中进行重写;
某个对象执行方法时,到底是执行父类的方法,还是子类的方法,完全取决于这是哪个类的对象,即:如果创建的对象是子类的,则执行子类的方法!如果子类中没有重写,则子类会继承得到父类的方法,可以理解为执行了父类的方法!
重写的原则是:与父类的方法保持相同的名称、参数列表、返回值类型,且不得使用比父类的方法更严格的访问权限!
- java面向对象(二)
- java面向对象(二)
- Java 面向对象(二)
- java-面向对象(二)
- Java面向对象(二)
- Java面向对象(二)
- Java面向对象(二)
- java面向对象(二)
- Java面向对象(二)
- Java面向对象(二)
- Java面向对象(二)
- Java面向对象(二)
- java面向对象(二)
- Java面向对象(二)
- java 面向对象二
- Java面向对象二
- JAVA面向对象二
- Java基础 (二)(面向对象)
- 蛇形填数
- 数据结构与算法之最短路径--迪杰斯特拉算法
- FragmentTabHost切换Fragment时避免重复加载UI(ViewPager切换Fragment时也适用)
- LeetCode-303. Range Sum Query - Immutable
- getifaddr函数及相关结构体总结
- Java面向对象(二)
- CS231n--assignment 1--KNN
- CoordinatorLayout+AppBarLayout+CollapsingToolbarLayout全解析
- 创建多线程的三种方式
- C语言中的函数调用和函数返回值
- java的类和对象
- tabhost基本用法(二)
- Java面向对象(三)
- makefile