面向对象的三大特征:封装、继承、多态
1封装:属性私有化,对外提供统一访问的get/set接口。完全封装
封装指的是将对象的状态信息(属性)和行为(方法)捆绑为一个逻辑单元的机制。将类的某些信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的方法实现对隐藏
信息的操作与访问。
java中通过将数据封装声明为私有的(private),再提供一个或多个公开的(public)方法实现对该属性的操作,以实现下述目的:
(1).隐藏一个类的实现细节
(2).防止对封装数据未经授权的访问。使用者只能通过事先制定好的方法来访问数据,可以方便的加入控制逻辑,限制对属性的不合理操作。
(3)有利于保证数据的完整性
(4)便于修改,增强代码的可维护性。
为了实现良好的封装,需要从两方面考虑:
(1)将对象的属性和实现细节隐藏起来,不允许外部直接访问
(2)把方法暴露出来,让方法来操作或访问这些属性
实现封装的关键是不要让方法直接访问其他类的属性,程序应该只能通过指定的方法与对象的数据交互。封装赋予对象”黑盒”特性,这是实现重用性和可靠性的关键。
使用访问控制符:(private、默认、protected、public)
(1)private:访问控制级别:如果类里的一个成员(包括属性或方法)使用private访问控制符来修饰,则这个成员只能在该类的内部被访问。显然,这个访问控制符修饰属性最合适,使用它来修饰属性就可把属性隐藏在类的内部。
(2)default访问控制权限(包访问权限):如果类里的一个成员(包括属性和方法)或则一个顶级类不使用任何访问控制符,我们就成他为默认的访问控制,defaule访问控制的成员或顶级类可以被相同包下的其他类访问。
(3)protected访问控制权限(子类访问权限):如果一个成员(包括属性和方法)使用protected访问控制修饰符,那么这个成员既可以被同一包中的其他类访问,也可以被不同包中的子类访问。通常情况下,如果protected来修饰一个方法,通常是希望其子类重用这个方法。
(4)public访问控制权限(公共访问权限):这是一个最宽松的访问控制级别,如果一个成员(包括属性和方法)或者一个顶级类使用public修饰,这个成员或顶级类就可以被所有的类访问。不管访问类和被访问类是否处于同一个包中,是否具有父子类继承关系。
定义一个Animals类
public class Animals { //定义属性 private String name; private int age; public void Info(){ System.out.println("我是一只动物"); } //定义输出名字name和年龄age的方法 public void ToString(String name,int age){ System.out.println("name:"+this.getName()+",age:"+this.getAge()); } //定义属性存值取值的get()/set()方法 public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
2.继承:
继承的特点:
(1)java通过extends关键字来实现,实现继承的类被称为子类,被继承的类被称为父类,有时候也称为基类、超类。
(2)在继承关系中,父类更通用,子类更具体,父类具有更一般的特征和行为,而子类除了具有父类的特征之外还具有自己特有的特征和行为。
继承的好处:
(1).代码的复用
(2).为了以后多态的使用
继承来的东西:
(1).一般的属性和方法被继承
(2).构造方法不被继承
(3).私有的方法不被继承
(4)私有的属性被隐藏,可以通过继承来的公有方法访问
(5).什么时候建立父子类关系:任何A出现的地方,换做是B之后仍然成立,或者说:“B is a A”,如果符合这个公式,就可以建立父子类关系。
对于构造方法来使:
构造方法第一行不是super(...)就是this(...),如果一个构造方法第一行不是this(...)或super(...),则默认是对父类无参构造的调用super(...);不可能所有的构造都是this(...),至少有一个super(...);
注意:
在子类中使用和父类同样名字的属性没有意义,对实际开发没有任何好处,所以应该避免。
如果子类中有和父类名字相同的方法:
(1).如果参数不同,构成了重载
(2).如果参数相同,构成了重写
重写:覆盖、复写
(1).发生在父子类中
(2).同名同参同返回类型
(3).子类方法的修饰符不能比父类方法的修饰符更封闭。(要么相同、要么更开放)
(4)private--默认--protected--public
(5)子类方法抛出的异常不能比父类方法抛出的异常更宽泛
this()和super():
(1).this指本类对象
(2)Super指父类对象
a).可以通过super.来访问父类的属性或方法,属性的话注意修饰符的作用范围。
b).子类可以通过super(..)访问父类的构造方法,给属性赋值
c)如果子类构造方法中没有对本类及父类构造方法的调用,则默认有super(...);
d)如果一个类没有指定继承其他父类,则它的父类是Object.
定义一个子类Cat在定义一个子类Dog都继承自类Animals
Cat类:
public class Cat extends Animals{ //定义子类特有属性 private String food; //定义子类特有属性的get()/set()方法 public String getFood() { return food; } public void setFood(String food) { this.food = food; } public void Info(){ System.out.println("我是一只小猫"); } }
Dog类:
public class Dog extends Animals{ //定义私有属性 private String food; public void Infomation(){ System.out.println("我是一只小狗"); } public String getFood() { return food; } public void setFood(String food) { this.food = food; } }
3.多态:一个对象,多种状态。父类引用指向子类的对象。
多态的两个基本原理:
(1).发生多态时,只能调用父类的方法,不能调用子类的方法
(2).发生多态时,如果子类中重写了父类的方法,在调用这个方法,调用的是子类重写之后的方法。
写一个测试类TestAnimal:
public class TestAnimal { public static void main(String[] args) { //多态 Animals cat = new Cat(); //在子类Cat中重写了父类Info()方法,所以在调用这个方法时,调用的是子类重写之后的方法。 cat.Info(); //在子类Dog中没有重写父类的Info()方法,所以子类对象调用该方法时,调用的是父类的该方法 Animals dog = new Dog(); dog.Info(); //发生多态时,只能调用父类的方法,不能调用子类的方法.这里Infomation()是子类的方法,所以发生多态是子类对象无法调用子类方法 //dog.Infomation(); } }
输出结果:
我是一只小猫
我是一只动物