首页 > 代码库 > java基础(二)

java基础(二)

1.     面向对象

万事万物皆对象

面向对象思想

         面向对象是基于面向过程的编程思想。

        

         面向过程:强调的是每一个功能的步骤

         面向对象:强调的是对象,然后由对象去调用功能

        

面向对象的思想特点

         A:是一种更符合我们思想习惯的思想

         B:可以将复杂的事情简单化

         C:将我们从执行者变成了指挥者

面向对象特征:

         封装(encapsulation

         继承(inheritance

         多态(polymorphism

Java程序的开发,设计和特征

                   A:开发:就是不断的创建对象,通过对象调用功能

                   B:设计:就是管理和维护对象间的关系

                   C:特征

                            a:封装

                            b:继承

                            c:多态

 

1.1     类与对象的关系:

类:是一组相关的属性和行为的集合

对象:是该类事物的具体体现

类:可以理解为构造对象的一个蓝图或者模版,是抽象的概念

对象:是以类为模型创建的具体实例,是对类的一种具体化。

Java中用class描述事物也是如此

成员变量         就是事物的属性,在类中,方法外。

成员方法         就是事物的行为

定义类其实就是定义类的成员(成员变量和成员方法)

  • 一个对象的内存图

技术分享

  • 三个对象的内存图

技术分享

java内存结构图:

栈:存放对象的引用;局部变量,所有的方法执行都在栈内存。

堆栈:存储对象以及对象中的成员变量和其变量值,对象成员方法的引用。

方法区:存放对象.class文件以及对象中的成员变量和成员方法

1.2     形式参数

Java中的参数传递问题

                   Java中只有值传递。

                  

                   基本类型:形式参数的改变不影响实际参数(因为方法调用结束,局部变量在栈内存中随着方法调用完毕而消失)

                   引用类型:形式参数的改变直接影响实际参数(因为改变的是堆内存中的值)

1.3     成员变量和局部变量

1,  在类中的位置不同:

  1. a)        成员变量:类中方法外

  2. b)        局部变量:方法内或方法声明上

2,  在内存中的位置不同

  1. a)        成员变量:堆内存

  2. b)        局部变量:栈内存

3,  生命周期不同

  1. a)        成员变量:随着对象的创建而存在,随着对象的消失而消失

  2. b)        局部变量:随着方法的调用而存在,随着方法的调用完毕而消失

4,  初始化值不同

  1. a)        成员变量:有默认的初始化值

  2. b)        局部变量:没有默认的初始化值,必须先定义赋值,才能使用

  3. 1.4     匿名对象

匿名对象:就是没有名字的对象。

是对象的一种简化表示形式

匿名对象的两种使用情况

a,对象调用方法仅仅一次的时候

b,作为实际参数传递

1.5     封装

封装概述:

1,  隐藏实现细节,提供公共的访问方式;

2,  好处

  1. a)        隐藏实现细节,提供公共的访问方式;

  2. b)        提高代码的复用性

  3. c)        提高代码的安全性

3,  设计原则:

  1. a)        将不需要对外提供的内容和属性都隐藏起来,提供公共的方法对其访问

4private是封装的一种体现。

封装:类,方法,private修饰成员变量

1.5.1       关键字
1.5.1.1 private关键字:

private关键字:

是一个权限修饰符。

可以修饰成员(成员变量和成员方法)

private修饰的成员只在本类中才能访问。

 

private最常见的应用:

把成员变量用private修饰

提供对应的getXxx()/setXxx()方法

1.5.1.2 this关键字:

this:代表所在类的对象引用;

1.5.1.3 static关键字
  • static关键字:

a,可以修饰成员变量和成员方法;

b,static关键字特点:

随着类的加载而加载;

优先于对象存在;

被类的所有对象共享(这也是我们判断是否使用静态关键字的条件);

可以通过类名调用。

         c,注意事项:在静态方法中是没有this关键字的;静态方法只能访问静态的成员变量和静态的成员方法

l 静态的内容存在于方法区的静态区

技术分享

  • 静态变量和成员变量的区别

a,所属不同:

         静态变量:属于类,类变量

         成员变量:属于对象,对象变量,实例变量

b,内存位置不同

         静态变量:静态方法区

         成员变量:堆内存

