20190115——Java从入门到精通 第七章 类和对象

在程序开发初期人么能使用结构化开发语言,但随着软件的规模越来越庞大,结构化语言的弊端也逐渐暴露出来,开发周期被延长,产品的质量也不如人意,结构化语言已经不再适合当前的软件开发,这时候人们开始将另一种开发思想引入程序中。即面向对象的开发思想,面向对象思想是人类最自然的一种思考方式,它将所有预处理的问题抽象为对象,同时了解这些对象具有哪些相应的属性以及展示这些对象的行为,以解决这些对象面临的一些实际问题,这样就在程序卡覅中引入了面向对象设计的概念,面向对象设计实质上就是对现实世界的对象进行建模操作。

面向对象程序设计有三种特点:
继承,封装,多态。


类是封装对象的属性和行为的载体,而在java语言中对象的属性以及成员变量的形式存在,对象的方法以成员方法的形式存在。

成员变量
java中对象的属性也成为成员变量,为了了解成员变量,首先定义一个图书类,成员变量对应于类对象的属性,在Boook类中设置三个成员变量,分别为id、name、category分别对于图书编号、图书名称和图书类别三种图书属性

package chapter7;

public class Book {
    public String name;
    public String getName(){
        int id =0;
        setName("Java");
        return id+this.name;
    }
    public void setName(String name){
        this.name=name;
    }

    public Book getBook(){
        return this;
    }
}

成员方法
在Java语言中使用成员方法对应于类对象的行为。以Book类为例,它包含getName()和setName()两个方法,这两个成员方法分别为获取图书名称和设置图书名称的方法

定义成员方法的语法格式
权限修饰符 返回值类型 函数名 (参数类型 参数名){
方法体
return 返回值
}
一个成员方法可以有参数,这个参数可以是对象也可以是基本数据类型的变量,同时成员方法有返回值和没有返回值的选择,如果方法需要返回值可以在方法体中使用return关键字,使用这个关键字后,方法的执行将会被终止

成员方法的返回值可以是计算结果也可以是其他想要的数值和对象,返回值类型要与方法返回的值类型一致。

权限修饰符
Java中的权限修饰符主要包括private,public或者protected,这些修饰符控制着对类和类的成员变量以及成员方法的访问,如果一个类的成员变量或成员方法被修饰为private,则该成员变量只能在奔雷中被使用,在子类中是不可见的,并且对其他包的类也是不可见的。如果将类的成员变量和成员方法的访问权限设置为public,那么除了可以再本类使用这些数据之外,还可以在子类和其他包的类中使用。
如果一个类的访问权限被设置为private,这个类将隐藏其内部所有的数据,以免用户直接访问它。如果一个类需要使类中的数据被子类或者其他包中的类使用,可以将这个类设置为public访问权限。如果一个类使用protected修饰符,那么只有本包内的该类的子类或者其他类可以访问此类的成员变量和成员方法

当声明类时不使用public、protected和private修饰符设置类的权限,则这个类预设为包存取范围,即只有一个包中的类可以调用这个类成员方法和成员变量

类的权限设定会约束类成员的权限设定

在互相不嵌套的作用域可以同时声明两个名称和类型相同的局部变量。
但是在互相嵌套的区域中不可以这样声明,如果将局部变量id和在方法体的for循环中再次定义,编译器将会报错。

this关键字
成员变量与setName()方法中的形式参数的名称相同,都为name,那么该如何在类中区分使用的哪一个变量呢?在java语言中规定使用this关键字来代表本类对象的引用,this关键字被隐式地用于引用对象的成员变量方法,

类的构造方法
在类中除了成员方法之外,还存在一种特殊类型的方法,那就是构造方法,构造方法是一个与类同名的方法,对象的创建就是通过构造方法完成的,每当类实例化一个对象时,类都会自动调用构造方法

构造方法没有返回值
构造方法的名称要与本类的名称相同
如果类中没有明确定义构造方法,编译器会自动创建一个不带参数的默认构造方法。

如果类中定义的构造方法都不是无参的构造方法,那么编译器也不会为类设置一个默认无参的构造方法,当试图调用无参构造方法实例化一个对象时,编译器会报错,所以只有在类中没有定义任何构造方法是,编译器才会在该类自动创建一个不带参数的构造方法

