IDE,集成开发环境
开发工具:
eclipse:绿色、开源、免费的,是一个有多个插口的平台工具,本身不带JDK,必须自己安装JDK。
myeclipse:是一款名叫myeclipse的插件安装到eclipse后的总称,自带JDK ,不需要自己安装JDK。
一、面向对象的基本概念:面向对象=对象+类+继承+消息
抽象数据类型:很多个体相似的或者是相同的特征,以及行为,归纳总结为一种类型,用一堆不同的数据来描述一种新的事务,这种事务就是一种抽象数据类型。
二、类和对象
类:是由属性和方法组成的,实际上一个属性就是一个变量,而方法是一些操作行为。
对象:对象就是类型中的具体个体。实例:现实中:先有对象,再有类型。计算机:先定义的类型,再创建对象。类型是对象的模板,对象是类的具体实例。
创建对象 类名 变量名= new 类名(); //变量中存的是对象的地址信息
属性的访问 : 变量名.属性; 方法的调用 :变量名.方法名(); 有参传参
null和NullPointerException: null是引用类型的默认值,也就是变量空间里没有地址信息
String str="abc" ; str=null;//清空了地址信息
System.out.println(str.length())//这句语句会出现空指针异常,运行时出现
构造方法(构造器)
构造方法:是类中的特殊方法,方法名与类名一致,没有返回值,类中一定会有构造方法,如果没有提供,系统会默认提供一个无参的构造方法
构造方法定义格式
public 类名(类型1 参数1,类型2 参数2,...){程序语句;}
构造器也可以重载,构造器的作用是给属性赋值(初始化)
构造器的使用: 类名 变量=new 构造方法 // 1:实例化对象 2 :给成员变量初始化
三 、this关键字和static关键字
this的作用:1、调用本类属性 2、调用本类构造方法(位于构造方法首行) 3、this也可表示当前对象
static :
1、使用static 声明的属性,此属性称为全局变量(也称静态属性),可以使用 类名.static属性 来修改内容。(也称类属性) 可以用static属性统计一个类产生了多少实例化对象
2、使用static 声明方法,也称类方法。注:非static 声明的方法可以调用static 声明的属性或方法,但是static 声明的方法是不能调用非static声明的属性或者方法。
四、JVM内存管理及GC机制
一般JVM规范会分为以下几个区域:1、方法区 2、堆区 3、本地方法栈 4、虚拟机栈 5、程序计数器 jvm所管理的内存有两块,分别是栈,堆,还有一个叫方法区。
1、方法区:jvm虚拟机把所需要的字节码文件加载到方法区里,方法区存的就是类的信息,如方法、属性等。
2、堆:存的是引用类型的对象
3:栈:在运行期间,jvm会给每一个方法单独分配一个空间,这个空间叫栈帧,而方法中所涉及的变量,都在栈帧中进行开辟。当方法结束,栈帧消失。
GC机制(垃圾回收机制):当堆里的对象没有被任何引用变量指向时,会成为垃圾,当这样的对象越来越多,内存剩余空间越来越小,会出现内存溢出(泄露)情况。
System.gc( ); 是jvm的清洁工,会在内存中游荡,发现垃圾,处理。可以调用这个功能,只是通知。gc处理的时间,程序员说了不算。
五、代码块
1、普通代码块:就是指直接在方法或是语句中定义的代码块
public void CodeDemo01{
public static void mian(String arg[]){
{ //定义一个普通代码块
int x=30; //定义局部变量
System.out.println("普通代码块:"+x) ;
}
int x=100; //与局部变量名称相同
System.out.println("代码块之外:"+x) ;
}
}
输出结果:普通代码块:30
代码块之外:100
2、构造块:是直接写在类中的代码块
class Demo{
{
System.out.println("构造块");
}
public Demo(){
System.out.println("构造方法");
}
}
在主方法生成多个个对象,会得到 构造块 构造方法 、 构造块 构造方法 、构造块 构造方法 的输出结果,可知构造块优先构造方法执行,每次实例化对象都会执行构造块中的代码。
3、静态代码块
class Demo{
{
System.out.println("构造块");
}
static{
System.out.println("静态代码块");
}
public Demo(){
System.out.println("构造方法");
}
}
public class test{
static{ System.out.println("测试类的静态代码块");}
public static void main(String arg[]){
new Demo();
new Demo();
}
}
创建两个对象,运行程序输出结果:测试类的静态代码块 静态代码块 构造块 构造方法 、 构造块 构造方法 ,由此可知静态代码块优先主方法执行,而在类中定义的静态代码块会优先于构造块执行,不管创建多少个对象,静态代码块只运行一次。
六、Java四大内部类
成员内部类、静态内部类、局部内部类、匿名内部类
1、成员内部类:定义在另一个类(外部类)的内部,而且与成员方法和属性平级叫成员内部类,相当于外部类的非静态方法,如果被static修饰,就变成静态内部类。
2、静态内部类:使用static修饰的成员内部类叫静态内部类
说明 | 成员内部类 | 静态内部类 |
静态成员 | 静态成员需同时有final关键词修饰 | 可以 |
静态方法 | 不可定义 | 可以 |
访问外部类非static属性/方法 | 外部类名.this.成员方法/属性 | 不可以 |
外部类访问内部类 | 需要通过内部类的一个实例来访问 | 需要通过内部类的一个实例来访问 |
创建实例 | 外部类名.内部类名 实例名 = 外部类实例名.new 内部类构造方法(参数) | 外部类名.内部类名 实例名 = new 外部类名.内部类名(参数) |
编译后的class文件 | 单独的class文件(so内部类中的方法和变量可以跟父类的方法和变量同名),外部类$内部类.class | 单独的class文件(so内部类中的方法和变量可以跟父类的方法和变量同名),外部类$内部类.class |
其他 | 与外部类平级的类继承内部类时,其构造方法中需要传入父类的实例对象。且在构造方法的第一句调用“外部类实例名.super(内部类参数)” | 无 |
3、局部内部类:定义在代码块、方法体内、作用域内的类叫局部类。
(1)局部类只能在代码块、方法体内和作用域中使用(如创建对象和使用类对象等)
(2)局部内部类访问作用域内的局部变量,该局部变量需要使用final 修饰。
(3)可以使用abstract修饰,声明为抽象类
4、匿名内部类:没有名字的类,是一个局部内部类,前提要继承一个类或实现一个接口。
(1)只能使用一次,创建实例后,类定义会立即消失(多次使用可以使用反射的知识)
(2)必须继承一个类(抽象、非抽象都行)或实现一个接口。如果父类(或父接口)是抽象类,则匿名内部类必须实现其所有抽象方法。
(3)不能是抽象类,因为匿名内部类在定义之后,会立即创建一个实例。
(4)不能定义构造方法,匿名内部类没有类名,无法定义构造方法,但是匿名内部类具有和父类相同的所有构造方法。
(5)可以定义代码块,拥有实例的初始化,但不能定义静态代码块。
(6)可以定义新方法和属性(不能使用static修饰),但是不能通过实例名.方法名的形式调用,因为new 创建的上转型对象。(父类声明指向子类对象)
(7)是局部内部类,要符合局部内部类的要求。
abstract class Person { public abstract void eat(); } public class Demo { public static void main(String[] args) { Person p = new Person() { public void eat() { System.out.println("eat something"); } }; p.eat(); } }