【Java学习笔记】面向对象基本概念

之所以引入面向对象,是因为面向过程有以下明显的缺点:

  •   数据抽象简单、信息完全暴露、算法复杂、无法很好地描述客观世界等缺点。
  •      如果软件项目庞大,程序的调试和维护将变得异常困难。

面向对象编程的设计思想:将数据(变量及属性)以及对这些数据的操作(方法),封装在一个单独的数据结构中(类)。一个面向对象程序的执行,就是靠对象间传递消息来完成的(方法的执行)。

面向对象的三大特点:封装、继承、多态。

封装:把对象的属性和对这些属性的操作封装在一个单独的数据结构中,并尽可能隐蔽对象内部细节。-->数据抽象封装及信息隐蔽。

继承:是一种由已有的类创建新类的机制。利用继承可在基类的基础上,创建出子类。Java中的类是单继承的。

多态:是由封装和继承引发的面向对象的另一特征:主要体现在方法重载和重写上。多态性使得我们的同一个方法,可以有多种形式。另外父类中定义的属性及方法被子类继承后,可以具有不同的数据类型或表现行为。

类声明:

 1 class Circle {
 2   point center;
 3 
 4   float radius;
 5 
 6   double getArea(){
 7 
 8     return radius*radius*3.1415926;
10   }
12 }

 类声明的格式如下:

 [修饰符] [abstract|final]class 类名[extends 基类名][implements 接口名列表]

{

[成员变量说明]

[成员方法说明]

}

abstract(抽象):修饰的类不能被实例化,它包含有未实现的方法。

final(最终):修饰的类不能被继承,即不能有子类。

abstract和final不能同时作为同一个类的修饰符。

类名:最好能见名知意。符合标识符的规定,不能是关键字。不一定要求第一个字母大写。

类体:

 [public|protected|private] [static] [final] [transient] [volatile]

 type variableName;  //成员变量

[public|protected|private] [static] [final|abstract] [native] [synchronized] returnType methodName([paramList]) [throws异常列表]{statements} //成员方法

类的成员变量定义在类内部,可以直接通过成员变量名来访问。

类外,类变量(static变量)访问:类名.类变量名

        实例变量:对象名.实例变量名。

实例化对象:用new关键字。此时编译器完成的三件事情:

  •  为对象分配内存空间;
  •  初始化对象中的实例变量的值,初始值可以是缺省值,或者变量按指定的值初始化;
  •  调用对象的构造方法。

一个类的构造方法可以有多个,它们具有相同的方法名。编译器根据参数的类型来决定调用哪个构造方法。这就是构造方法的多态。

对象的清除:

Java运行时系统通过垃圾收集器周期性地释放无用对象所使用的内存,完成对象的清除。当不存在对一个对象的引用时,该对象成为一个无用对象。Java的垃圾收集器自动扫描对象的动态内存区,对被引用的对象加标记,然后把没有引用的对象作为垃圾收集起来并释放。垃圾收集器作为一个线程运行,当系统的内存用尽或程序中调用System.gc()要求进行垃圾收集时,垃圾收集线程与系统同步运行,否则垃圾收集器在系统空闲时异步地执行。在对象作为垃圾被收集器释放前,Java运行时系统会自动调用对象的方法finalize(),使它清除自己所使用的资源。

     在类的定义中,除了必须定义创建类实例的方法外,还可以在定义中提供用于对象清除的方法finalize(),它的格式如下:

     protected void finalize() throws Throwable{ //撤销对象 }

     finalize()方法是类java.long.Object中最基本的方法。

    前面已经讲过,Java提供自动内存垃圾收集和处理程序。然而,在某些情况下,当一个类被破坏后,需要亲自执行一些垃圾收集器不能处理的特殊清理工作。 

方法重载:一个类中具有相同的方法名,不同的参数列表(参数类型

不同、参数个数不同);注:仅返回值不同,不能称为是方法重载。

实例方法和类方法:

实例方法可以对当前对象的实例变量进行操作,也可以对类变量进行操作,但类方法不能访问实例变量。实例方法必须由实例对象来调用,而类方法除了可由实例对象调用外,还可以由类名直接调用。另外,在类方法中不能使用this或super。

    关于类方法的使用,有如下一些限制:

   (1) 在类方法(static方法)中不能引用对象变量及对象方法(non-static variable / Method);

   (2) 在类方法中不能使用superthis关键字。

  如果违反这些限制,你的程序就会导致编译错误。

  与类方法相比,实例方法几乎没有什么限制:

   (1) 实例方法可以引用对象变量(这是显然的),也可以引用类变量。

   (2) 实例方法中可以使用superthis关键字。

   (3) 实例方法中可以调用类方法。 

 1 package com.annie.test;
 2 
 3 class Member {
 4     static int classVar;
 5     int instanceVar;
 6     static void setClassVar(int i){
 7         classVar = i;
 8         // instanceVar = i;  not allow
 9     }
10     static int getClassVar(){
11         // setInstanceVar(1); not allow
12         return classVar;
13     }
14     void setInstanceVar(int i){
15         classVar = i;
16         instanceVar = i;
17     }
18     
19     int getInstanceVar(){
20         setClassVar(1);
21         return classVar + instanceVar; 
22     }
23 }
24 public class classMethodTest{
25     public static void main(String args[]){
26         Member m1 = new Member();
27         Member m2 = new Member();
28         m1.setClassVar(1);
29         m2.setInstanceVar(2);
30     System.out.println("m1.classVar="+m1.getClassVar( )+ " m2.classVar="+m2.getClassVar( ));
31          m1.setInstanceVar(11);
32          m2.setInstanceVar(22);
33     System.out.println("m1.InstanceVar="+m1.getInstanceVar( )+ " m2.InstanceVar="+m2.getInstanceVar( ));
34     }
35 }
View Code

包package:由于Java编译器为每个类生成一个字节码文件,且文件名与类名相同,因此同名的类有可能发生冲突。为了解决这一问题,Java提供包来管理类名空间。包实际上是提供了一种命名机制和可见性限制机制。

Java系统必须支持至少一个无名包(缺省包)。

Java中的常用核心包:java.lang.*; java.io.*; java.util.*; java.sql.*

引入包: import 包名;

 

原文地址:https://www.cnblogs.com/annieyu/p/3643975.html