面向对象的三大特征:封装、继承、多态

1封装:属性私有化,对外提供统一访问的get/set接口。完全封装

封装指的是将对象的状态信息(属性)和行为(方法)捆绑为一个逻辑单元的机制。将类的某些信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的方法实现对隐藏

信息的操作与访问。

java中通过将数据封装声明为私有的(private),再提供一个或多个公开的(public)方法实现对该属性的操作,以实现下述目的:

(1).隐藏一个类的实现细节

(2).防止对封装数据未经授权的访问。使用者只能通过事先制定好的方法来访问数据,可以方便的加入控制逻辑,限制对属性的不合理操作。

(3)有利于保证数据的完整性

(4)便于修改,增强代码的可维护性。

为了实现良好的封装,需要从两方面考虑:

(1)将对象的属性和实现细节隐藏起来,不允许外部直接访问

(2)把方法暴露出来,让方法来操作或访问这些属性

实现封装的关键是不要让方法直接访问其他类的属性,程序应该只能通过指定的方法与对象的数据交互。封装赋予对象黑盒特性,这是实现重用性和可靠性的关键。

使用访问控制符:(private、默认、protectedpublic)

(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();
}
}

输出结果:

我是一只小猫    
我是一只动物