1.类的构建
a. 属性
b. 方法
属性是主人,方法为属性服务,是仆人。
c. 类的构建粒度
满足程序的设计需要即可,未涉及的属性和方法可不加入类的设计。
2.进程介绍
计算机内存以进程为单位进行分配。每个进程在逻辑上是隔离的,每个进程都认为自己是这台电脑上的唯一的程序,自己面对是所有的内存空间,这种技术叫做进程隔离技术,保证了系统不会因为一个进程的失败,导致死机。
一个进程可以向操作系统申请内存,进程申请到的内存一般以两种格式来使用,一种是栈(stack)的形式,一种是堆(heap)的形式. 一个进程可以多个栈,但只有一个堆,一个栈对应的是一个线程,一个进程至少需要一个线程(thread),即至少有一个栈。
我们目前所编制的程序,就是单进程单线程程序,该程序拥有一个stack和一个堆。
3. 对象的创建和方法调用
Car c=new Car();
1) 使用class loader读取Car进入代码区 (code area)
2) 在堆栈中创建引用变量c (Car类型)
3) 在堆中申请内存创建裸对象,并初始化this , super以及代码指针等隐式属性。
4) 调用构造方法实现对Car对象自有显式属性的初始化。
5) 获取初始化好的Car对象内存地址赋予引用变量c.
c.showCarInfo();
1) 通过引用变量c对Car对象发出调用showCarInfo()的指令。
2) Car对象收到指令后,立即访问其代码指针,访问代码区中的showCarInfo方法代码并执行。
4. 层叠构造方法 (cascade constructor)
Student(){
this("mary",12);
}
Student(String name){
this(name,12);
}
Student(String name,int age)
{
this.name=name;
this.age=age;
}
层叠构造方法提供了构造方法的多样性,为对象的创建者提供了便利。
层叠构造方法集中所有的处理逻辑在全参构造方法,便于集中修改和维护。
在这里要注意的是在构造方法的互调用过程中,必须用this来替代构造方法名,不能直呼类名。
5.实例变量和类变量
实例(instance)就是对象的意思,更加书面化一些。
实例变量也叫做实例属性,每个实例都有一份拷贝,在创建裸对象的过程中,实例变量的空间就会被开辟,在构造函数中,实例变量的空间会被初始化。
Ex: int count;
类变量属于类本身,也就是说其属于模板(模具), 类变量不在对象中,所有的对象都可以访问类变量,类变量被所有的类对象共享。
在类加载的过程中,将在“静态区“中创建类对象。
Ex: static int count;
1.包(package)的概念
一个好的类名,大家都爱使用,那么在相同类名的情况下,将很难区分类的主人, 所以我们必须给类起一个范围限定(归属), JAVA中是通过包的机制来解决的。
案例:
张三写的学生类 zhangsan. Student
李四写的学生类 lisi.Student
王五编写了一个程序使用到了上述两个学生类:
zhangsan.Student s=new zhangsan.Student();
包是一种逻辑结构,是一个类的归属标志,同一个包中不能出现雷同的类名。
包在物理上是如何实现的?是通过磁盘目录来表示的。
包名也有可能出现雷同的现象,为了避免这种情况的发生,我们一般使用单位的域名倒装来作为包名,因为域名不会出现重复,一个域名作为包名将可能在磁盘上创建多个层级目录。
为了避免你所编写的类,在后续的系统中出现使用上问题,请不要书写无包类/默认包类(default package).
案例:
package edu.fzu.cs; //package关键字,说明这个类所属的包
public class Student {
}
包名必须全部小写
2. 包装类(wrapper)
任何基本类型:byte,int , float ,double, boolean,char (16bits) ….. (没有无符号数据类型)
Char: utf-8 国际化编码
在JAVA中都有一个类类型与其对应。
Int à java.lang.Integer (java.lang java语言包, lang=language,
java.lang包中的所有的类在任何JAVA程序中都由编译器默认导入,语法是:
import java.lang.*;
由于lang包里头的类使用极度频繁,是语言扩展和服务类,为降低程序员的导入负担,该包下的所有类由编译器帮助导入,用户无需手动导入。
)
包装类的主要作用:
a) int à Integer
b) float à Float
c) double à Double
d) boolean à Boolean
e) char à Character
1. 弥补基本类型的语意缺失
基本类型无法表示:“没有”
float mark; 0
Float mark 0 , null
2. 为基本类型提供服务
System.out.println(Integer.toBinaryString(100));
System.out.println(Integer.toHexString(100));
System.out.println(Integer.parseInt("12")+1);
类类型创建在堆中,空间消耗很低。
装箱(inbox)和拆箱(outbox)
代表了类类型和基本类型之间的转换行为。
手动版本:
Integer b = new Integer(10);
Int a = b.intValue;
自动版本:
Integer b=30; à Integer b=new Integer(30);
Int a=b; à int a =b.intValue();
因为基本类型和类类型之间的换转操作频繁,SUN公司在高版本的JDK中提供了自动装箱和拆箱操作,由编译器帮助你书写转换代码。
在JDK5以上版本才支持自动装箱和拆箱操作。
3. String类了解
String s=new String("abc");
String m=new String("abc");
通过new String()语法将告诉编译器创建新对象,所以这里创建两个字符串对象。
System.out.println(s==m);
String a="xyz";
String b="xyz";
System.out.println(a==b);
为了兼容C开发者的习惯,SUN也允许不写new String,而字符串赋值。
当”xyz”这个字符串对象在内存中不存在的时候,系统将创建一个字符串对象,当已经存在的时候,系统将复用这个对象。
字符串的不变性(immutable)
任何字符串对象一旦被创建,就不能被更改,通过引用变量导致字符串的修改,都将导致新字符串对象的创建。
a=a+"mn";
System.out.println(a==b);
大量的字符串相加操作会产生大量的字符串对象,比如:
String a=”superstar”;
a=a+”m”;
如果有涉及到较多的字符串相加操作,请使用StringBuffer类。
String s=" this is a book! ";
System.out.println(s.length()); //求字符串长度
System.out.println(s.trim().length()); //去除头尾空格
System.out.println(s.toUpperCase());
System.out.println("aBcD".toLowerCase());
System.out.println(s.indexOf('s')); //找出s这个字符在字符串中首次出现的位置
System.out.println(s.lastIndexOf('s'));//找出s这个字符在字符串中最后一次出现的位置
System.out.println(s.indexOf("book")); //找出子串出现的位置
System.out.println(s.indexOf("world!"));
System.out.println(s.toCharArray()[3]);
System.out.println(s.charAt(3));
System.out.println(s.concat("hello,world!")); //字符串相加
System.out.println("abc".compareTo("bca")); //-1,0,1
System.out.println("abc".compareTo("abc")); //-1,0,1
System.out.println("cbc".compareTo("bca")); //-1,0,1
System.out.println("Abc".compareToIgnoreCase("aBc"));
System.out.println(s.contains("book"));
System.out.println(s.endsWith("! "));
System.out.println(s.isEmpty()); //是否为空
System.out.println(s.replace('s', 'm'));
System.out.println(s.valueOf(1));
System.out.println(1+"");
System.out.println("abcdefg".substring(3));
System.out.println("abcdefg".substring(3,6));
key: 进程 & 线程
进程是一个逻辑单位,线程类似一个物理单位,进程像班级,线程像学生,一般班级出行申请经费,都是以班级的名字,所以这里表示由
进程进行申请,操作系统只会给进程分配空间,一个进程至少包含一个线程,进程申请了资源,如同班级申请了班费,班费800元,给每个学生平分500元,这500元叫栈,剩下300公用的叫堆- -
程序猿通过调用栈内的引用变量,对类对象进行发送信号,类对象收到信号后,使用对象的代码指针调用相对应的代码,访问代码的时候有些情况下需要用到类对象的属性内容,于是出现了this指针,this指针的作用是方便代码层更准确的定位到所需对象的属性数据