类和对象

面向对象思想(OOP)

面向对象的思维,就是当我们遇到某个问题域或某个程序时,首先应该分析问题中有哪些对象,抽象出对象与对象之间的关系。
面向对象程序设计具有以下特点:

  1. 封装性
  2. 继承性
  3. 多态性

类是用于描述同一类的对象的一个抽象的概念,类中定义了这一类对象所具有的静态属性和动态属性。类可以看成一类对象的模板,对象可以看成该类的一个具体实例。
类是封装对象的属性和行为的载体,反过来说就是具有相同属性和行为的一类实体称为类。
在Java语言中,类中对象的行为是用“方法”的形式定义的,而类包括对象的属性和方法。

封装

封装是面向对象的核心思想。将对象的属性和行为封装起来,其载体就是类,类通常对客户隐藏其实现细节,这就是封装思想。采用封装思想保证了类内部数据结构的完整性,应用该类的用户不不能轻易地直接的操作此数据结构,只能执行类允许公开的数据。
这样就避免了外部操作对内部数据的影响,提高了程序的可维护性。

继承

类之间的关系称为关联,继承是关联的一种。在java中使用extends关键字来表示继承关系。在java中,只允许单继承,也就是说 一个类最多只能显示地继承于一个父类。但是一个类却可以被多个类继承,也就是说一个类可以拥有多个子类。
子类继承父类的成员变量/成员方法
  当子类继承了某个类之后,便可以使用父类中的成员变量/成员方法,但是并不是完全继承父类的所有成员变量/成员方法。具体的原则如下:
  1)能够继承父类的public和protected成员变量/成员方法;不能够继承父类的private成员变量/成员方法;
  2)对于父类的包访问权限成员变量/成员方法,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;
  3)对于子类可以继承的父类成员变量/成员方法,如果在子类中出现了同名称的成员变量/成员方法,则会发生隐藏现象,即子类的成员变量会屏蔽掉父类的同名成员变量/成员方法。如果要在子类中访问父类中同名成员变量/成员方法,需要使用super关键字来进行引用。

多态

多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作。

成员变量和成员方法

在Java语言中对象的属性以成员变量的形式存在,对象的方法以成员方法的形式存在。


定义和使用成员变量.jpg

根据以上代码,Book类中定义了一个成员变量:name
Java语言使用成员方法对应于类对象的行为就是成员方法。如以上代码中getName()和setName()的两个方法。
定义成员方法的语法格式:

权限修饰符 返回值类型 方法名(参数类型 参数名){

       ... //方法体

       return 返回值;

}

成员方法可以有参数,参数可以是对象,也可以是基本数据类型的变量。同时,成员方法也可以选择返回值(方法中使用return关键字)或者不返回值(使用void关键字)。
在成员方法中可以调用其他成员方法和类成员变量。如上述代码中getName()方法调用了setName()方法。
再成员方法中可以定义一个变量,这个变量为局部变量。

权限修饰符

Java中的权限修饰符包括:private、public和protected。
如果一个类的成员变量/成员方法被修饰为private,那么该成员变量/成员方法只能在本类中被使用,在子类和其他包的类中是不可见的。
如果一个类的成员变量/成员方法被修饰为public,那么除了可以在本类中使用这些数据外,还可以在子类和其他包的类中使用。
如果一个类使用protected修饰符,那么只有本包内的该类的子类或其他类可以访问此类中的成员变量和成员方法。
(当声明类时不适用public,protected,private修饰符设置类的权限,则这个包预设为同一个包中的类可以调用这个类的成员变量或成员方法。)

局部变量

在成员方法中定义的变量就是局部变量。例如:id就是getName()方法中的局部变量。形参也可以作为一个局部变量,如定义在setName(String name)方法时,String name这个形参就是一个局部变量。
局部变量是在方法被执行时创建,在方法执行结束时被销毁。局部变量在使用时,必须进行赋值或初始化,否则会出现编译错误。

局部变量的有效范围

局部变量的有效范围从该变量的声明开始到该变量的结束为止。

this关键字

在Java语言中规定使用this关键字来代表本类对象的引用,this关键字被隐式地用于引用对象的成员变量和方法。如上述代码中,this.name指的就是Book类中的name成员变量。而this.name = name中第二个name则指的是形参name。

this除了可以跳用成员变量或成员方法之外,还可以作为方法的返回值。

public Book getBook(){
  return this;  //返回Book类引用
}

类的构造方法

