您的位置:首页 > 编程语言 > Java开发

JAVA基础初探(三)面向对象思想、类与对象、成员变量与局部变量、构造方法、static关键字详解

2018-01-24 17:04 936 查看

该篇博客目录

1、了解JAVA面向对象思想

2、JAVA的类与对象

3、成员变量和局部变量

4、构造方法

5、static关键字详解

一、了解JAVA面向对象思想

个人粗浅的理解面向对象是:面向对象有封装、继承、多态这些特性,再加上设计模式,使得软件开发变成了类的扩展开发,在修改和调整上更加容易

二、JAVA的类与对象

类:

确定对象将会拥有的特征(属性)和行为(方法)

在JAVA语言中最基本的单位是类,所以要用类来体现食物

对象

该类事物的具体体现

类与对象的区别

学生—类

体育委员—对象

类的特点

类是对象的类型

具有相同属性和方法的一组对象的集合

定义一个类的步骤

定义类名

编写类属性

编写类的方法

public class 类名{
属性1
属性2
...
方法1
方法2
...
}


创建对象

类名 对象名=new 类名();

对象名.属性

对象名.方法();

三、成员变量和局部变量

1、成员变量

在类中定义(方法外),用来描述对象将要有什么

2、局部变量

在类的方法中定义,在方法中临时保存数据

3、成员变量与局部变量区别

a、作用域不同

局部变量的作用域仅限于定义它的方法

成员变量的作用域在整个类内部都是可见的

b、初始值不同

局部变量没有默认的初始值,必须先定义,赋值

成员变量有默认的初始值(0)

c、优先级

两类变量同名时,局部变量具有更高的优先级

d、在内存中的位置

局部变量在栈内存

成员变量在堆内存

e、生命周期不同

局部变量随着方法的调用而存在,随着方法的调用完毕而消失

成员变量随着对象的存在而存在,随着对象的消失而消失

四、构造方法

1、定义在JAVA类中的一个用来初始化对象的方法

2、使用new+构造方法 创建一个对象

3、构造方法与类同名,且没有返回值

4、格式

public 类名(可以指定参数,也可以不指定参数)
{
初始化代码;
}




Tip

如果不写构造方法,系统会自动提供无参构造方法

如果提供了构造方法,系统将不再提供

构造方法可重载

五、static关键字详解

1、static——静态成员

JAVA中被static修饰的成员称为静态成员或类成员。静态成员可以使用类名直接访问,也可以使用对象名访问。鉴于它的特殊性,推荐使用类名直接访问

package hhh;

public class test {
static String a="hello_world";
public static void main(String[] args) {
// TODO Auto-generated method stub
//静态变量直接通过类名访问
System.out.println(test.a);

//通过对象名访问
test obj=new test();
System.out.println(obj.a);
}

}


Tip

静态成员属于整个类,当系统第一次使用该类时,就会为其分配内存空间直到该类被卸载才会进行资源回收

2、static——静态方法

package hhh;

public class test {
public static void print()
{
System.out.println("静态方法");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//直接使用类名调用静态方法
test.print();

//使用对象名调用
test obj=new test();
obj.print();
}

}


Tip

静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员(需要通过创建类的对象,然后通过对象来访问非静态成员)

在普通成员方法中,可以直接访问同类的非静态成员和静态成员

静态方法中不能直接调用非静态方法,需要通过对象来访问非静态方法

两个角度解析以上原因

[b]1、从类与对象的角度分析[/b]

因为类是抽象的,要完成它定义的功能,必须有它的实例来完成。同理静态的方法相当于自己本身就是个对象,它无需实例化就能调用它。而非静态方法则不能直接调用,需要实例化它的实例

[b]2、从内存角度分析[/b]

静态方法在编译时会为其和其变量分配内存空间,如果引用了一个非静态变量,那么在非静态变量结束后,这个变量就会消失,那么为它分配的内存块就成了无用内存块,但却无法回收,导致内存泄漏。

//静态方法中引用静态成员和非静态成员的方法
package hhh;

public class test {
static int a1=80;
int a2=99;
public static int sum()
{
test p=new test();
int num=a1+p.a2;
return num;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int all=test.sum();
System.out.println(all);

}

}


3、初始化块、静态初始化块、构造方法(三种初始化方式)

这里直接写个DEMO

package hhh;

public class test {
int a;
int b;
static int c;

public test() {//构造方法
a=1;
System.out.println("通过构造方法为a初始化");
}

//初始化块
{
b=3;
System.out.println("通过初始化块为b初始化");
}

//静态初始化块
static{
c=8;
System.out.println("通过静态初始化块为c初始化");
}

public static void main(String[] args) {
// TODO Auto-generated method stub
test obj=new test();
System.out.println("a:"+obj.a);
System.out.println("b:"+obj.b);
System.out.println("c:"+test.c);
test obj2=new test();
}
}

//输出:
通过静态初始化块为c初始化
通过初始化块为b初始化
通过构造方法为a初始化
a:1
b:3
c:8
通过初始化块为b初始化
通过构造方法为a初始化


以上输出结果可以看出一下几点

初始化块、静态初始化块、构造方法(三种初始化方式)都是在创建对象的时候调用的

执行顺序:1、静态初始化块 2、普通初始化块 3、构造方法

第二次加载类时没有静态初始化块了,说明:静态初始化块只在类加载时只执行一次,所以当再次创建对象obj2时并未执行静态初始化块

还有一点注意就是:静态初始化块只能给静态变量赋值,不能赋值普通的成员变量
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