本文目录一览:
- 1、介绍一下java的面向对象
- 2、java的面向对象是什么意思,能不能用通俗的话解释一下?
- 3、JAVA中什么是面向对象
- 4、北大青鸟java培训:41条面向对象经验?
- 5、java面向对象如何创建对象?
- 6、java面向对象的特征有哪些方面
介绍一下java的面向对象
1、面向对象
面向对象(Object Oriented)是一种新兴的程序设计方法,或者是一种新的程序设计规范(paradigm),其基本思想是使用对象、类、继承、封装、多态等基本概念来进行程序设计。从现实世界中客观存在的事物(即对象)出发来构造软件系统,并且在系统构造中尽可能运用人类的自然思维方式。
2、对象
对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。一个对象由一组属性和对这组属性进行操作的一组服务组成。
类的实例化可生成对象,一个对象的生命周期包括三个阶段:生成、使用、消除。
当不存在对一个对象的引用时,该对象成为一个无用对象。Java的垃圾收集器自动扫描对象的动态内存区,把没有引用的对象作为垃圾收集起来并释放。当系统内存用尽或调用System.gc( )要求垃圾回收时,垃圾回收线程与系统同步运行。
3、类
类是具有相同属性和方法的一组对象的集合,它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和方法两个主要部分。在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名并包括属性和方法两个主要部分。
Java中的类实现包括两个部分:类声明和类体。
类声明
其中,修饰符public,abstract,final 说明了类的属性,className为类名,superclassName为类的父类的名字,interfaceNameList为类所实现的接口列表。
类体
成员变量限定词的含义:
static: 静态变量(类变量)
final: 常量;transient: 暂时性变量,用于对象存档,用于对象的串行化
volatile: 贡献变量,用于并发线程的共享
方法的实现也包括两部分内容:方法声明和方法体。
方法声明
方法声明中的限定词的含义:
static: 类方法,可通过类名直接调用
abstract: 抽象方法,没有方法体
final: 方法不能被重写
native: 集成其它语言的代码
synchronized: 控制多个并发线程的访问
方法声明包括方法名、返回类型和外部参数。其中参数的类型可以是简单数据类型,也可以是复合数据类型(又称引用数据类型)。
对于简单数据类型来说,java实现的是值传递,方法接收参数的值,但不能改变这些参数的值。如果要改变参数的值,则用引用数据类型,因为引用数据类型传递给方法的是数据在内存中的地址,方法中对数据的操作可以改变数据的值。
方法体
方法体是对方法的实现,它包括局部变量的声明以及所有合法的Java指令。方法体中声明的局部变量的作用域在该方法内部。若局部变量与类的成员变量同名,则类的成员变量被隐藏。
为了区别参数和类的成员变量,我们必须使用this。this用在一个方法中引用当前对象,它的值是调用该方法的对象。返回值须与返回类型一致,或者完全相同,或是其子类。当返回类型是接口时,返回值必须实现该接口。
构造方法
构造方法是一个特殊的方法。Java 中的每个类都有构造方法,用来初始化该类的一个对象。
构造方法具有和类名相同的名称,而且不返回任何数据类型。
重载经常用于构造方法。
构造方法只能由new运算符调用
4、面向对象的基本特性
封装
封装性就是尽可能的隐藏对象内部细节,对外形成一道边界,只保留有限的接口和方法与外界进行交互。封装的原则是使对象以外的部分不能随意的访问和操作对象的内部属性,从而避免了外界对对象内部属性的破坏。
可以通过对类的成员设置一定的访问权限,实现类中成员的信息隐藏。
private:类中限定为private的成员,只能被这个类本身访问。如果一个类的构造方法声明为private,则其它类不能生成该类的一个实例。
default:类中不加任何访问权限限定的成员属于缺省的(default)访问状态,可以被这个类本身和同一个包中的类所访问。
protected:类中限定为protected的成员,可以被这个类本身、它的子类(包括同一个包中以及不同包中的子类)和同一个包中的所有其他的类访问。
public:类中限定为public的成员,可以被所有的类访问。
继承
子类的对象拥有父类的全部属性与方法,称作子类对父类的继承。
Java中父类可以拥有多个子类,但是子类只能继承一个父类,称为单继承。
继承实现了代码的复用。
Java中所有的类都是通过直接或间接地继承java.lang.Object类得到的。
子类不能继承父类中访问权限为private的成员变量和方法。
子类可以重写父类的方法,即命名与父类同名的成员变量。
Java中通过super来实现对父类成员的访问,super用来引用当前对象的父类。super 的使用有三种情况:
访问父类被隐藏的成员变量,如:super.variable;
调用父类中被重写的方法,如:super.Method([paramlist]),super()调用父类构造方法;
调用父类的构造函数,如:super([paramlist]);
多态
对象的多态性是指在父类中定义的属性或方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为。这使得同一个属性或方法在父类及其各个子类中具有不同的语义。例如:"几何图形"的"绘图"方法,"椭圆"和"多边形"都是"几何图"的子类,其"绘图"方法功能不同。
Java的多态性体现在两个方面:由方法重载实现的静态多态性(编译时多态)和方法重写实现的动态多态性(运行时多态)。
编译时多态:在编译阶段,具体调用哪个被重载的方法,编译器会根据参数的不同来静态确定调用相应的方法。
运行时多态:由于子类继承了父类所有的属性(私有的除外),所以子类对象可以作为父类对象使用。程序中凡是使用父类对象的地方,都可以用子类对象来代替。一个对象可以通过引用子类的实例来调用子类的方法。
重载(Overloading)
方法重载是让类以统一的方式处理不同数据类型的手段。
一个类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法。
返回值类型可以相同也可以不相同,无法以返回型别作为重载函数的区分标准。
重写(Overriding)
子类对父类的方法进行重新编写。如果在子类中的方法与其父类有相同的的方法名、返回类型和参数表,我们说该方法被重写 (Overriding)。
如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。
子类函数的访问修饰权限不能低于父类的。
java的面向对象是什么意思,能不能用通俗的话解释一下?
面向对象的简单理解就是,你可以把现实中的每一件物品都看作是一个对象,这个物品的信息看作是对象属性,物品功能看作是对象方法
比如,身份证,这是一个对象,身份证上的姓名,籍贯地址,开卡所,有效期等等信息看作是这个对象的属性,身份证可以刷卡,那么刷卡这个动作就是身份证对象的方法/事件
再比如你开的车子,车子本身是对象,车辆类型,购买时间,里程数,手动/自动,耗油数,座位数,等等这些属于这两车子的信息都是属性,前进,转弯,后退,这些动作都是车辆方法;比如保养,年审,事故,修改里程公里数等等这些东西也是车辆的方法,但也同时是车辆的事件,所以这里单独称为事件方法,事件是方法,方法不一定是事件.不知道说的清楚吗
JAVA中什么是面向对象
在java的学习中,面向对象应该是java技术的重中之重,虽然在生活中没有对象可以面对,但在技术中还是要一直接触面对对象,而且不可避免。今天对面向对象来了一个小总结。
一、面向对象的特点:
1、将复杂的事情简单化。
2、面向对象将以前的过程中的执行者,变成了指挥者。
3、面向对象这种思想是符合现在人们思考习惯的一种思想。
过程和对象在我们的程序中是如何体现的呢?过程其实就是函数;对象是将函数等一些内容进行了封装。
二、匿名对象使用场景:
1、当对方法只进行一次调用的时候,可以使用匿名对象。
2、当对象对成员进行多次调用时,不能使用匿名对象。必须给对象起名字。
三、在类中定义其实都称之为成员。成员有两种:
1、成员变量:其实对应的就是事物的属性。
2、成员函数:其实对应的就是事物的行为。
所以,其实定义类,就是在定义成员变量和成员函数。但是在定义前,必须先要对事物进行属性和行为的分析,才可以用代码来体现。
四、类中怎么没有定义主函数呢?
注意:主函数的存在,仅为该类是否需要独立运行,如果不需要,主函数是不用定义的。主函数的解释:保证所在类的独立运行,是程序的入口,被jvm调用。
五、成员变量和局部变量的区别:
1、成员变量直接定义在类中;局部变量定义在方法中,参数上,语句中。
2、成员变量在这个类中有效;局部变量只在自己所属的大括号内有效,大括号结束,局部变量失去作用域。
3、成员变量存在于堆内存中,随着对象的产生而存在,消失而消失;局部变量存在于栈内存中,随着所属区域的运行而存在,结束而释放。
六、构造函数和一般函数有什么区别呢?
1、两个函数定义格式不同。
2、构造函数是在对象创建时,就被调用,用于初始化,而且初始化动作只执行一次。
一般函数,是对象创建后,需要调用才执行,可以被调用多次。
七、创建一个对象都在内存中做了什么事情?
1、先将硬盘上指定位置的Person.class文件加载进内存。
2、执行main方法时,在栈内存中开辟了main方法的空间(压栈-进栈),然后在main方法的栈区分配了一个变量p。
3、在堆内存中开辟一个实体空间,分配了一个内存首地址值。new
4、在该实体空间中进行属性的空间分配,并进行了默认初始化。
5、对空间中的属性进行显示初始化。
6、进行实体的构造代码块初始化。
7、调用该实体对应的构造函数,进行构造函数初始化。
8、将首地址赋值给p ,p变量就引用了该实体。(指向了该对象)
北大青鸟java培训:41条面向对象经验?
(1)所有数据都应该隐藏在所在的类的内部。
(2)类的使用者必须依赖类的共有接口,但类不能依赖它的使用者。
(3)尽量减少类的协议中的消息。
(4)实现所有类都理解的最基本公有接口[例如,拷贝操作(深拷贝和浅拷贝)、相等性判断、正确输出内容、从ASCII描述解析等等].(5)不要把实现细节(例如放置共用代码的私有函数)放到类的公有接口中。
如果类的两个方法有一段公共代码,那么就可以创建一个防止这些公共代码的私有函数。
(6)不要以用户无法使用或不感兴趣的东西扰乱类的公有接口。
(7)类之间应该零耦合,或者只有导出耦合关系。
也即,一个类要么同另一个类毫无关系,要么只使用另一个类的公有接口中的操作。
(8)类应该只表示一个关键抽象。
包中的所有类对于同一类性质的变化应该是共同封闭的。
一个变化若对一个包影响,则将对包中的所有类产生影响,而对其他的包不造成任何影响.(9)把相关的数据和行为集中放置。
设计者应当留意那些通过get之类操作从别的对象中获取数据的对象。
这种类型的行为暗示着这条经验原则被违反了。
(10)把不相关的信息放在另一个类中(也即:互不沟通的行为)。
朝着稳定的方向进行依赖。
(11)确保你为之建模的抽象概念是类,而不只是对象扮演的角色。
类应当统一地共享工作。
(13)在你的系统中不要创建全能类/对象。
对名字包含Driver、Manager、System、Susystem的类要特别多加小心。
规划一个接口而不是实现一个接口。
(14)对公共接口中定义了大量访问方法的类多加小心。
大量访问方法意味着相关数据和行为没有集中存放。
(15)对包含太多互不沟通的行为的类多加小心。
这个问题的另一表现是在你的应用程序中的类的公有接口中创建了很多的get和set函数。
(16)在由同用户界面交互的Java面向对象模型构成的应用程序中,模型不应该依赖于界面,界面则应当依赖于模型。
(17)尽可能地按照现实世界建模(我们常常为了遵守系统功能分布原则、避免全能类原则以及集中放置相关数据和行为的原则而违背这条原则).(18)从你的设计中去除不需要的类。
一般来说,我们会把这个类降级成一个属性。
(19)去除系统外的类。
系统外的类的特点是,抽象地看它们只往系统领域发送消息但并不接受系统领域内其他类发出的消息。
(20)不要把操作变成类。
质疑任何名字是动词或者派生自动词的类,特别是只有一个有意义行为的类。
考虑一下那个有意义的行为是否应当迁移到已经存在或者尚未发现的某个类中。
(21)我们在创建应用程序的分析模型时常常引入代理类。
在设计阶段,我们常会发现很多代理没有用的,应当去除。
(22)尽量减少类的协作者的数量。
一个类用到的其他类的数目应当尽量少。
(23)尽量减少类和协作者之间传递的消息的数量。
(24)尽量减少类和协作者之间的协作量,也即:减少类和协作者之间传递的不同消息的数量。
(25)尽量减少类的扇出,也即:减少类定义的消息数和发送的消息数的乘积。
(26)如果类包含另一个类的对象,那么包含类应当给被包含的对象发送消息。
也即:包含关系总是意味着使用关系。
(27)类中定义的大多数方法都应当在大多数时间里使用大多数数据成员。
(28)类包含的对象数目不应当超过开发者短期记忆的容量。
这个数目常常是6.当类包含多于6个数据成员时,可以把逻辑相关的数据成员划分为一组,然后用一个新的包含类去包含这一组成员。
(29)让系统功能在窄而深的继承体系中垂直分布。
(30)在实现语义约束时,最好根据类定义来实现。
这常常会导致类泛滥成灾,在这种情况下,约束应当在类的行为中实现,通常是在构造函数中实现,但不是必须如此。
(31)在类的构造函数中实现语义约束时,把约束测试放在构造函数领域所允许的尽量深的包含层次中。
(32)Java面向对象中,约束所依赖的语义信息如果经常改变,那么最好放在一个集中式的第3方对象中。
(33)约束所依赖的语义信息如果很少改变,那么最好分布在约束所涉及的各个类中。
(34)类必须知道它包含什么,但是不能知道谁包含它。
(35)共享字面范围(也就是被同一个类所包含)的对象相互之间不应当有使用关系。
(36)继承只应被用来为特化层次结构建模。
(37)派生类必须知道基类,基类不应该知道关于它们的派生类的任何信息。
(38)基类中的所有数据都应当是私有的,不要使用保护数据。
电脑培训认为类的设计者永远都不应该把类的使用者不需要的东西放在公有接口中。
(39)在理论上,继承层次体系应当深一点,越深越好。
(40)在实践中,继承层次体系的深度不应当超出一个普通人的短期记忆能力。
一个广为接受的深度值是6.(41)所有的抽象类都应当是基类。
java面向对象如何创建对象?
java作为互联网编程中使用范围最广泛的编程语言之一,我们有许多的知识是需要掌握学习的,今天java课程培训机构就给大家分析讲解一下java面向对象的编程方法有哪些。
常用的创建对象的模式有以下几种:
一.工厂模式
工厂模式抽象了具体对象的过程,用函数来封装以特ing接口创建对象的细节。
如下:
functioncreateAnimal(name,age){
varo=newObject();
o.name=name;
o.age=age;
o.sayName=function(){
alert(this.name);
}
returno;
}
varcat=createAnimal("cat",12);
vardog=createAnimal("dog",3);
工厂模式虽然解决了创建多个相似兑现过的问题,但是却没有解决对象识别的问题。
二.构造函数模式
构造函数模式可以创建特定类型的对象。
functionAnimal(name,age){
this.name=name;
this.age=age;
this.sayName=function(){
alert(this.name);
}
}
varcat=newAnimal("cat",12);
vardog=newAnimal("dog",3);
可以使用对象的constructor属性或instanceof操作符来标识对象类型。
cat.constructor==Animal//true
catinstanceofAnimal//true
三.原型模式
每个函数都有一个prototype(原型)属性。这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。
使用原型对象的好处是,可以让所有对象实例共享它所包含的属性和方法。
functionAnimal(){}
Animal.prototype.name="animal";
Animal.prototype.age=1;
Animal.prototype.sayName=function(){
alert(this.name);
}
vartest1=newAnimal();
test1.sayName();//"animal"
vartest2=newAnimal();
test2.sayName();//"animal"
alert(test1.sayName===test2.sayName);//true
或者:
functionAnimal(){}
Animal.prototype={
constructor:Animal,
name:"animal",
age:1,
sayName:function(){
alert(this.name);
}
};
原型中所有属性是被很多实例共享的,通过在实例上添加一个同名属性,可以隐藏原型中的对应属性。但是,对于包含引用类型值的属性来说,问题就比较明显了。
java面向对象的特征有哪些方面
众所周知,Java是一种面向对象性的语言。而面向对象,Obeject Oriented,是一种编程术语。面向对象是当今软件开发方法的主流方法之一,他是把数据以及对数据的操作放在一起,作为一个相互依存的整体,就是我们所说的对象。那么Java面向对象的特征又是什么?下面就一起来看看Java面向对象的四大特征:
特征一:抽象
抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象不打算了解全部问题,而是选择其中的一部分,暂时不用部分细节。抽象包括两个方面:过程抽象;数据抽象。
特征二:继承
继承是一种连接类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类的继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且派生类可以修改或者增加新的方法使之更适合特殊的需要。
特征三:封装
封装是指将客观事物抽象成类,每个类对自身的数据和方法实行保护。类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
特征四:多态
多态是指允许不同类的对象对同一消息做出响应。多态包括参数化多态和包含多态。多态性语言具有灵活、抽象、行为共享、代码共享等优势,很好地解决了应用程序函数同名问题。Java中实现多态主要是方法的重载和方法的覆盖。