面向对象和面向过程的区别:
1.面向过程:大象装冰箱(3步:打开冰箱,放大象,关冰箱)
2.面向过程:创造一个大象(new 一个大象实例),让大象走进冰箱(调用大象实例的走进冰箱的方法)
3.总结:
面向过程:侧重的是过程
优点:简单
缺点:代码量大的情况下,维护性特别差
面向对象:侧重的是对象,上帝视角,需要什么创建什么
优点:可扩展性非常强,维护成本低,复用性强,可读性高………
缺点:新手上手难
所有的面向对象程序设计语言都有三个特性:封装、继承和多态
tip:另外需要说下面向对象不是某个语言,也不是某个语言特有的东西,而是一种编程思想。
一、封装
1.封装是对象和类概念的主要特性。
2.对象:万物皆对象
3.类:具有相同特性和行为的对象组成的集合就是类,JAVA实际中的类就是指一个数据类型
4.类和对象的关系:类是对象的抽象,而对象是类的具体实例。
可以理解为类是图纸,对象是根据图纸画好的物品
代码如下:
public class Lamp { //创建一个灯的图纸
String color = "白光";
String power = "220瓦";
private String chengben = "2元";//这里体现了对成员变量的控制
public void onoff(int a){
if(a == 1){
System.out.println("开灯");
}else {
System.out.println("关灯");
}
}
}
public class client {
public static void main(String[] args) {
//假设有一个买来一个灯,输入1,就是开灯,输入0,就是关灯
Lamp lamp = new Lamp();//根据灯的图纸造灯
lamp.onoff(1);
lamp.onoff(0); //进行封装无需对内部构造了解
System.out.println(lamp.power);//查看灯的功率
System.out.println(lamp.color);//查看灯的功率
//System.out.println(lamp.chengben);//查看灯的成本,这里体现了对成员变量的控制
}
}
作用
作用1:将具体的实现细节装到一个容器中,想要使用直接调用就行,不用在意内部实现细节
如灯和开关,使用者只要控制开关就可以控制灯的状态,而不需要了解电路是怎样铺设的。
作用2::可以对成员变量进行更精确的控制(通过public,private等修饰实现)
二、继承
1.继承:子类可以自动拥有父类中除了私有内容的其他所有内容。
当出现x是一种y的时候,x就可以继承y
2.当然如果子类对父类给的东西(属性和方法)不满意也可以进行方法重写
代码如下:
父类:
public class Liyuan{
String name = "李渊";
private void weakness(){
System.out.println("李渊怕老婆");
}
public void sky(){
System.out.println("李渊的天下");
}
public void xingshi(){
System.out.println("姓李");
}
}
子类:
public class Lishimin extends Liyuan{
public void sky(){
System.out.println("李世民的天下");//对父类的天下不满意进行重写
}
public static void main(String[] args) {
Lishimin lishimin = new Lishimin();
lishimin.xingshi();//子类可以拥有父类的非私有部分
lishimin.sky();
System.out.println(lishimin.name);
// lishimin.weakness();//私有类型不能继承
}
}
作用
作用:简化代码的开发
三、多态
1.多态是指同一个对象具有多个不同表现形式或形态的能力。
2.多态实现的三个必要条件:继承,方法重写,父类引用指向子类对象
3.父类类名 引用名称 = new 子类类名();(父类引用指向子类对象)
4.比如猫和狗是都是动物 --> 继承关系,动物就有了猫和狗两种表现形式和能力
5.把子类的对象赋值给父类的引用(变量)向上转型,会屏蔽子类中特有的方法,如果想继续使用子类特殊方法就得向下转型,而且得是强转
代码如下:
父类:
public class Animl {
public void eat(){
System.out.println("动物吃东西");
}
}
Cat子类:
public class Cat extends Animl {
public void eat(){
System.out.println("猫吃鱼");
}
public void catchmouse(){
System.out.println("猫会抓老鼠");
}
}
Dog子类:
public class Dog extends Animl {
public void eat(){
System.out.println("狗吃骨头");
}
}
Elephant子类:
public class Elephant {
public void eat(){
System.out.println("大象吃香蕉");
}
}
操作类:
public class Client {
// public static void feed(Cat cat){
// cat.eat();
// }
// public static void feed(Dog dog){
// dog.eat();
// }
public static void feed(Animal animal){
animal.eat();
}
public static void main(String[] args) {
Animal cat = new Cat();//向上转型
Animal dog = new Dog();
feed(cat);
feed(dog);
// ((Cat) cat).catchmouse(); //向下转型
}
}
此外因为java没有多继承,所以引入了接口类型,使得java的类可以多继承。
不过因为是接口所以不叫继承,而是类实现多个接口。
作用
作用:把不同数据类型进行统一