Java类的一些认识

下边是自己对类的一些使用认识,如果有不对的,敬请达人指正。

 

任何类的使用都经历:类加载和类初始化的阶段。
类初始化:
*普通成员属性:
 1.系统默认初始化,基本类型默认为0或false,引用类型默认为null。
 2.声明时显示初始化或普通初始化块(注意:普通初始化只有在new构造函数创建实例时,才会被自动调用)
 3.构造函数初始化

*类属性:
 1.系统默认初始化,基本类型默认为0或false,引用类型默认为null
 2.声明是显示初始化或静态初始化块

说明:
 * 类属性在类的生命周期内只对应一块空间,属于类所有,多个实例对象共享,因此不能在构造函数中初始化类属性。
   普通成员变量:系统会为每个类实例对象分配一块空间,保存每个实例的普通成员。

 * 类属性在类加载阶段就会创建保存其的内存空间,并且初始化;而成员变量则在运行期间,通过new构造函数来创建
   类的实例时,才分配内存空间,初始化成员变量。

 * 初始化类时,首先都是先初始化父类的。因此初始化的顺序为:类加载阶段:父类类属性-->当前类的类属性
   运行期间new构造函数创建阶段:父类普通成员初始化--> 当前类的普通成员初始化。这里使用初始化来形容而不使
   用构造函数的目的是:初始化时实际上执行的是三个步骤:默认初始化-->声明或初始化块-->构造函数

 * 使用new来调用构造函数,创建类的实例。不能说类的创造全由构造函数来完成,实际上在执行构造函数实体前,已经创建了
   该类的实例,并且默认初始化,只不过该实例还不能被外部调用,只能在构造函数内部通过this调用。在经过构造函数内部
   初始化后,返回该类的实例(注意:构造函数是没有返回值的,但实际上它是返回新建的该类的实例,只不过它是隐式的)

 * 当类的实例没被任何引用所指向时(如弱引用类型:new ClassA();), 就有可能被垃圾回收机制回收,至于什么时候回收
   我们是无法控制的,只能调用System.gc()或Runtime.getRuntime().gc()来提醒垃圾回收机制进行回收。而垃圾回收机制
   只能对堆内存的引用实例(运行时数据)进行回收,对IO资源和数据库连接资源是无法回收的,这是因为:好比我们开一个
   Window窗口,我们可以关闭该窗口的引用,但实际该window窗口还是存在,需要我们手动关闭,对于IO资源或数据库连接
   资源也是这样,垃圾回收机制回收的时引用对象,实际资源还没被回收,需要我们手动close()。
 
 * 调用方法时,会为该方法在堆栈中分配一块空间,用来保存局部变量
   方法内的局部变量,在方法结束时,会在堆栈中被销毁,是不是只有基本类型或引用类型被销毁,引用的实际对象只能
   等垃圾回收机制自动回收?

 * JDK1.5增加了可变参数特性(可变参数:参数列表的最后一个参数为:类型...参数名), 其实可变参数就相当于一个数组,
   但使用可变参数的好处是:传递参数时,不需要限制为传递一个数组,只需传入一定个数的参数即可

 * 在重载的多个构造函数中,如果含有相同的代码,则把这部分代码放到普通初始化块中执行,这样的好处是:便于修改维护,
   只需修改普通初始化块即可,而不需要修改所有含有该部分代码的构造函数,也符合java代码的编写规则:尽量不要重写相同
   的代码

 * 局部变量:在方法体内定义的变量,包括:基本类型变量,对象的引用类型。局部变量必须显示初始化,系统才会为它分配内存
   空间,才可以调用局部变量(注意:成员变量不需要显示初始化也可以调用,因为系统会默认初始化类的成员变量)。

 * 调用一个方法时,系统首先会在堆栈中为该方法分配一块内存空间,用来存放方法的局部变量。当方法结束时,局部变量也会
   被销毁,如果局部变量为引用类型时,被销毁的引用类型所指向的对象(保存在堆中),是由垃圾回收机制自动回收的

 * 四大修饰符:    private         default           protected          public
  -------------------------------------------------------------------------
    同一个类:        ok              ok                  ok               ok
    同一个包中:                     ok                  ok               ok
    子类中:                                             ok               ok
    所有类:                                                              ok
          说明:ok时,如果不在同一个包中,则在头部通过import引进包即可使用,或者使用完全限定名
 
 * 继承中方法的重写遵从 "两同两小一大" 的规则:方法名相同,参数列表相同;返回类型比父类返回类型小,抛的异常比父类抛
   的异常小;方法修饰符比父类的方法修饰符使用范围大

 * 方法内方位一个名为a的属性时,其查找的顺序为:局部变量 ---> 当前类的属性 --> 父类的属性
 
 * 多态的特征只对方法有效,对属性无效的。如
   父类:Sharp, 含有方法point()和属性int x;
   子类:Circle, 重写父类的point()方法和属性int x;
   Sharp sharp = new Circle(); 此时sharp.point();体现的是子类Circle的特征,而sharp.x则获取的是父类的x值

 * 初始化子类构造函数有三种情况:
   1.子类构造函数的第一行调用super(..)
   2.子类构造函数的第一行调用this(..),此时要求this(..)构造函数所执行的重载构造函数第一行为super(..)或第一行既不显示
     调用super()也不显示调用this(),要求父类构造函数有无参构造函数(显示的或者默认无参构造函数)
   3.第一行既不显示调用super()也不显示调用this(),要求父类构造函数有无参构造函数(显示的或者默认无参构造函数)
   注意:super(..)或this(..)只能在构造函数的第一行中声明

 * 类六大成员:构造函数,属性,方法,初始化块,内部类,枚举类
   接口四大成员: 属性,方法,内部类,枚举类

 * final修饰类时,表示该类不可以被继承
   final修饰方法时,表示该方法不可以被重写
   final修饰变量时,表示该变量不可以修改(即显式初始化后就不能再重新赋值)
   final修饰类的实例属性,必须:声明时初始化或普通初始化块中初始化或构造函数中初始化,否则调用时会有异常,因为
    此时系统不会为final修饰的实例属性进行默认初始化
   final修饰的类属性,必须:声明时初始化或静态初始化初始化
   final修饰基本变量时,为常量;修饰不可变引用类型时,为常量;修饰可变类时,不为常量
   private final修饰方法时,子类中可以有相同方法名的方法,此时不是重写父类的方法,而是相当于新定义一个方法,这是
    因为父类的private修饰的方法在子类中是不可见的
 
 * 内部类使用外部局部变量时,要求外部的局部变量声明为final类型

 * 创建不可变类,有两种情况:一是其属性为基本类型或不可变类(如String);二是其属性为可变类
   对于第一种情况只需:
  1.属性使用private final修饰
  2.提供public的构造函数
  3.只提供get属性的方法,不提供set属性的方法
   对于第二种情况:(如可变类Person,有属性String name和int age)
  1.属性使用private final修饰
  2.提供的构造函数,通过 this.person = new(person.getName(), person.getAge());的方式来创建person属性
  3.只提供get属性的方法,不提供set属性的方法

 

*抽象类和接口的区别:(从继承父类--构造函数--属性--方法等方面分析)
 1 抽象类只能继承一个父类或实现多个接口;而接口可以继承(extends)多个接口,注意接口不能继承类,因为接口没有构造
   函数,继承类时,没办法初始化父类的构造函数
 2 抽象类有构造函数,子类调用抽象类的构造函数来完成父类的初始化;而接口没有构造函数
 3 抽象类可以有初始化块,而接口没有初始化块
 4 抽象类的属性可以是实例属性,也可以是静态属性或常量;而接口的属性必须是public static final类型的常量。
 5 抽象类有:普通成员方法,abstract修饰的抽象方法;而接口的方法都为:public abstract,接口不能有static修饰的静态
   方法,这是因为static修饰的方法可以通过:类名.方法名 的方式调用,而接口中所有的方法都是空方法,如果使用:
   接口名.方法名的方式调用空方法时,会有异常

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值