public String color = "黄色"; //颜色
public double age = 4 ; //年龄
public String name = "大黄"; //名字
构造函数的参数,如何确定?
创建对象,需要的必要属性值,通过构造函数的参数传入
局部变量: 1. 通过参数传入
2. 在方法内定义
局部变量的作用域: 定义该变量所在的{ }
局部变量的生命期:
基本类型,超出局部变量定义的{},就会被标识为无效,然后等待GC来回收。
引用类型,超出局部变量定义的{},会引用计数-1,如果引用计数为0,就会被GC下次扫描时回收;
成员变量: 定义在方法外面的变量
成员变量的作用域是所在class内的所有方法
生命期:成员变量的生命期与它所在的对象的生命期一致
成员变量所在的对象,又可能是某个class中的局部变量或成员变量;
全局变量 ??
C语言中的全局变量
由于全局变量的作用域太大,数值一旦被修改,很难查找在哪里发生的变化------不推荐使用
Static变量:
1. 这块变量我们称为:类变量, 它是所有对象共享的内存;
2. static变量,不需要类的实例,就可以通过类的名字直接调用
3. 作用域:类似于全局变量
4. 生命期:static变量在第一次调用这个变量的时候,分配内存
一旦分配了内存后,这块内存可以重新赋值,但是这块内存一直不会被GC回收,直到程序结束!-----用于单例的设计
关注变量的两个重要特征:
1. 作用域
2. 生命期
this --- 对象自身
Dog dog = new Dog("旺财");
程序的运行顺序:
1. 系统给属性赋默认值
2. 用户在成员变量级,直接赋默认值
public String color = "黄色";
3. 在构造函数中对成员变量进行初始化
static关键字:
1. static 变量
2. static 方法
3. 常量
4. static代码块
5. 单例-----------设计模式中的一种
常量:永远不会改变
编译期常量---------------------------在程序编译的时候,所有调用常量的位置,都被常量代表的值所替换
最大的好处是节省内存
程序运行期常量:一次赋值之后,永远不能改变
常量的命名一定要大写 ,如名字较长,用下划线进行间隔 SEX_MALE
Sex.FEMALE = "xxxxx"; //这个语句错误,因为常量的值不允许被改变
final关键字:
public class Dbinfo {
public final String dbdriver;
final String url;
final String user;
final String password;
public Dbinfo(){
//读取配置文件
dbdriver = "oracle.jdbc.driver.OracleDriver";
url = "jdbc:oracle:thin:@USER-20160720AO:1521:orcl";
user = "aa";
password = "aa";
}
}
注意:public final String dbdriver = "oracle.jdbc.driver.OracleDriver";
这里没有写static关键字,它的反编译结果也是常量
这是海子的博客对static的描述,写的非常的好:http://www.cnblogs.com/dolphin0520/p/3799052.html
作业:
1. 使用面向对象的思想开发程序有什么好处?
1、 易维护
采用面向对象思想设计的结构,可读性高,由于继承的存在,即使改变需求,那么维护也只是在局部模块,所以维护起来是非常方便和较低成本的。
2、 质量高
在设计时,可重用现有的,在以前的项目的领域中已被测试过的类使系统满足业务需求并具有较高的质量。
3、 效率高
在软件开发时,根据设计的需要对现实世界的事物进行抽象,产生类。使用这样的方法解决问题,接近于日常生活和自然的思考方式,势必提高软件开发的效率和质量。
4、 易扩展
由于继承、封装、多态的特性,自然设计出高内聚、低耦合的系统结构,使得系统更灵活、更容易扩展,而且成本较低。
5、 减少了代码冗余,代码复用性强
2. 如何从现实世界抽象出类?
1. 从语言描述中,提取名词性的概念 (需求分析: 抽取概念模型)
2. 把名词抽象成相应的class,或class的属性
3. 提取动词 -------------------- 把这些动词,抽象成对象的行为
3. 方法重载的语法是什么?
方法具有相同的名称,不同的参数列表(无论是数量不同或类型不同)便产生了重载。
4. 如何实现封装?
将变量私有化,使用get与set去获取和改变。并在set与get中设置条件。
5. 构造方法的语法要求是什么?
没有返回值,方法名同类名。
6. 构造函数的作用是什么?什么时候需要构造函数?为什么?
构造函数的作用是对对象已经对象成员变量的初始化。
如果没有给成员变量初始化,系统会分配默认值给这些成员变量; 如引用类型的成员变量的默认值就是null。
//成员变量初始化,用户给class的属性设置了默认值
//默认值的设置标准:一定是绝大多数的对象,都具有的属性值,才能设置为默认值
7. 在变量中java与C的区别
局部变量: 1. 通过参数传入
2. 在方法内定义
局部变量的作用域: 定义该变量所在的{ }
局部变量的生命期:
基本类型,超出局部变量定义的{},就会被标识为无效,然后等待GC来回收。
引用类型,超出局部变量定义的{},会引用计数-1,如果引用计数为0,就会被GC下次扫描时回收;
C语言中无对象,只有基本数据类型与结构体。而java中无指针变量。并且java中无全局变量。
成员变量: 定义在方法外面的变量
成员变量的作用域是所在class内的所有方法
生命期:成员变量的生命期与它所在的对象的生命期一致
成员变量所在的对象,又可能是某个class中的局部变量或成员变量;
8. 如下代码段,PAI,PAI2,PAI3在使用上有啥区别?
public final double PAI2 = 3.1415926; 这种方法定义的PAI2是常量吗?
如果PAI2是常量,那么PAI的定义中的static关键字有啥作用?是否是多余的?
public class Test {
public static final double PAI = 3.1415926; //编译期常量
public final double PAI2 = 3.1415926; //编译期常量 ,如果不赋值,就是运行期常量
public static double PAI3 = 3.1415926;
public Test(){
}
}
9. 如下代码段,PAI、PAI2、PAI3的赋值方法是否存在问题?
在构造函数中给static变量赋值的含义是什么?
在构造函数中给final变量赋值的含义是什么?
public class Test {
public static final double PAI;//静态常量当且仅当声明的时候赋值
public final double PAI2;//当用final作用于类的成员变量时,成员变量(注意是类的成员变量,局部变量只需要保证在使用之前被初始化赋值即可)必须在定义时或者构造器中进行初始化赋值,而且final变量一旦被初始化赋值之后,就不能再被赋值了。
public static double PAI3;
public Test(){
//this.PAI = 3.1415926;
this.PAI2 = 3.1415926;
this.PAI3 = 3.1415926;
}
}
10.如下代码,那一句存在错误?
public class Test {
public static final double PAI = 3.1415926;
public final double PAI2 = 3.1415926;
public static double PAI3 = 3.1415926;
public double PAI4 = 3.1415926;
public static void test(){ //都不能用this
//this.PAI = 3.14; //静态变量不能改变值
//this.PAI2 = 3.14; //使用final变量一次赋值之后不能更改
this.PAI3 = 3.14;
//this.PAI4 = 3.14; //静态方法只能调用静态变量
}
}
11.如下代码那一句存在错误
public class Test {
public static final double PAI = 3.1415926;
public final double PAI2 = 3.1415926;;
public static double PAI3 = 3.1415926;;
public double PAI4 = 3.1415926;
public static void test(){
//PAI = 3.14; //被final修饰不能二次赋值
//PAI2 = 3.14; //同上
PAI3 = 3.14;
//PAI4 = 3.14; //静态方法只能调用静态变量
}
}