第七章 JAVA中的类和对象

来源:互联网 发布:nginx 后端服务器宕机 编辑:程序博客网 时间:2024/06/09 15:20

第一节 什么是类和对象

类是模子,确定对象会拥有的特征(属性)和行为(方法),类的特点:类是对象的类型,具有相同属性和方法的一组对象的集合。对象是类的实例,什么是对象的属性?属性是对象拥有的各种特征;每个对象的每个属性都拥有特定值,对象的方法也就是对象执行的操作。类是抽象的概念,仅仅是模板,客观不存在。而对象是你可以看得到摸得到的具体实体,客观存在。
那么如何定义一个类呢?
1、类的重要性:所有的JAVA程序都以类class为组织单元;
2、什么是类:类是模子,确定对象会拥有的特征(属性)和行为(方法);
3、类的组成:属性和方法;
4、定义一个类的步骤:

  • 定义类名 public class 类名{}
  • 编写类的属性 //定义属性部分,可以从属性1—属性n,也可以没有
  • 编写类的方法 //定义方法部分,可以从方法1—方法n,也可以没有。

我们在类中通常是如何使用java对象呢?使用对象的步骤:
1、创建类的对象 Telphone phone=new Telphone();phone对象就是Telphone类型的。类名 对象名=new 类名(); 这个语法就是对象的实例化。
2、通过对象名来使用这个对象,引用对象的属性:对象.属性,可以引用赋值,对象.属性=xx;对象.方法名,调用方法。类是以代码形式保存在文件当中,当我把文件信息放在内存中,这些信息的集合我们就把它称为对象,这个过程我们就叫做实例化。Telphone phone=new Telphone();把对象赋给了对象名这个变量,实际phone这个变量名只是指向了这个对象的空间地址。new 一个类名加上小括号() 这就是实例化,然后赋给某个变量名,变量的类型就是对象的类型,即所属类这个类型。刚创建对象时如果没有给属性赋值,则是默认值,通常使用对象会用两个操作,即给实例变量赋值,或者调用对象的方法。

第二节 JAVA中的成员变量和局部变量

1.成员变量 在类中定义,用来描述对象将要有什么
2.局部变量 在方法中定义,在类的方法中临时保存数据
局部变量仅自己所在的方法可以使用,成员变量,类中的所有方法都可使用,其它跟本类有关系的方法也可使用。
成员变量和局部变量的区别:

  • 作用域不同,成员变量的作用域在整个类内部都是可见的,局部变量的作用域仅限于定义它的方法
  • 初始值不同,JAVA会给成员变量一个初始值,不会给局部变量初始值,要赋值后使用
  • 在同一个方法中,不允许有同名局部变量,不同的方法中可以有同名局部变量
  • 变量同名时,就近原则,如调用方法中有该同名变量则优先调用。

第三节 JAVA中的构造方法

