java⽗类对象赋值给⼦类对象_Java⾯向对象概念详解
对象
对象有两个层次的概念,现实⽣活中对象指的是可观世界的实体;⽽程序中对象就是⼀组变量和相关⽅法的集合,其中变量表明对象的状态,⽅法表明对象所具有的⾏为。可以将现实⽣活中的对象经过抽象,映射为程序中的对象,对象是对现实的⾼度抽象。
对象在程序中是通过⼀种抽象数据类型来描述的,这种抽象数据类型称为类(Class)。
类是描述对象的“基本原型”,它定义⼀类对象所能拥有的数据和能完成的操作。在⾯向对象的程序设计中,类是程序的基本单元。
类和对象的关系
对象是类的⼀个实例,创建⼀个对象就是类进⾏了实例化,从代码⾓度讲就是在内存中开辟了⼀块空间运⾏程序。⼀个类可以创建⽆数个实例。(只要计算机的内存⾜够⼤),使⽤Java代码实现如下:
Car a6l=new Car ();
即对象a6l是类Car的⼀个实例。
属性
存储对象的状态,可以理解为变量。
⽅法
实现对象的⾏为,可以理解为函数。
上⾯是⾯向对象理论的解释,我们可以以买车为例,我们通常说买车,但是没有⼈能够买到车这个抽象的东东。我们必须,选定品牌,和具体的型号,然后才能到4s店买到车,然后开回家。这⾥的车就是类的概念,⽽我们买的具体车,例如奥迪,a6l,⽩⾊,2019款45 TFSI 就是实例。关于车的品牌和颜⾊以及型号就是属性,⽽车具备的基础功能,例如启动、刹车我们可以将其定义为⽅法。
⾯向对象三原则
java类的概念封装、继承、多态
封装
封装实际上是使⽤⽅法将类的数据隐藏起来,控制⽤户对类的修改和访问数据的程度。我们在使⽤api时,如果提供⽅不给我们源码,我们是⽆法知道其内部实现的,但是这并不会妨碍我们对api的使⽤。
Java的封装性通过关键字public、protected、private来体现。
public可以修饰类、接⼝、⽅法、变量
默认(什么都不写)类、接⼝、⽅法、变量
protected 可以修饰⽅法、变量
private可以修饰⽅法和变量
具体权限请参考下表:
java关键字在⾯向对象中的应⽤
继承
继承性是⾯向对象程序设计语⾔的另⼀基本特征,通过继承可以实现代码的复⽤。继承⽽得到的类为⼦类,被继承的类为⽗类,所有直接或间接被继承的类都是⽗类。继承是⼦类利⽤⽗类中定义的⽅法和变量,就像它们属于⼦类⾃⼰⼀样。
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[]等等(参数不同),如下图所⽰:
assertArrayEquals重载应⽤
覆盖(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⽅法。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。