• 【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 包名;

     

  • 相关阅读:
    sqlserver2005存储汉字成问号解决办法:
    .net c# 日期格式和常用处理
    文件夹无法访问拒绝访问,无法删除文件的,快速有效解决方法
    打印出所有的 info.plist 中的 keys、values
    利用时间戳来准确计算某个时间点具现在的时间差
    项目中的技巧经验汇总
    "Base SDK Missing"问题的解决
    UIPopoverController的使用
    给ios自带控件添加圆角边的方法
    实现程序内截屏功能的代码
  • 原文地址:https://www.cnblogs.com/annieyu/p/3643975.html
Copyright © 2020-2023  润新知