c,生命周期不同

         静态变量:随着类的加载而加载,随着类的消失而消失

         成员变量:随着对象的创建而存在,随着对象的消失而销售

d,调用不同

         静态变量:可以通过类名调用,也可以通过对象名调用

         成员变量:只能通过对象名调用

  • main方法是静态的

public:权限最大

static:不用创建对象就可以调用

void:返回值给jvm,没有意义

main:就是一个常见的名称

String[] args:可以接收数据,提供程序的灵活性

1.5.2       构造方法

构造方法

         (1)作用:用于对对象的数据进行初始化

         (2)格式:

                   A:方法名和类名相同

                   B:没有返回值类型,连void都不能有

                   C:没有具体的返回值

                  

                   问:构造方法中可不可以有return语句呢?

                   可以。而是我们写成这个样子就OK了:return;

                   其实,在任何的void类型的方法的最后你都可以写上:return;

         (3)构造方法的注意事项

                   A:如果我们没写构造方法,系统将提供一个默认的无参构造方法

                   B:如果我们给出了构造方法,系统将不再提供默认构造方法

                            如果这个时候,我们要使用无参构造方法,就必须自己给出。

                            推荐:永远手动自己给出无参构造方法。

                   C:构造方法可以重载

        

1.5.3       

一个基本类的标准代码写法

    成员变量

    构造方法

    无参构造方法

    带参构造方法

    成员方法

    getXxx()

    setXxx()

  • 给成员变量赋值的方式

                   A:setXxx()

                   B:带参构造方法

1.5.4       类的初始化过程

l  Student s = new Student();在内存中做了哪些事情?

    加载Student.class文件进内存

    在栈内存为s开辟空间

    在堆内存为学生对象开辟空间

    对学生对象的成员变量进行默认初始化

    对学生对象的成员变量进行显示初始化

    通过构造方法对学生对象的成员变量赋值

    学生对象初始化完毕,把对象地址赋值给s变量

1.5.5       代码块

Java中,使用{}括起来的代码被称为代码块,根据其位置和声明的不同,可以分为局部代码块,构造代码块,静态代码块,同步代码块(多线程讲解)

  • 局部代码块

在方法中出现;限定变量生命周期,及早释放,提高内存利用率

  • 构造代码块

在类中方法外出现;多个构造方法方法中相同的代码存放到一起,每次调用构造都执行,并且在构造方法前执行

  • 静态代码块

在类中方法外出现,并加上static修饰;用于给类进行初始化,在加载的时候就执行,并且只执行一次。

 

问:静态代码块,构造代码块,构造方法的顺序问题?

                   静态代码块 > 构造代码块 > 构造方法

 

2.     异常

数组索引越界

ArrayIndexOutOfBoundsException

访问到了数组中的不存在的索引时发生。

空指针异常

NullPointerException

数组引用没有指向实体,却在操作实体中的元素时。

 

3.     面试题

  • short s = 1;

         s= s + 1;

                                    

         shorts = 1;

         s+= 1;

         请问上面的代码哪个有问题?s=s+1有问题。原因参见2.5.6默认转换和2.5.7

  • byte b = (byte)130;运行结果:-126byte范围是-128~127,超出范围,会以int类型存储,转换为byte类型,详见:2.5.7

  • byte b1=3,b2=4,b;

b=b1+b2;

b=3+4;

哪句是编译失败的呢?为什么呢?

答:b=3+4 34都是常量,所以java在编译时期会检查该常量的和是否超出byte类型的范围。如果没有可以赋值。

b=b1+b2不可以,是因为b1b2是变量,因为变量的值会变化,不确定具体的值,所以默认使用int类型进行存储。int类型转换为byte类型是有问题的。答案见下2.5.7

  • switch语句的表达式可以是byte?可以是long?可以是String?

                            可以,不可以,JDK7以后可以

  • 成员变量和名称可以不可和局部变量一样呢?

         可以,但是使用的时候要注意,先找小范围,再找大范围。

  • switch语句的表达式可以是byte?可以是long?可以是String?

                            可以,不可以,JDK7以后可以

本文出自 “IT技术解决方案” 博客,请务必保留此出处http://wyait.blog.51cto.com/12674066/1910458

java基础(二)