首页 > 代码库 > 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, 在类中的位置不同:
a) 成员变量:类中方法外
b) 局部变量:方法内或方法声明上
2, 在内存中的位置不同
a) 成员变量:堆内存
b) 局部变量:栈内存
3, 生命周期不同
a) 成员变量:随着对象的创建而存在,随着对象的消失而消失
b) 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
4, 初始化值不同
a) 成员变量:有默认的初始化值
b) 局部变量:没有默认的初始化值,必须先定义赋值,才能使用
1.4 匿名对象
匿名对象:就是没有名字的对象。
是对象的一种简化表示形式
匿名对象的两种使用情况
a,对象调用方法仅仅一次的时候
b,作为实际参数传递
1.5 封装
封装概述:
1, 隐藏实现细节,提供公共的访问方式;
2, 好处
a) 隐藏实现细节,提供公共的访问方式;
b) 提高代码的复用性
c) 提高代码的安全性
3, 设计原则:
a) 将不需要对外提供的内容和属性都隐藏起来,提供公共的方法对其访问
4,private是封装的一种体现。
封装:类,方法,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;运行结果:-126。byte范围是-128~127,超出范围,会以int类型存储,转换为byte类型,详见:2.5.7
byte b1=3,b2=4,b;
b=b1+b2;
b=3+4;
哪句是编译失败的呢?为什么呢?
答:b=3+4 ,3和4都是常量,所以java在编译时期会检查该常量的和是否超出byte类型的范围。如果没有可以赋值。
b=b1+b2不可以,是因为b1和b2是变量,因为变量的值会变化,不确定具体的值,所以默认使用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基础(二)