Java编程基础-面向对象(上)

一、面向对象的概念

1、概念:面向对象是把解决的问题按照一定规则划分为多个独立的对象,然后通过调用对象的方法来解决问题。当然,一个应用程序会包含多个对象,通过多个对象的相互配合来实现应用程序的功能。这样当应用程序功能发生变动时,只需要修改个别对象就可以了,从而使代码更容易得到维护。面向对象强调的是对象,它使复杂的内容简单化了,让我们从执行者变成了指挥者。

2、特点:面向对象的特点概括起来就是继承性、封装性和多态性。

3、 封装性:封装是面向对象的核心思想,将对象的属性和行为封装起来,不需要让外界直到具体实现细节,这就是封装思想。(example:用户使用电脑,只要用手指敲击键盘就行了,不需要知道电脑内部是如何工作的。)封装隐藏了对象的属性实现的细节,仅对外提供公共访问形式。好处是将变化隔离,便于使用,提高重用性和安全性。

封装的原则:将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共方法对其访问。

二、类的定义

1、类与对象:类是对某一类事物的抽象描述,而对象用于表示现实中该类事物的个体。也可以说类是一组相关的属性和行为的集合(成员变量和方法)。Java中最基本的单位是类。

2、类的定义内容:类是对象的抽象,它用于描述一组对象的共同特征和行为。类中可以定义成员变量和成员方法,其中成员变量用于描述对象的特征,也被称作属性,成员方法用于描述对象的行为,可简称为方法或函数。

代码示例:

[java] view plain copy

  1. public class Student {// class关键字表示类,后面紧跟类名,Student是类名,表示声明一个公有的学生类
  2. // 定义属性
  3. String name;// 成员变量name-->姓名,String是该变量的类型
  4. int age; // 成员变量age-->年龄,int是该变量的类型
  5. // 定义成员方法(函数)
  6. public void study() {// 定义一个学习方法
  7. System.out.println(name + "正在学习!");
  8. // 在成员方法study()中可以直接访问成员变量name
  9. }
  10. }

注意:在java中,定义在类中的变量被称为成员变量,定义在方法中的变量被称为局部变量,如果在某一个方法中定义的局部变量与成员变量同名,这种情况是允许的,此时方法中通过变量名访问到的是局部变量,而并非成员变量。

三、创建与使用对象

1、创建对象:程序想要完成具体的功能,仅有类是远远不够的,还需要根据类创建实例对象。在java中可以使用new关键字来创建对象。创建对象的过程也称实例化。具体格式如下:

类型  变量名=new 类名();

如创建一个Student类的对象:Student stu=new Student();

在上面代码中,“new Student() “用于创建Student类的一个实例对象,” Student stu
“则是声明了一个Student类型变量stu。中间等号用于将Student对象在内存中的地址值赋值给变量stu,这样变量stu便持有了对象的引用。

2、属性的赋值和访问:

赋值语法-->变量名.属性名=属性值;

访问语法-->变量名.属性名

3、方法的调用:变量名.方法名(<param>,..),如果该方法需要参数,则加入相应的参数。

4、成员变量的默认初始化值:在实例化对象时,java虚拟机会自动为成员变量进行初始化,针对不同类型的成员变量,java虚拟机会赋予不同的初始值。

byte、short和int类型的成员变量默认初始化值为0,long类型成员变量默认初始化值为0L,float和double类型成员变量的默认初始化值分别为0.0f和0.0d,char类型默认为空字符,boolean类型默认为false,引用类型默认为null.

代码示例:

[java] view plain copy

  1. public class Student {
  2. String name;// 成员变量name-->姓名,String是该变量的类型
  3. int age; // 成员变量age-->年龄,int是该变量的类型
  4. public void study() {// 定义一个学习方法
  5. int age = 21;// 同名的局部变量
  6. System.out.println(age + "岁的" + name + "正在学习!");
  7. }
  8. }

测试:

[java] view plain copy

  1. public static void main(String[] args) {
  2. Student stu1 = new Student();// 创建第一个学生实例
  3. stu1.name = "张三";// 给第一个学生名字初始化为张三
  4. System.out.println(stu1.name + " " + stu1.age);// 打印第一个学生的姓名和年龄
  5. stu1.study();// 调用study()方法
  6. Student stu2 = new Student();// 创建第二个学生实例
  7. stu2.study();// 调用study()方法
  8. }

输出结果为:

张三 0

21岁的张三正在学习!

21岁的null正在学习!

简单分析:由于第一个学生对象的年龄并没有初始化,所以系统会使用默认值,int类型的默认值为0,所以输出结果为 :张三 0

由于在study()方法中定义了同名的局部变量age,所以第一个学生对象在调用该方法是访问的是局部变量的age,而不是成员变量的age。所以输出21岁的张三正在学习!

