学习面向对象的三条主线之二 面向对象的三大特征
1. 面向对象的三特征之一: 封装
使用者对类内部定义的属性(对象的成员变量)的直接操作会导致数据的错误、混乱或安全性问题.封装的好处:隐藏实现的细节、更安全、更容易维护.
2. 面向对象思想"落地"法则(二)
Java中通过将数据声明为私有的(private),再提供公共的(public)方法:getXxx()和setXxx()实现对该属性的操作,以实现下述目的:
- 隐藏一个类中不需要对外提供的实现细节;
- 使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作;
- 便于修改,增强代码的可维护性.
3. Java的访问控制权限
Java权限修饰符public/protected/private置于类的成员定义前,用来限定对象对该类成员的访问权限.
- 对于class的权限修饰只可以用public和default(缺省);
- Public: 无论是包内还是包外,均可任意访问;
- protected:包内均可以访问,包外仅限于子类;
- 默认:权限仅限于包内;
- private:仅限于同一个类,连子类都不能访问,更别谈是同包中的其他类.
4. 面向对象的三特征之二: 继承性
继承的思想: 多个类中存在相同的属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只需要继承那个类即可.
规则:
(1) 子类继承了父类,就继承了父类的方法和属性;
(2) 在子类中,可以使用父类中定义的方法和属性,也可以创建新的数据和方法;
(3) 子类不能直接访问父类中私有的(private)的成员变量和方法;
(4) Java只支持单继承,不允许多重继承.
继承要注意的几点:
(1) 属性不可重写,属性可以覆盖。就是子类的属性可以重新赋值,覆盖父类的值;
(2) 属性没有多态性,属性值取决于引用类型。如果B是A的子类,那么A a = new B()属性的值取决于A类;
(3) 方法可以重写,方法有多态性;
(4) 方法的行为取决于对象而不取决于引用类型。也就是说,如果B是A的子类,那么A a = new B(); 方法的值取决于B类;
(5) 生成子类对象必须调用父类构造方法,子类构造方法必须和父类构造方法匹配.
5. 面向对象的三大特征之三: 多态
所谓多态就是指同一种行为在不同的对象上有不同的表现形式. 在java中有两种体现:
(1) 方法的重载(overload)和重写(overwrite)。
(2) 对象的多态性 :父类的引用指向子类对象实体
可以直接应用在抽象类和接口上
多态思想的应用实例:
JDBC
6. 关键词
(1) 匿名对象
匿名对象就是没有别名的对象,比如 new Person("张三",20).
(2) String类
String类属于引用数据类型,不属于基本数据类型。每创建的一个String字符串都是一个对象。
有静态初始化和动态初始化两种方式,它们存储的区域不同.
静态初始化,是存储在字符串常量池:
String s1 = "Hello,China!";
如果使用静态初始化方式再重新创建一个内容一模一样的String对象,String s3="Hello,China",那么会先在字符串常量池中查找是否有相同的内容,如果有那么s3就指向刚才创建的s1的内容。因此他们是同一个对象。
动态初始化是存储在堆内存中:
String s2 = new String("Hello,China!");
如果使用动态初始化方式再创建一个内容一模一样的String对象,String s4="Hello,China",不会去查找堆内存是否有相同,只会在新的堆内存中重新划分一块区域去存储新的对象。因此他们是不同的对象。
(3) 常用的String类型
charAt(int index)//返回指定下标的字符
compareTo(String s)//字符串比较
contact(String s)//字符串拼接
contain()//包含字符串
equals()//判断两个字符串内容是否相同
getBytes()//返回字节数组
indexOf()//查找字串下标
lastIndexOf()//查找最后字串下标
split()//分隔字符串返回字符串数组
subString()//获取字串
toString()//对象转换为字符串
toUpperCase()//转换为大写字母
toLowerCase()//转换为小写字母
(4) 引用传递
引用传递的本质是传值. 通过引用传递可以改变实参对象的内容,但不能改变实参对象本身. 也就是说可以使用静态复制的方法改变对象的内容,但是不能通过new一个新对象去改变原实参.
(5) 方法重写与方法重载
方法重写:Override/Overwrite,子类重写了从父类继承过来的方法.
方法重载:Overload,方法的名字相同,参数的个数、类型、次序不同.
相同点:都是多态性的表现,方法重写属于一种动态的多态性。方法重载属于静态多态性.
不同点:方法重写有继承,方法重载无继承.