在类中除了成员方法之外,海存在一种特殊类型的方法,叫做构造方法。构造方法是一种特殊的方法,它是一个与类同名且返回值类型为同名类类型的方法。对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化。当类实例化一个对象时会自动调用构造方法(构造方法的调用是在创建一个对象时使用new操作进行的)。
构造方法分为两种:无参构造方法 有参构造方法
构造方法特点:

  1. 构造方法没有返回值;(且不需要void关键字修饰
  2. 构造方法的名称要与本类的名称相同。

构造方法的定语语法格式:

public book(){
    //...构造方法体
}

1.在构造方法中可以为成员变量赋值,这样当实例化一个本类的对象时,相应的成员变量也将被初始化。
2.如果类中没有明确定义构造方法,编译器会自动创建一个不带参数的默认构造方法。


定义构造方法.jpg

静态变量、常量和方法

被声明为static的变量,常量和方法被称为静态成员。静态成员属于类所有,区别于个别对象,可以在本类或其他类使用类名+“.”来调用静态成员。
语法:

类名.静态类成员

例:

public class StaticTest{
         static double PI =3.1415;            //在类中定义一个静态常量
         static int id;            //在类中定义静态变量

          public static void method1(){
                        //doSomething
          }

          public void method2(){
                  System.out.println(StaticTest.PI);    //调用静态常量
                  System.out.println(StaticTest.id);    //调用静态变量
                  StaticTest.method1();    //调用静态方法
          }
}

静态数据与静态方法是为了提供共享数据或方法,这样当需要使用时,直接使用类名调用这些静态成员即可。
在Java语言中,对静态方法有两点规定:
1.在静态方法中不可以使用this关键字。
2.在静态方法中不可以直接调用非静态方法。

类的主方法

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

public static void main(String[] args){
         //方法体
}

从主方法的定义中可以看出:
1.主方法是静态的。所以如果要直接在主方法中调用其他方法,则该方法必须也是静态的。
2.主方法没有返回值。
3.主方法的形参为数组。其中args[0]~args[n]分别代表程序的第一个参数到第n个参数,可以使用args.length获取参数的个数。

对象

对象的创建

Java语言中使用new操作符调用构造方法创建对象。

Test test = new Test();
Test test = new Test("a");

Test:类名;
test:创建Test类对象
new:创建对象操作符
"a":构造方法的参数

test对象被创建出来时,就是一个对象的引用,这个引用在内存中为对象分配了存储空间。当创建对象时,自动调用构造方法,也就是说在java语言中初始化与创建是被捆绑在一起的。
每个对象都是相互独立的,在内存中占据独立的内存地址,并且每个对象都具有自己的生命周期,当一个对象的生命周期结束时,对象就变成垃圾,由Java虚拟机自带的垃圾回收机制处理,不能再被使用。

访问对象的属性和行为

使用new 操作符创建一个对象后,可以使用“对象.类成员”来获取对象的属性和行为。对象的属性和行为是通过类成员变量和方法的形式来表示的,所以当对象获取类成员时,也相应地获取了对象的属性和行为。

对象的引用

语法:

类名 对象引用名称

Book book;

Book book = new Book();
Book:类名
book:对象
new:创建对象操作符

注意:引用只是存放当一个对象的内存地址,并非存放一个对象

对象的比较

在java语言中有两种对象的比较方式,分别为“==”运算符与equals()方法。实质上这两种方式有着本质的区别。
“==”运算符比较的是两个对象引用的地址是否相同,而equals()方法用于比较两个对象引用所指的内容是否相等。


对象的比较.PNG

对象的销毁

每个对象都有生命周期,当对象的生命周期结束时,分配给该对象的内存地址将会被回收。java拥有一套完整的垃圾回收机制,垃圾回收器会回收无用但占用内存的资源。
以下两种情况的对象会被java虚拟机视为垃圾:

  1. 对象引用超过其作用范围,这个对象将被视为垃圾;
  2. 将对象赋值为null;

虽然垃圾回收机制已经很完善,但垃圾回收器只能回收那些由new操作符创建的对象,如果某些对象不是通过new操作符在内存中获取一块内存区域,这种对象可能不能被垃圾回收机制所识别,所以在java中提供了一个finalize()方法。这个方法时Object类的方法,他被声明为protected,用户可以在自己的类中定义这个方法。如果定义了finalize()方法,在垃圾回收时会首先调用该方法,在下一次垃圾回收动作发生时,才能真正回收被对象占用的内存。注意:有一点需要明确,垃圾回收或finalize()方法不保证一定会发生,如java虚拟机内存损耗殆尽时,他是不会执行垃圾回收的。由于垃圾回收不受人为控制,具体执行时间也不确定,所以finalize()方法也就无法执行,为此,java提供了System.gc()方法强制启动垃圾回收器,刀子和垃圾回收器进行清理。

你可能感兴趣的:(类和对象)