欢迎大家来到IT世界,在知识的湖畔探索吧!
对象
对象有两个层次的概念,现实生活中对象指的是可观世界的实体;而程序中对象就是一组变量和相关方法的集合,其中变量表明对象的状态,方法表明对象所具有的行为。可以将现实生活中的对象经过抽象,映射为程序中的对象,对象是对现实的高度抽象。
类
对象在程序中是通过一种抽象数据类型来描述的,这种抽象数据类型称为类(Class)。
类是描述对象的“基本原型”,它定义一类对象所能拥有的数据和能完成的操作。在面向对象的程序设计中,类是程序的基本单元。
类和对象的关系
对象是类的一个实例,创建一个对象就是类进行了实例化,从代码角度讲就是在内存中开辟了一块新的地址空间运行程序。一个类可以创建无数个实例。(只要计算机的内存足够大),使用Java代码实现如下:
Car a6l=new Car ();
即对象a6l是类Car的一个实例。
属性
存储对象的状态,可以理解为变量。
方法
实现对象的行为,可以理解为函数。
上面是面向对象理论的解释,我们可以以买车为例,我们通常说买车,但是没有人能够买到车这个抽象的东东。我们必须,选定品牌,和具体的型号,然后才能到4s店买到车,然后开回家。这里的车就是类的概念,而我们买的具体车,例如奥迪,a6l,白色,2019款45 TFSI就是实例。关于车的品牌和颜色以及型号就是属性,而车具备的基础功能,例如启动、刹车我们可以将其定义为方法。
面向对象三原则
封装、继承、多态
封装
封装实际上是使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度。我们在使用api时,如果提供方不给我们源码,我们是无法知道其内部实现的,但是这并不会妨碍我们对api的使用。
Java的封装性通过关键字public、protected、private来体现。
- public可以修饰类、接口、方法、变量
- 默认(什么都不写)类、接口、方法、变量
- protected 可以修饰方法、变量
- private可以修饰方法和变量
具体权限请参考下表:
继承
继承性是面向对象程序设计语言的另一基本特征,通过继承可以实现代码的复用。继承而得到的类为子类,被继承的类为父类,所有直接或间接被继承的类都是父类。继承是子类利用父类中定义的方法和变量,就像它们属于子类自己一样。
Java中不支持多重继承。通过在类的声明中加入extends子句来创建一个类的子类:
Class SubClass extends SuperClass
{……}
如果缺省extends子句,则该类为java.lang.Object的子类。子类可以继承父类中访问权限设定为public、protected、default的成员变量和方法,但是不能继承访问权限为private的成员变量和方法。
特征:
(1)继承关系是传递的。如果类C继承类B,类B继承类A(多继承),则类C既有从类B那里继承下来的属性与方法,也有从类A那里继承下来的属性与方法,还可以有自己新定义的属性和方法。继承来的属性和方法尽管是隐式的,但仍是类C的属性和方法。继承是在一些比较一般的类的基础上构造、建立和扩充新类的最有效的手段。
(2)继承简化了人们对事物的认识和描述,能清晰体现相关类之间的层次结构关系。
(3)继承提供了软件复用功能。如果类B继承类A,则建立类B时只需要再描述与基类(类A)不同的少量特征(数据成员和成员方法)即可。这种做法能减小代码和数据的冗余度,大大增加程序的重用性。
(4)继承通过增强一致性来减少模块间的接口和界面,大大增加了程序的易维护性。
(5)提供多重继承机制。从理论上说,一个类可以是多个一般类的特殊类,它可以从多个一般类中继承属性与方法,这便是多重继承。Java出于安全性和可靠性的考虑,仅支持单重继承,而通过使用接口机制来实现多重继承。
示例代码:
父类
public class Car {
public String brand=null;
public void drive(){
System.out.println(“Car的drive方法。”);
}
}
子类
public class Audi extends Car {
public String brand =”Audi”;
}
子类使用父类中的drive方法
Audi au=new Audi();
au.drive();
多态
多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
多态有两种表现形式:重载和覆盖。
重载(overload),是发生在同一类中。与父类和子类、继承毫无关系。
标识一个函数除了函数名外,还有函数的参数(个数和类型)。也就是说,一个类中可以有两个或更多的函数叫同一个名字,而他们的参数不同。他们之间毫无关系,是不同的函数,只是可能他们的功能类似,所以才命名一样,增加可读性,仅此而已!以junit4中常用的断言assertArrayEquals为例,他的作用就是进行数组比较(函数同名),而数组又分为不同的类型,例如:boolean[]、byte[],char[],long[]等等(参数不同),如下图所示:
覆盖(override),是发生在子类中!也就是说必须有继承的情况下才有覆盖发生。
我们知道继承一个类,就有了父类的全部方法,如果你感到哪个方法不合适,功能要变,那就把那个函数在子类中重新实现一遍。这样再调用这个方法的时候,就是执行子类中的过程了。父类中的函数就被覆盖了。(当然,覆盖的时候函数名和参数要和父类中完全一样,不然你的方法对父类中的方法就不起任何作用,因为两者是两个函数,毫不关系)
示例代码:
父类
public class Car {
public String brand=null;
public void drive(){
System.out.println(“Car的drive方法。”);
}
}
子类重写父类中的dirve方法
public class Audi extends Car {
public String brand =”Audi”;
public void drive(){
System.out.println(“Audi的drive方法。”);
}
}
调用子类的drive方法
Audi au=new Audi();
au.drive();
执行Audi类的drive方法,而不是Car类的drive方法,控制台输出:Audi的drive方法。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/49814.html