静态变量、常量和方法
在static修饰的变量、常量和方法被称为静态变量、常量和方法
被声明为static的变量、常量和方法被称为静态成员。静态成员属于类所有,不属于个别对象,可以在本类或者其他使用类名和.运算符调用静态成员

静态数据与静态方法的作用通常 是为了提供共享数据或方法,如数学计算公式,以static声明并实现,这样当需要使用时,直接使用类名调用这些静态成员即可,尽管使用这种方法调用静态成员比较方便,但静态成员同样遵循着public、private和protected修饰符的约束

静态方法中不可以使用this关键字
静态方法中不可以直接调用非静态方法

方法体内的局部变量不能声明局部变量是static的

类的主方法
主方法是类的入口点,它定义了程序从何处开始:主方法提供对程序流向的控制,Java编译器通过主方法来执行程序,

主方法是静态的,所以如要直接在主方法中调用其他方法,则该方法必须是静态方法

主方法没有返回值

主方法的形参为数组,其中args【0】~args[n]分别代表程序的第一个参数到第n个参数,可以用args.length获取参数的个数

对象
java是一门面向对象的程序设计语言,对象是由类抽象出来的,所有的问题都是通过对象来处理,对象可以操作类的属性和方法解决相应的问题,所以了解对象的产生,操作和消亡是十分必要的,

对象的创建
对象可以认为是在一类事物中抽象出某一个特例,可以通过这个特例处理这类事物出现的问题。在java语言中通过new操作符来创建对象。前文在讲解构造方法时,介绍过每实例化一个对象就会自动调用一次构造方法,实质上这个过程就是创建对象的过程。准确地说,可以在java语言中使用new操作符调用构造方法创建对象。

test对象被创建出来时,就是一个对象的引用,这个引用在内存中为对象分配了存储空间,可以在构造方法中初始化成员变量,当创建对象时,自动调用构造方法,也就是说在java语言中初始化与创建是被捆绑在一起的

每个对象都是相互独立的,在内存中占据独立的内存地址,并且每个对象都具有自己的生命周期,当一个对象的生命周期结束时,对象就变成垃圾,由Java虚拟机自带的垃圾回收机制处理,不能再被使用。

如果希望成员变量不被其中任何一个对象改变,可以使用static关键字,

对象的引用
引用只是存放一个对象内存地址,并非存放一个对象,严格的说引用和对象是不同的,但是可以将这种区别忽略,如可以简单的说book是Book类的一个对象,而事实上应该是book包含Book对象的一个引用

对象的比较
在java语言中有两种对象的比较方式 “”与equals方法,实质上,这两种方法有着本质区别,equals()方法是String类中的方法,它用于比较两个对象引用所指的内容是否相等;而“”运算符比较的是两个对象引用的地址是否相等,由于c1与c2是两个不同对象的引用,两者在内存中位置不同,而String c3=c1;语句将c1的引用赋给c3。所以c1与c3这两个对象引用是相等的,

对象的销毁
每个对象都有生命周期,当对象的生命周期结束时,分配给改对象的内存地址将会被回收。在其他语言中需要手动回收废弃的对象,但是Java拥有一套完整的垃圾回收机制,用户不必担心废弃的对象占用内存,垃圾回收期将回收无用的但占用内存的资源

在谈到垃圾回收机制之前,首先需要了解何种对象会被Java虚拟机视为垃圾,主要包括以下两种情况。
对象引用超过其引用范围,这个对象将被视为垃圾
将对象赋值给null

虽然垃圾回收机制已经很完善,但垃圾回收器只能回收哪些由new操作符创建的对象,如果某些对象不是通过new操作符在内存中获取一块内存区域,这种对象可能不能被辣鸡回收机制所识别,所以在java中提供了一个finalize()方法,这个方法是Object类的方法,它被声明为protected,用户可以在自己类的定义这个方法,如果用户在类中定义了finalize()方法,在垃圾回收时会首先调用该方法,在下一次垃圾回收动作发生时,才能真正回收被对象占用的内存。

由于垃圾回收不受人控制,具体执行时间也不确定,所以finalize()方法也就无法执行,为此,提供了System.gc()方法强制启动垃圾回收器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值