一.类
1.结构化程序的缺陷:(1)缺乏对数据的封装; (2)数据和方法的分离;
2.抽象数据类型:将不同类型的数据的集合组合成一个整体来描述一个新的事物
3.类定义了一种抽象数据类型:类不但定义了抽样数据类型的组成(成员变量),同时还定义了可以对该类型实施的操作(方法);
4.先创建类,再创建对象;一个类可以创建多个对象(结构相同,数据不同)
5.类是一种数据类型,只能包含:
(1)对象所共有的特征:变量属性
(2)对象所共有的行为:方法
6.用new创建对象,创建对象的过程称为实例化;new之后成员变量有默认值
new 类名();//创建对象
二.引用类型变量
1.引用类型变量可以存放该类对象的地址信息,通常称“指向该类对象”;当一个引用类型变量指向该类的对象时,可以通过这个变量对对象进行访问;
2.除了8种基本类型外,用类,接口,数组等声明的变量都是引用类型变量,简称“引用”
3.可以通过引用访问对象的成员属性或调用方法
4.引用类型变量可以赋值为空(null),表示没有指向任何对象
三.补充
1.mian()里的变量为局部变量
Cell c= new Cell();
类名 引用 对象
JVM将内存分为三块,其中一块为栈,一块为堆,一块为方法区;堆中存放对象(new一个才在堆中开辟空间),栈中存放局部变量;引用存于栈中,开辟内存里面存放着对象在堆中的地址信息
2.(1)基本类型之间画等号----赋值
(2)引用类型之间画等号----指向同一个对象
四.方法的重载
1.方法的签名:包含方法名和参数列表
一个类中,不可以有两个方法的签名完全相同,允许多个方法名相同,但参数列表不同;称为方法的重载;
五.构造方法:
1.用于对成员变量初始化,与类同名,没有返回值类型,也不写void;构造方法可以重载;
2.构造方法在创建对象时被自动调用;若自己不写,系统默认无参构造方法;
3.this关键词
(1)this指代当前对象,谁调用指谁
(2)用法:this.成员变量------访问成员变量 this.方法()---------访问方法
this()----------------调构造方法
类中方法只要用到本类的成员变量,前面默认都有this;
六.引用类型数组
1.引用类型数组定义:Student [] student=new Student[4];
2.引用类型数组初始化:new之后 student中每个元素为null;没有指向具体对象
3.int [] [] as=new int [4][];//数组类型数组; 数组也是一种数据类型;
4.数组的元素可以看成数组对象的成员变量
5.如果希望每个元素都指向具体的对象;需要针对每个数组元素进行”new”运算;
否则: Student[0].name=”张三”;//空指针异常
七.对象内存管理
1.编译好的java程序需要运行在JVM中;
2.程序,无论代码还是数据,都需要存储在内存中,JVM为java程序提供并管理所需要的内存空间;
3.JVM内存分为”栈”,”堆”,”方法区”三个区域;分别用于存储不同数据;
(1)堆内存:JVM在其内存空间开辟一个称为”堆”的内存空间;这部分空间用于存储使用new关键字所创建的对象;
*访问对象需要依靠引用变量;当一个对象没有任何引用时,被视为废弃对象,属于被回收范围,该对象中的所有成员变量也随之被回收;
*成员变量生命周期为:从对象在堆中创建开始到对象从堆中被回收结束;
(2)栈内存:JVM在其内存空间开辟一个称为”栈”的内存空间;这部分用于存储程序运行时在方法中声明的所有局部变量;
Java中,调一个方法,就给该方法分配一个”栈帧”,栈帧中存着局部变量,方法调用结束,栈帧被清除,局部变量失效;
(3)方法区:用于存放类的信息,java程序运行时,首先通过类装载器载入类文件的字节码文件信息,经过解析后将其装入方法区,类的各种信息(包括方法)都在方法区存储
4.垃圾回收机制(GC):JVM自带的一个线程(自动运行程序),用于回收没有引用的对象;
5.内存泄漏:不在使用的内存没有被及时回收;严重的会因内存占用过多导致程序崩溃;
* GC线程判断对象是否可以回收的依据是该对象是否有引用指向,因此,当确定该对象不在引用时,应及时将其引用设为null;
6.局部变量与成员变量差别
(1)局部变量:定义在方法中;没有默认值,必须自行设定初始值;方法被调用是,存在栈中,方法调用结束,从栈中清除;
(2)成员变量:定义在类中,方法外;有默认值,可以不显示初始化;所在类被实例化后,存在堆中,对象被回收时,成员变量失效;
一.继承: 避免代码重复;
1.通过extends关键字实现类的继承,java不支持多重继承; java继承有传递性;
2.子类的构造方法中必须用super调用父类构造方法;若不写子类会自动默认调用父类无参构造方法:super();//不写默认; 若调用父类有参构造方法,需写出super(参数);super必须位于子类构造方法中第一位;
3.定义父类型的引用可以指向子类对象(向上造型),但只能访问父类定义的成员,不能访问子类的扩展部分;
4.方法重写:
(1)子类可以重写继承自父类的方法,即方法名和参数列表与父类的方法相同,但方法实现不同;当子类对象的重写方法被调用时,运行的是子类重写的版本;(看对象)
(2)可以通过super调用父类的版本;
5.重载与重写的不同
(1)重载:指在一个类中定义多个方法名相同但参数列表不同的方法;编译时,根据参数的个数和类型绑定不同的方法;(编译期)
(2)重写:指在子类中定义与父类完全相同的方法,在程序运行时,根据对象类型(而不是引用类型)的不同调用不同的版本;(运行期)
6.访问控制: *全局限定名:包名+类名;
(1)package语句:包名;解决命名冲突;必须写在java源文件的第一行;
(2)import语句:对你要访问的类的全称进行声明;之后该源文件可以直接用类名访问;二.封装:
* 对外提供可调用的,稳定的功能;内部细节外界不可访问
1.封装:封装就是把抽象出来的数据和对数据的操作(方法)封装在一起,数据被保护在内部,程序的其他部分只能通过被授权的操作(成员方法),才能对数据进行操作。修饰词:private,public ,protected,默认访问控制
2.static:(1)static修饰的成员变量(静态变量)不属于对象的数据结构;是属于类的变量,用类名来引用;static成员变量和类的信息一起存储在方法区,而不是堆中;无论多少对象共用一份;
(2) static修饰的方法是静态方法(属于类的),没有隐式的this;用类名引用
int num=0;//属于对象 //非静态方法可以直接访问静态变量和非静
static int sum=1;//属于类 //态变量;静态方法只能访问静态变量
static void show(){
num++;//错误 sum++;//正确 (this指代当前对象,没有this表示没有对象)
3.static块: static{语句块}
属于类的代码块在类的加载期间执行,只执行一次,用来在软件中加载静态资源
4.final关键词:
(1)修饰的成员变量不可改变;(2)修饰的方法不能被重写;(3)修饰的类不能被继承
5.static final修饰的成员变量为常量,声明同时必须初始化,建议全部大写