第二个学生对象由于name属性没有赋初值,所以使用默认值null,同样调用study()方法访问的是局部变量age,所以输出结果为:21岁的null正在学习!

5、成员变量和局部变量的区别:

a)在作用域上,成员变量的作用域是整个类中都可以访问,而局部变量的作用域是定义它的方法内或语句中,执行完它就会被回收。

b)初始值,成员变量有默认初始化值,局部变量是没有默认初始化值的,必须定义、赋值,然后才能使用。

c)所在内存区域,成员变量在对象里,对象在堆内存里,成员变量也在堆里,不使用的对象会被垃圾回收机制在不确定的时候回收。而局部变量在方法运行的栈内存里,会自动释放。

d)生命周期,成员变量随着对象的创建而存在,随着对象的消失而消失。局部变量随着方法的调用而存在随着方法调用完毕而消失。

四、类的封装

1、类的封装:所谓类的封装是指在定义一个类时将类中的属性私有化,即使用private关键字来修饰,私有属性只能在它所在类中被访问,为了能让外界访问私有属性需要提供一些使用public修饰的公有方法,其中包括用于获取属性值的getXXX方法和设置属性值的setXXX方法。

注意:private仅仅是封装的一种体现,不能说封装就是私有,私有的访问权限最低,只有在本类中访问有效,比如protected也可以是实现封装。封装是一种思想,将具体实现隐藏,仅对外暴露访问方式。private修饰后的成员变量和成员方法,它们都不能在其他类中直接访问。

代码示例:

[java] view plain copy

  1. public class Student {
  2. private String name;// 将name属性私有化
  3. private int age;// 将age属性私有化
  4. // 下面是公有的setXXX和getXXX方法
  5. public String getName() {
  6. return name;
  7. }
  8. public void setName(String name) {
  9. this.name = name;
  10. }
  11. public int getAge() {
  12. return age;
  13. }
  14. public void setAge(int age) {
  15. this.age = age;
  16. }
  17. public void study() {
  18. System.out.println("正在学习的" + name + ",今年" + age + "岁。");
  19. }
  20. }

测试:

[java] view plain copy

  1. public class Test {
  2. public static void main(String[] args) {
  3. Student stu = new Student();// 创建Student对象
  4. stu.setName("张三");// 调用setName()方法赋值
  5. stu.setAge(21);// 调用setAge()方法赋值
  6. stu.study();// 调用study()方法
  7. System.out.println(stu.getName() + " " + stu.getAge());// 获取姓名和年龄
  8. }
  9. }

输出结果为:

正在学习的张三,今年21岁。

张三 21

五、构造方法

1、前言:从前面所学知识可以发现,实例化一个对象后,如果要为这个对象中的属性赋值,必须通过直接访问对象的属性或调用setXXX方法的方式才可以。如果需要在实例化对象的同时就为这个对象的属性进行赋值,可以通过构造方法来实现。构造方法是类的一个特殊成员,它会在类实例化对象时被自动调用。

2、构造函数的满足条件:在一个类中定义的方法如果同时满足以下三个条件,该方法称为构造方法。

方法名与类名相同(大小写也要与类名一致),在方法名的前面没有返回值类型的声明(没有void),在方法中不能使用return语句返回一个值。

作用:用于给对象的属性进行初始化

代码示例:

[java] view plain copy

  1. public class Student {
  2. private String name;// 将name属性私有化
  3. private int age;// 将age属性私有化
  4. public Student() {
  5. System.out.println("无参的构造函数被调用了");
  6. }
  7. public Student(String n) {
  8. name = n;
  9. }
  10. public void study() {
  11. System.out.println("正在学习的是" + name);
  12. }
  13. }

测试:

[java] view plain copy

  1. public class Test {
  2. public static void main(String[] args) {
  3. Student stu1 = new Student();// 创建Student对象
  4. Student stu2 = new Student("张三丰");
  5. stu2.study();
  6. }
  7. }

输出结果为:

无参的构造函数被调用了

正在学习的是张三丰

简单分析:创建第一个学生对象的同时调用了无参的构造方法Student(),执行了方法中的打印输出语句。创建第二个学生对象的同时调用了带一个int类型参数的构造方法,执行了该方法中的语句,将实际参数传递给成员变量age,所以调用study()方法时访问的是已经初始化后的成员变量name的值。

注意:

a) 当一个类中没有定义构造函数时,系统会默认给该类加入一个空参数的构造函数。如果定义了构造函数,无论是有参还是无参,系统都不会再给默认的构造函数了。

b)重载的构造方法是根据参数列表来区分是哪个构造方法。多个构造函数以重载形式存在。

c)构造函数间的调用只能用this语句。

d) 对象一建立就会调用与之对应的构造函数。