Telphone phone=new Telphone();new后面这个实际是Telphone()的无参构造方法。
1.使用new+构造方法,创建一个新的对象。其实new后面跟的并不是我们的类名,而是我们的构造方法,也就是说我们在创建对象的时候就会使用我们的构造方法;
2.构造方法是定义在JAVA类中的一个用来初始化对象的方法。构造方法也是方法,它和我们普通的构造方法不同之处在于,我们以前的方法,只是代表对象可以干什么,而构造方法,它可以创建一个对象,并且初始化对象的值,所以说同样是方法,含义是不同的,还有一个特点:构造方法与类名相同,且没有返回值。构造方法的语法格式:public 类名(){//初始化代码} 其中类名也就是构造方法名,()中可以指定参数,没有参数的即是无参构造方法,指定参数的是有参构造方法;
3.如果没有指定一个无参的构造方法,系统会自动帮我们生成一个,如果我们对无参的构造方法不满意,可以自己再重新构造一个,创建对象的时候我们执行的就是构造方法;
4.带参的构造方法目的只有一个,就是初始化我们对象的成员变量值,在创建对象的时候,把参数传递进去。例如有参的构造方法:

public Telphone(float newScreen,float newCpu){screen=newScreen;cpu=newCpu;}

创建对象的时候传参数,把参数列表的值赋给我们的成员变量,有参的方法可以和无参的方法并存,通过无参的构造方法可以创建对象,有参的不仅可以创建对象还可以给实例对象的变量赋值;
5.当有指定的构造方法时,无论是有参还是无参的构造方法,系统都不会自动添加无参的构造方法;
6.重载,方法名相同但参数不同的多个方法,调用时会自动根据不同的参数来选择对应的方法;
7.构造方法不但可以给对象的属性赋值,还可以保证给对象的属性赋一个合理的值,if语句也可以设置错误时默认值。

第四节 JAVA中static使用之静态变量

我们可以基于一个类来创建多个该类的对象,每个对象都拥有自己的成员,互相独立。然而在某些时候,我们希望该类共享一个成员,此时就会用到static。JAVA中被static修饰的成员被称为静态成员类成员,它属于整个类所拥有,而不是某个对象所有,即被类的所有对象共享。静态成员可以使用类名直接访问,也可以使用对象名访问,鉴于它的特殊性,更推荐使用类名访问。使用static修饰变量、方法和代码块时,静态成员属于整个类,当系统第一次使用该类时,就会为其分配内存空间直到该类被卸载时才会进行资源回收。静态变量,在内存中,是所有对象共享的,而实例变量则是自己拥有自己的。例:

class A{static int x;int y;}

创建n个A的对象,它们用的都是同一个x共享,y则是每个对象都有的,这就是独享。
静态变量在类的内部时,可以直接类名访问变量。在外部调用该静态变量时,必须使用 类名.变量名或对象名.变量名来访问
静态变量和成员变量的区别:

  • 静态成员变量是属于整个类的全局变量,它不单属于某一个对象,被类的所有对象共享,普通成员变量属于类中的对象,它不能被共享,是独享的。
  • 静态成员变量必须在全局进行定义,普通成员变量在创建对象的时候可以对它进行初始化,因此无须单独定义,声明即可。
  • 静态成员变量字没有对象之前就存在。
  • 普通变量必须用对象名.属性,不能使用类名.变量名来访问,静态变量可以。
  • 静态变量没有实例化就可以调用,成员变量需要实例化才可使用,后者是属于对象的。

JAVA中static修饰变量默认赋值问题!在JAVA中普通声明的变量在未初始化赋值的情况下无法直接使用,但类中static修饰的变量,即静态变量会在编译期间由系统自动初始化并赋予默认值,所以在我们没有实例化的情况下也可以使用。这是因为java中普通变量会在程序运行中通过实例化,由系统动态的自动分配内存空间,而静态变量是在编译后便已经分配了内存,并随着类的存亡而存亡,这么做的目的使得静态方法或者静态变量在没有实例化的情况下也可以被使用(调用的很多类的方法,直接类.方法名估计都是静态方法吧)。实际测试,静态属性默认值:

静态变量类型 默认值 static byte; 0 static short 0 static int 0 static long 0 static float 0.0 static double 0.0 static char boolean false static String null static StringBuffer null

其中char输出为空,对应的ASCII码是0。
int 0,String默认是null,后者是面试常常问到的。

第五节 static使用之静态方法

与静态变量一样,使用static修饰方法,称为静态方法或者类方法,一直用的main方法就是静态方法
需要注意:
1.静态方法中可以直接调用同类的静态成员,但不能直接调用非静态成员,如果希望调用,则创建类的对象,通过对象访问非静态变量
2.在普通成员方法中,同类中可以直接访问同类的非静态变量和静态变量
3.静态方法中不能直接调用非静态方法,需要通过对象来访问非静态方法(所以main方法中需要对象.方法来调用)

第六节 JAVA中static使用之静态初始化块

JAVA中还可以通过初始化块来进行数据赋值,如:

public class HelloWorld{      String name;//定义一个成员变量      {            name="爱慕课";//通过初始化块来为成员变量赋值}}

在类的声明中,可以包含多个初始化块,当创建类的实例时,就会依次执行这些代码块。如果使用 static 修饰初始化块,就称为静态初始化块。需要特别注意:静态初始化块只在类加载时执行,且只会执行一次,同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量。

public class HellWorld{    int num1;//声明变量num1    int num2;//声明变量num2    static int num3;//声明静态变量num3    public HelloWorld(){//构造方法        num1=91;        System.out.println("通过构造方法为变量num1赋值");    }    {//初始化块        num2=74;        System.out.println("通过初始化块为变量num2赋值");    }    static{//静态初始化块        num3=83;        System.out.println("通过静态初始化块为静态变量num3赋值");    }    public static void main(String[] args){        HelloWorld hello=new HelloWorld();//创建类的对象hello        System.out.println("num1:"+hello.num1);        System.out.println("num2:"+hello.num2);        System.out.println("num3:"+num3);        HelloWorld hello2=new HelloWorld();//再创建类的对象hello2    }}

运行结果:
通过静态初始化块为静态变量num3赋值
通过初始化块为变量num2赋值
通过构造方法为变量num1赋值
num1:91
num2:74
num3:83
通过初始化块为变量num2赋值
通过构造方法为变量num1赋值
通过输出结果,我们可以看到,程序运行时静态初始化块最先被执行,然后执行普通初始化块,最后才执行构造方法。由于静态初始化块只在类加载时执行一次,所以当再次创建对象 hello2 时并未执行静态初始化块。初始化块在主函数main外,初始化块在构造前执行,有助于代码逻辑的分离,如果所有的实例都有一点相同的逻辑,就可以提取到初始化块中。

0 0