面向对象有三大特性,分别是:封装、继承和多态。
封装:面向对象的封装就是把描述一个对象的属性和行为的代码封装在一个类中,有些属性是不希望公开的,或者说被其他对象访问的,所以我们使用private修饰该属性,使其隐藏起来;类中提供了方法(用public修饰),常用的是get、set方法,可以操作这些被隐藏的属性,其他类可以通过调用这些方法,改变隐藏属性的值!
封装是保证软件部件具有优良的模块性的基础,封装的目标就是要实现软件部件的“高内聚、低耦合”,防止程序相互依赖性而带来的变动影响。在面向对象的编程语言中,对象是封装的最基本单位,面向对象的封装比传统语言的封装更为清晰、更为有力。
举例:把姓名和年龄封装到人的类中,name和age用private修饰,提供public的set和get方法。外部想操作name,age字段,只能通过set和get方法
public class People{ private String name; private int age; public void setName(String name) { this.name = name; } public String getName() { return name; } public void setAge(int age) { this.age = age; } public int getAge() { return age; } }
继承:在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,使用extends关键字实现继承;子类中可以加入若干新的内容,或修改原来的方法使之更适合特殊的需要,这就是继承。继承是子类自动共享父类数据和方法的机制,这是类之间的一种关系,提高了软件的可重用性和可扩展性。
继承的格式:
class 父类 { ... } class 子类 extends 父类 { ... }
举例:
/** 定义父类*/ class Fu{ String name; // 定义name属性 // 定义员工的工作方法 public void work() { System.out.println("尽心尽力地工作"); } } /** 定义讲师类Teacher 继承 员工类Employee */ class Zi extends Fu{ // 定义一个打印name的方法 public void printName() { System.out.println("name=" + name); } } /** 定义测试类 */ public class Demo01 { public static void main(String[] args) { // 创建一个讲师类对象 Zi zi = new Zi(); // 为该员工类的name属性进行赋值 zi.name = "小明"; // 调用该员工的printName()方法 zi.printName(); // name = 小明 // 调用Teacher类继承来的work()方法 zi.work(); // 尽心尽力地工作 } }
举例:
class Fu { public void show() { System.out.println("Fu show"); } } class Zi extends Fu { //子类重写了父类的show方法 public void show() {
//子类可以根据需要,定义特定于自己的行为。既沿袭了父类的功能名称,又根据子类的需要重新实现父类方法,从而进行扩展增强。
} } public class Demo02{ public static void main(String[] args) { Zi z = new Zi(); // 子类中有show方法,只执行重写后的show方法 z.show(); // Zi show } }
父类的构造方法不能继承也不能重写。
this.成员变量 ‐‐ 本类的 super.成员变量 ‐‐ 父类的 this.成员方法名() ‐‐ 本类的 super.成员方法名() ‐‐ 父类的
public abstract class A{ public abstract void run(); }
public class Cat extends A{ public void run (){ System.out.println("小猫在墙头走~~~"); } } public class CatTest { public static void main(String[] args) { // 创建子类对象 Cat c = new Cat(); // 调用run方法 c.run(); } } 输出结果: 小猫在墙头走~~~
接口
接口是Java语言中一种引用类型,是方法的集合,如果说类的内部封装了成员变量、构造方法和成员方法,那么接口的内部主要就是封装了方法。它与定义类方式相似,但是使用 interface 关键字。
接口不能创建对象,但是可以被实现( implements ,类似于被继承)。一个实现接口的类(可以看做是接口的子类),需要实现接口中所有的抽象方法,创建该类对象,就可以调用方法了。
举例:
public interface InterFaceName { public void method(); }
class 类名 implements 接口名 { // 重写接口中方法【必须】 }
举例:
//定义接口 public interface People{ // 定义抽象方法 public abstract void eat(); public abstract void sleep(); } //定义实现类 public class XiaoMing implements People{ @Override public void eat() { System.out.println("吃东西"); } @Override public void sleep() { System.out.println("晚上睡"); } } //定义测试类 public class InterfaceDemo { public static void main(String[] args) { // 创建子类对象 Peoplel p = new XiaoMing(); // 调用实现后的方法 p.eat(); p.sleep(); } } 输出结果: 吃东西 晚上睡
class 类名 [extends 父类名] implements 接口名1,接口名2,接口名3... { // 重写接口中抽象方法【必须】 }
举例:
//定义接口
多态:多态就是在声明时使用父类或接口,在实现或调用时使用具体的子类或实现类;即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性,多态增强了软件的灵活性和扩展性。这里可以举个例子,比如声明时使用的是动物类,调用时传递的是一个猫类(动物类的子类)的对象,具体执行父类里动物——吃的方法时,实际执行的是猫——吃的方法。
父类类型 变量名 = new 子类对象;
变量名.方法名();
Fu f = new Zi();
f.method();
父类类型:指子类对象继承的父类类型,或者实现的父接口类型。
Fu f = new Zi();//实现类为Zi Fu f1 = new Zi1();、、实现类为Zi1 public void method(Fu f){ ..... //方法入参为Fu,对象f,f1都可以传入,这就是多态的一种应用 //父类定义一个方法,两个子类都有自己的实现,传入哪个子类,就调用哪个子类的方法 }
父类类型 变量名 = new 子类类型(); 如:Animal a = new Cat();
子类类型 变量名 = (子类类型) 父类变量名;
如:Cat c =(Cat) a;