3、构造函数的重载:与普通方法一样,构造方法也可以重载,在一个类中可以定义多个构造方法,只要每个构造方法测参数类型或参数个数不同即可。在创建对象时,可以通过调用不同的构造方法来为不同属性进行赋值。如上面代码示例中所示,根据参数的不同分别调用了不同的构造函数。

4、构造函数与一般函数的区别:

a)构造函数和一般函数书写格式上有所不同,运行上也有不同。

b)构造函数是在对象一建立就运行,给对象初始化。而一般方法是对象调用才执行,是给对象添加对象具备的功能。

c)一个对象建立,构造函数只运行一次。而一般方法可以被该对象调用多次。

在实际中,一般都要写一个空参数的构造函数。

六、this关键字

1、this:每个对象都有一个指向自己的指针,就是this。this代表所在函数所属对象的应用。简单说:哪个对象在调用this所在函数,this就代表哪个对象。

this:用于区分局部变量和成员变量同名情况。

2、三种常见用法:

(1)、 通过this关键字可以明确的去访问一个类的成员变量,解决与局部变量名称冲突问题。

[java] view plain copy

  1. public class Student {
  2. private int age;// 将age属性私有化
  3. public Student() {
  4. super();
  5. }
  6. public Student(int age) {
  7. super();
  8. this.age = age;
  9. }
  10. public int getAge() {
  11. return age;
  12. }
  13. public void setAge(int age) {
  14. this.age = age;
  15. }
  16. }

构造方法的参数被定义为age,它是一个局部变量,它与类中的成员变量名称相同,在构造方法中使用age,访问的是局部变量,但如果使用this.age,则访问的是成员变量。

(2)、通过this关键字调用成员方法。

[java] view plain copy

  1. public class Student {
  2. public void study() {
  3. // .......
  4. }
  5. public void sleep() {
  6. // study();//省略this也可以
  7. this.study();
  8. }
  9. }

在上面sleep()方法中,使用this关键字调用study()方法。this.study();和study();效果完全一样

(3)、 构造方法是在实例化对象时被java虚拟机自动调用的,在程序中不能像调用其他方法一样去调用构造方法,但可以在构造方法中使用”this([参数1,参数2,..])”的形式来调用其它的构造方法。

[java] view plain copy

  1. public class Student {
  2. private String name;
  3. public Student()
  4. {
  5. System.out.println("无参的构造函数被调用了");
  6. }
  7. public Student(String name)
  8. {
  9. this();//调用无参的构造方法
  10. System.out.println("有参的构造函数被调用了");
  11. }
  12. }

[java] view plain copy

  1. public class Test {
  2. public static void main(String[] args) {
  3. Student stu = new Student("张三");
  4. }
  5. }

输出结果为:

无参的构造函数被调用了

有参的构造函数被调用了

3、在使用this调用构造方法时,应注意以下几点:

a)    只能在构造方法中使用this调用其它的构造方法,不能在成员方法中使用。

b)   在构造方法中,使用this调用构造方法的语句必须位于第一行,且只能出现一次。

c)    不能在一个类的两个构造方法中不能使用this互相调用。

七、垃圾回收

1、垃圾回收机制:在java中,当一个对象成为垃圾后仍会占用内存空间,时间一长,就会导致内存空间不足。针对这种情况,java引入了垃圾回收机制。Java虚拟机会自动回收垃圾对象所占用的内存空间。一个对象在成为垃圾后会暂时的保留在内存中,当这样的垃圾积累到一定程度时,java虚拟机就会启动垃圾回收器将这些垃圾对象从内存中释放,从而使程序获得更多可用的内存空间。除了等待java虚拟机进行自动垃圾回收,也可以通过调用System.gc()方法来通知java虚拟机立即进行垃圾回收。当一个对象在内存中被释放时,它的finalize()方法会被自动调用,因此可以在类中定义finalize()方法来观察对象何时被释放。

时间: 2024-12-16 20:35:31

Java编程基础-面向对象(上)的相关文章

Java编程基础-面向对象(中)

本章承接Java编程基础-面向对象(上)一文. 一.static关键字 在java中,定义了一个static关键字,它用于修饰类的成员,如成员变量.成员方法以及代码块等,被static修饰的成员具备一些特性. 1.static关键字的特点: a)随着类的加载而加载,也就是说,静态会随着类的消失而消失,说明它的生命周期最长. b)优先于对象存在,明确一点,静态是先存在的,对象是后存在的. c)被类的所有对象共享. d)可以通过类名调用. 2.静态变量 在一个java类中,可以使用static关键字

Java 入门基础——面向对象的特征

