下面是小编整理的java面向对象学习心得(共含5篇),欢迎您阅读,希望对您有所帮助。同时,但愿您也能像本文投稿人“已黑化”一样,积极向本站投稿分享好文章。
我相信在各位学习的过程中,都会从书上看到面向对面和面向过程的定义,但是如何理解它们之间的区别和转换成自己的思想并运用在软件爱国过程中,我想很多初学者都不能很好的把握。下面我就对面向对象和面向过程做一个简单的分析。
面向过程,顾名思义,其中心意义在于“过程”二字,比如你要吃饭,那么首先是要选地,播种,施肥,成熟,收获,煮饭,然后才能吃饭,那么面向过程就是从开始到结束,分析出解决问题的需要的每一个步骤,然后用函数将这些步骤一个一个实现,使用的时候一个一个一次调用就行了。
面向对象,同样的,你去饭店吃饭的时候,只需要对服务员说一句你要吃饭就行了,你不需要关心饭是怎么来的,这就是面向对象。那么面向对象就是把组成问题事务分解成一个个对象,建立对象不是为了解决一个步骤,而是用来描述某个事务在解决问题步骤中的行为。面向对象是以功能来划分问题,而不是步骤。
以上的解释来源于书上,对于初学者而言,这样的描述过于抽象,不能很好的理解。下面我举个具体的例子来说明。
从书面上来说,可能面向过程更好理解,但是其实面向对象更符合人们的思考习惯。比如外面去商场买衣服,那么商场的功能就是提供衣服,你不需要关心衣服是怎么来的,你只需要向商场提出你要买衣服的要求就可以。就那贪吃蛇这个游戏而言,对于面向过程:1、吃一个;2、绘制画面;3判断是否死亡,就这样依次调用函数,一个一个步骤进行。
而对于面向对象,建立三个对象:1、蛇;2、画面系统;3、规则系统。首先进行操作,然后将操作后的结果提交至画面系统进行画面绘制,绘制之后的结果提交至规则系统判断是否死亡。这样一招功能来划分问题。
从上面的解释来看,面向对象和面向过程依然难以区分,但是如果我要返回上一步,那么对于面向过程而言,从初始状态到判断是否死亡到现实画面可能都需要改动。而对于面向对象则只需要重新设计画面系统,在里面保存上一步的坐标即可,这里不需要涉及到规则系统和其他操作。
面向对象的功能划分保证了面向对象的可扩展性。比如我需要为贪吃蛇重新改写一套规则,在面向过程中,规则已经渗透到整个程序的各个角落,改写不如重写。那么在面向对象中,则只需要重新设计规则系统即可。
其实面向对象和面向过程都强调代买重用,用了对象不代表你的程序就是面向对象,要做到局部改动需要足够的经验,很多人在用java编程时依旧是面向过程的思想(尽管在程序中使用的类和对象),这样的程序设计依然缺乏重用性和可移植性。
面向对象,正如张老师所说的只可意会,不能言传。是相对于面向过程而言的,是个相对的概念。我以前学过C语言,VB等面向过程,也学过C++,C#等面向对象的语言,然而PHP既是面向过程又是面向对象的语言,虽然面向对象的功能不是很强大,但这可以说明一点:面向过程和面向对象不是完全对立的,是可以共存的。有人认为面向对象是面向过程的替代品,我不这么认为。我个人认为,两种编程思想各有千秋。面向对象固然优越,但是要根据实际情况来看,也许有的问题使用面向过程要简单些,我们为什么要舍弃简单使用复杂的呢。对于我们现代的程序员来说,面向过程和面向对象同样重要,我们都要掌握,根据具体情况,择优选择使用开发思想。以上是我对面向对象的理解,也许由于现阶段的知识有限,理解还不是很深刻。但我坚信随着我知识的进一步提高,对于面向对象我会有新的理解。
JAVA是一种完全的面向对象的语言,因此在这里我们就不在谈论面向过程了。JAVA的面向对象同其他的面向对象的语言一样,同样支持OOP的三个基本特征:封装,继承,多态。
首先要理解对象和类的概念,类是某一类事物的描述,是抽象的,概念上的定义。而对象是类的一个实例。随着学习的深入,会对这两个概念有更加深刻的理解。类将数据和函数封装在一起,数据表示属性,函数表示行为。定义一个类使用class关键字。要创建一个新的对象,需要使用new关键字,例如:Person p=new Person( );变量p实际上是新产生的对象的引用句柄。通过张老师的讲解我们知道对象内存的分配是在堆内存中分配的,而引用变量的地址分配是栈内存中分配的。句柄中的值实际上是堆内存中为对象分配的地址空间的首地址。明白了这一点对于以后的关于内存的分配和垃圾的处理将会有更进一步的体会。如果把一个句柄的值置为空,那么在堆内存中分配的对象的地址空间的内容就不能再被引用,也就成为垃圾,等待垃圾回收器的处理。
张老师在视频中讲得关于对象的比较问题讲得很清楚,这也是我觉得最重要的收获,当然要先学会前面内存中的分配方法才可以真正的明白“==”和equals方法的不同。“==”用于比较两个变量的值是否相等,也就是给对象分配的首地址是否相等,即是否是同一对象。而equals()用于比较两个对象的内容是否相等。这两个对象不一定是同一个对象,只要内容相等就可以。
关于匿名对象,使用匿名对象有两种情况:1.如果一个对象只要一次方法调用。2。将匿名对象作为实参传递给函数调用。如:new person();这个语句没有产生句柄引用变量,直接用new关键字创建。待本语句执行完这个对象实际上就变成了垃圾。
为了实现类的封装性,需要在成员变量和成员函数前添加访问控制符:private ,public,protected。Private表示私有,只要同一个类的方法才可以访问。Public表示公有,任何类都可以访问。Protected表示受保护的,只有本类和本类的子类中的方法可以访问。为了方便实现类的封装性,我们一般将类的属性设为私有,将方法设为公有。通过类的封装性隐藏了类的实现细节,可以方便修改,增强了可维护性。
构造函数是类的一个重要内容,函数的名字与类名相同,不含有返回值,在方法中不能有return语句返回一个值,相当于对类进行初始化。访问控制符一定要用public,否则无法新建一个类的对象。通过构造函数的重载可以实现不同的初始化。
大三的时候学校组织我们去苏州NIIT参加四个月的java实训,我开始系统的学习期java,之前大学的时候学的比较宽泛,没有专门的正对java的学习。
首先我是从学习Java编程开始接触OOP(面向对象编程),刚开始使用Java编写程序的时候感觉很别扭,因为我早以习惯用C来编写程序,很欣赏C的简洁性和高效性,喜欢C简练而表达能力丰富的风格,特别忍受不了Java运行起来慢吞吞的速度,相对冗长的代码,而且一个很简单的事情,要写好多类,一个类调用一个类,心里的抵触情绪很强。
我对Java的面向对象的特性琢磨良久,自认为有所领悟,也开始有意识的运用OOP风格来写程序,然而还是经常会觉得不知道应该怎样提炼类,面对一个具体的问题的时候,会觉得脑子里千头万绪的,不知道怎么下手,一不小心,又会回到原来的思路上去。
举个例子,要发广告邮件,广告邮件列表存在数据库里面。倘若用C来写的话,一般会这样思考,先把邮件内容读入,然后连接数据库,循环取邮件地址,调用本机的qmail的sendmail命令发送。
然后考虑用Java来实现,既然是OOP,就不能什么代码都塞到main过程里面,于是就设计了三个类:
一个类是负责读取数据库,取邮件地址,调用qmail的sendmail命令发送;
一个类是读邮件内容,MIME编码成HTML格式的,再加上邮件头;
一个主类负责从命令读参数,处理命令行参数,调用发email的类。
把一件工作按照功能划分为3个模块分别处理,每个类完成一件模块任务。
仔细的分析一下,就会发现这样的设计完全是从程序员实现程序功能的角度来设计的,或者说,设计类的时候,是自低向上的,从机器的角度到现实世界的角度来分析问题的。因此在设计的时候,就已经把程序编程实现的细节都考虑进去了,企图从底层实现程序这样的出发点来达到满足现实世界的软件需求的目标。
这样的分析方法其实是不适用于Java这样面向对象的编程语言,因为,如果改用C语言,封装两个C函数,都会比Java实现起来轻松的多,逻辑上也清楚的多。
我觉得面向对象的精髓在于考虑问题的思路是从现实世界的人类思维习惯出发的,只要领会了这一点,就领会了面向对象的思维方法。
举一个非常简单的例子:假使现在需要写一个网页计数器,客户访问一次页面,网页计数器加1,计数器是这样来访问的后台有一个数据库表,保存每个id(一个id对应一个被统计访问次数的页面)的计数器当前值,请求页面一次,对应id的计数器的字段加1(这里我们忽略并发更新数据库表,出现的表锁定的问题)。
如果按照一般从程序实现的角度来分析,我们会这样考虑:首先是从HTTP GET请求取到id,然后按照id查数据库表,获得某id对应的访问计数值,然后加1,更新数据库,最后向页面显示访问计数。
现在假设一个没有程序设计经验的人,他会怎样来思考这个问题的呢?他会提出什么样的需求呢?他很可能会这样想:
我需要有一个计数器,这个计数器应该有这样的功能,刷新一次页面,访问量就会加1,另外最好还有一个计数器清0的功能,当然计数器如果有一个可以设为任意值的功能的话,我就可以作弊了。
做为一个没有程序设计经验的人来说,他完全不会想到对数据库应该如何操作,对于HTTP变量该如何传递,他考虑问题的角度就是我有什么需求,我的业务逻辑是什么,软件应该有什么功能。
不能错过的关于面向对象的java笔试题
第五章考试题
一、选择题:(每题3分,共20题) 1. 下面关于类的说法错误的一项是( )。
A、类属于Java语言中的复合数据类型 中的基本结构单位
C、类是同种对象的集合和抽象 2. 如下所示代码:
public class Test05_01{ }
private float a;
public static void m ( ){ }
D、类就是对象 B、对象是Java语言
如何使成员变量a被方法m( )访问( )。 A、将private float a改为public float a B、将private float a改为static float a C、将private float a改为protected float a D、将private float a改为float a
3. 下面关于类的说法有误的一项是( )。
A、类就是对象 抽象
C、类属于Java语言中的复合数据类型 中的基本结构单位
D、对象是Java语言
B、类是同种对象的集合和
关于Java面向对象的考试题。
4. 下列哪种类成员修饰符修饰的变量只能在本类中被访问( )。
A、protected
B、default
C、private
D、public
5. 下面关于方法的说法不正确的一项是( )。
A、类的私有方法不能被其他类直接访问。 B、Java中的构造方法名必须和类名相同。
C、方法体是对方法的实现,包括变量声明和合法语句。 D、如果一个类定义了构造方法,也可以用该类的默认构造方法。 6. 下列程序的运行结果是( )。
public class Test05_02 extends x{ }
B、编译错误
D、运行成功,但不输出
int ab{ }
public static void main(String[] args) { }
Test05_02 b = new Test05_02 (); b.ab(); static int a = 10; a++;
System.out.println(a);
A、10 C、11
关于Java面向对象的考试题。
7. 下面关于构造方法的描述有误的一项是( )。
A、构造方法必须要有返回类型的声明。
B、构造方法和类中的方法很相似:有访问修饰符、方法名、参数列表、方法体。
C、构造方法当成是一个特殊的方法,这个方法的作用就是用来产生一个类的实例。
D、构造方法的方法名必须和类名完全相同。 8. 下列关于对象的说法错误的一项是( )。
A、对象成员是指一个对象所拥有的属性或可以调用的方法。 B、由类生成对象,称为类的实例化过程,一个实例可以是多个对象。
C、在创建类的对象时,需要使用Java的new关键字。 D、在Java中要引用对象的属性和方法,需要使用“.”操作符来实现。
9. 类的方法可以不包含下面哪一项( )。
A、方法的参数 C、方法的名称
B、方法的主体 D、方法的返回值类型
10. 下面关于变量说法错误的一项是( )。
A、对于成员变量,我们可以不需要手动的显式初始化,因为系统在创建一个新的对象的时候,会给这些成员变量赋一个初值。 B、对于引用变量,它的默认初值是null而非相应的引用类型对象,也就是说,它并不是指向任何对象的首地址。
关于Java面向对象的考试题。
C、系统会对全局(成员)变量指定默认的值,也会对局部变量赋值。
D、局部变量在使用之前,必须对其进行显式初始化。
11. 下面的各种数据类型的默认初始化值表示错误的`一项是( )。
A、int是0
B、float 是0.0
C、char 是‘u0000’
D、boolean是false
12. 下面哪一项不是Java的访问控制符( )。
A、public
B、private
C、void
D、protected
13. Java语言类间的继承关系和接口间的继承关系分别是( )。
A、单继承、不能继承 C、多重继承、单继承
B、多重继承、不能继承 D、单继承、多重继承
14. 如果局部变量和成员变量同名,如何在局部变量作用域内引用成
员变量( )。
A、不影响,系统可以自己区分
B、不能引用,必须改名,使它们的名称不相同 C、在成员变量前加this,使用this访问该成员变量 D、在成员变量前加super,使用super访问该成员变量 15. 下列关于内部类说法错误的一项是( )。
A、内部类可用private或protected修饰符修饰 B、内部类不能有自己的成员方法和成员变量 C、除static内部类外,不能在类内声明static成员
D、内部类可以作为其他类的成员,而且可访问它所在的类的成
关于Java面向对象的考试题。
员
16. 定义外部类时不能用到的关键字是( )。
A、public
B、abstract
C、protected
D、final
17. 下面说法不正确的一项是( )。
A、abstract和final能同时修饰一个类 B、抽象类既可以做父类,也可以做子类
C、声明为final类型的方法不能在其子类中重新定义
D、抽象类中可以没有抽象方法,有抽象方法的类一定是抽象类或接口
18. 有一个类B,下面为其构造方法的声明,正确的是( )。
A、void b(int x) {} C、B(int x) {}
B、void B(int x) {}
D、b(int x) {}
19. 区分类中重载方法的依据是( )。
A、不同的形参名称
B、返回值的类型不同
D、访问权限不同
C、形参列表的类型和顺序
20. 下面说法错误的一项是( )。
A、在Java中,为了节省创建对象的时间和空间,对于一些常用的方法,会将它在内存中缓存起来。
B、在JDK中针对各种基本数据类型分别定义相应的引用类型,称之为封装类(Wrapper Classes)。
C、JDK5.0中,引入了自动装箱/拆箱功能,可以让我们方便的在简单类型和对应的封装类型数据之间转换。
在Java中要想对两个对象进行比较大小,需要实现Comparable接口或Comparator接口,String类型的值之所以可以比较大小(汉字根据ANSI值的大小进行比较),是因为String类实现了Comparable
两个对象进行比较方法一:实现Comparable
Person类是要比较的对象
package com.lym.comparator;/** * 人类 * 要使该类能进行比较,该类必须实现Comparable接口 * @author Administrator * */public class Person implements Comparable
{ private String name; private int age; public Person() { super(); } public Person(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return “Person [name=” + name + “, age=” + age + “]”; } //当前类按年龄由小到大排序 //1和-1调换后就是按年龄由大到小排序的 @Override public int compareTo(Person o) { if(o == null){ throw new NullPointerException(); } if(this.age>o.age){ return 1; }else if(this.age
实现Comparator
答:Comparable
自定义比较器类
{“ compareperson2=”compare(Person2“ else=”else“ gt=”>“ gtpackage=”>package“ if=”if“ implements=”implements“ int=”int“ java.util.comparator=”java.util.Comparator;“ lt=”}}<“ new=”new“ null=”null)“ nullpointerexception=”NullPointerException();“ o1=”=“ o1.getage=”(o1.getAge()“ o2=”=“ o2.getage=”o2.getAge())“ override=”@Override“ person2=”Person2“ person2gt=”person2><“ pre=”pre“ public=”public“ return=”return“ throw=”throw“ 空指针异常=”空指针异常“ 自定义比较器类=”自定义比较器类“>
Person2类
package com.lym.comparator;/** * 人类 * * @author Administrator * */public class Person2 { private String name; private int age; public Person2() { super(); } public Person2(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return ”Person2 [name=“ + name + ”, age=“ + age + ”]“; }}
对象比较器测试类
package com.lym.comparator;import java.util.Arrays;/** * 对象比较器测试类 * @author Administrator * */public class ComparableDemo { public static void main(String[] args) { String[] names = {”利亚“,”藤兰“,”泉彩“,”井空“,”岛爱“,”结衣“}; Person[] persons = { new Person(”泉彩“,23),new Person(”岛爱“,25), new Person(”藤兰“,41),new Person(”结衣“,35), new Person(”利亚“,28),new Person(”井空“,32) }; Person2[] persons2 = { new Person2(”泉彩“,23),new Person2(”岛爱“,25), new Person2(”藤兰“,41),new Person2(”结衣“,35), new Person2(”利亚“,28),new Person2(”井空",32) }; Arrays.sort(names); System.out.println(Arrays.toString(names)); //实现Comparable
★ 汇报对象
★ java个人简历
★ java年终总结
★ 面向大海优秀作文
★ 对象考察材料
★ 检讨书 处对象
★ 教学对象分析
★ 对象过生日说说