计算机软件系统是现实生活中的业务在计算机中的映射,而现实生活中的业务其实就是一个个对象协作的过程.面向对象编程就是按现实业务一样的方式将程序代码按一个个对象进行组织和编写,让计算机系统能够识别和理解用对象方式组织和编写的程序代码,这样就可以把现实生活中的业务对象映射到计算机系统中. 面向对象的编程语言有封装.继承 .抽象.多态等4个主要的特征. 封装: 封装是保证软件部件具有优良的模块性的基础,封装的目标就是要实现软件部件的"高内聚.低耦合",防止程序相互依赖性而带来的变动影响.在面向

Java面试求职之Java编程基础

Java编程基础 小编目前大三在读,专业电子系.由于对编程感兴趣还有就是对本专业前途的不乐观,还是勇敢的加入所谓的码农之路.学习Java也有一段时间了,快要放假了,想找家公司实习一下.至目前为止,已经面试了好几家公司了,大的有像腾讯.百度.联想这样的大公司:小的也有只有10几个员工的创业型公司.拿到过offer.也有碰壁连面试机会都没得到的. 下面就是一些对面试官面试时问的问题做的一些总结和自己搜集的一些知识点. Java概述和开发环境 Java开发包的总类            随着Java语

Java入门——(1)Java编程基础

Java入门--(1)Java编程基础 第二章 Java编程基础 JAVA 代码的基本格式: 修饰符 class 类名{ 程序代码 } 2.1关键字:赋予了特殊含义的单词. 2.2标识符:在程序中定义的一些名称. 比如:类名 a-z 0-9 _ $ 数字不可以开头,不可以使用关键字,一般首字母大写. 2.3注释:注解说明程序的文字. 作用:1.对程序进行说明. 2.调试程序. 注意:多行注释可嵌单行注释,但不能嵌套多行注释. /*多行注释*/ /**文档注释*/ //单行注释 /* 需求:写一个

java编程基础(一)

Java编程基础(一) 1. java基本语法 1.1 Java基本格式 修饰符 class 类名 { 程序代码 } Java严格区分大小写,例如不能将class关键字写成Class, java编译器将不能识别. Java程序中连续的字符串不能分行写:如果想分行写,可以写成两个字符串,中间用+号连接即可. 每一语句以分号结尾. 1.2 java注释 1.2.1 功能: 增加代码可读性,方便阅读,它只在源文件中有效,编译时编译器会忽略这些信息,不会将其编译到class文件中. 1.2.2 分类 注

Java大神推荐,java编程基础必备(必看)

在没有以前的操作习惯的错误情况下,反而容易接受新知识,所以不要因为自己对java一无所知而自卑,相反,这是菜鸟们的优势,但是如何才能从一个菜鸟历练成大神呢,当然是需要学习了,不学习就想成为大神,就是在做白日梦,所以如果你想改变自己,那么你可以来我们这个交流群来学习521595826,在这里每天都能学到新鲜的知识,想不进步都难,但是如果你是一个不思进取的人,一边凉快去就行.下面来介绍下java编程基础必备知识: 第一步:下载并安装JDK 6.0,安装路径为: C:\java\jdk1.6 . 第二

第二十五节:Java语言基础-面向对象基础

面向对象 面向过程的代表主要是C语言,面向对象是相对面向过程而言,Java是面向对象的编程语言,面向过程是通过函数体现,面向过程主要是功能行为. 而对于面向对象而言,将功能封装到对象,所以面向对象是基于面向过程的.以前是主要以面向过程为思想,现在是将功能装进对象中,如果要用到功能时,就调用该对象即可. 面向对象是入门思想的进步,适用于人类的思考,将复杂的东西进行了简单化,将我们程序员从执行者变化成指挥者.由以前面向功能(面向过程)转变为面向对象(封装的功能). **** 面向对象设计思想 设计思

java 编程基础

临近毕业,准备复习一些java的基础,顺便整理一下知识 编程基础 1.Java的特性和优势:简单.面向对象可移植( write once ,run anywhere ).高性能 ,分布式.动态性多线程安全健壮. 2.Java的运行机制, 计算高级编程语言类型有:编译型.解释型. Java语言是这两种类型的结合,利用编辑器写 Java源程序 -- 源文件名 :主类名.java,利用编译器(javac )将源程序编译 成字节码 -- 字节码文件名 :源文件名.class,再利用虚拟机 (解释器,即

黑马程序员——01.Java编程基础(一) ——常量、变量、运算符

一.Java的基础组成 1.关键字--被赋予特殊含义的单词 ????????????学习Java的过程中去记忆. 2.标识符---就是指名称(类名.对象名.变量名.函数名.对象名等) ? ? ? ?????????1.26?个英文字母的大小写.0~9数字._和$(不允许有空格) ? ? ? ? ????????2.数字不能开头,关键字不能用来命名 ? ? ? ?????????3.类名-首字母大写(XxxYyyZzz);函数名-(xxxYyyZzz);变量名对象名(xxxyyyzzz) (1)和