类成员
属性
声明
权限修饰符 数据类型 变量名
类的非静态变量赋值过程
默认初始化
显式初始化/代码块中的初始化(按定义先后顺序执行)
构造器中的初始化
有了对象以后,通过对象.属性或对象.方法赋值
与局部变量对比
局部变量没有初始化值,使用前一定要显示赋值
非静态属性加载在内存的堆空间中,局部变量加载在栈空间
方法
使用
// 声明
权限修饰符 返回值类型 方法名(形参列表) {
方法体
}
// 返回值
有返回值时必须声明返回值类型,同时方法中使用return关键字,返回指定类型的数据
没有返回值的方法一般不使用return关键字,可以使用return;表示结束方法体
// 如何直接使用类成员
直接使用‘成员名’就可以
// 方法调用
在非静态方法中调用非静态方法时,直接使用’方法名’即可
重载
同一个类中,允许拥有一个以上同名方法,只要参数的个数/类型不同
如果形参的个数与类型都相同,但是顺序不同也是重载
重写
方法名和形参列表必须相同
权限修饰符允许比父类方法的权限修饰符大,但是不能小
子类不能重写父类中private的方法
返回值类型
父类被重写的方法的返回值类型是void,子类重写的方法的返回值类型必须是void
父类被重写的方法的返回值类型是A类,子类重写的方法的返回值类型可以是A类或A类的子类
父类被重写的方法的返回值类型是基本数据类型,子类重写的方法的返回值类型必须是相同的本数据类型
异常类型
子类重写的方法的异常类型不能大于父类被重写的方法的异常类型
static
都不是static才是重写
static方法不能被重写
可变个数形参
java5.0新增特性
在方法的形参中,只能声明在末尾,且只能有一个
public void test(int ...a) {
// 获取参数个数
a.length;
// 获取参数
a[0];
a[1];
}
// jdk5.0之前传递可变个数形参
public void test(int[] a) {}
值传递机制
基本数据类型
将变量a赋值给变量b,变量a/b修改时不会对变量b/a造成影响,两者是互相独立的
引用数据类型
将变量a赋值给变量b,变量a/b修改时会对变量b/a造成影响,两者是浅拷贝
变量a的地址值赋值给变量b
构造器
作用
创建对象
初始化类属性
默认构造器
没有定义构造器时,系统默认提供一个空参的构造器
如果显式定义了类的构造器,系统将不会提供默认的空参构造器
默认构造器的权限修饰符和类的权限修饰符相同
定义
class Person{
public Person() { // Person就是构造器
}
public Person(String n) { // Person就是构造器,构造器也可以重载
}
}
// 使用
new 构造器(参数列表)
Person p = new Person();
Person p = new Person("名字")
代码块
用来初始化类和对象的信息(初始化类和对象的成员变量)
只能使用static关键字修饰代码块,不能使用其他关键字
分类
静态代码块
随着类的加载而执行
类的加载只有一次,静态代码块也只会执行一次
用来初始化类的信息
内部可以声明变量、调用属性和方法、编写输出语句等
先于非静态代码块执行
声明多个静态代码块时,按编写先后顺序执行
内部只能调用静态结构(属性、方法),不能调用非静态结构
非静态代码块
随着对象的加载(创建)而执行
每个对象创建时都会执行非静态代码块
用来初始化对象的信息
声明多个非静态代码块时,按编写先后顺序执行
内部可以调用静态结构(属性、方法),也可以调用非静态结构
定义
class {
// 非静态代码块
{
Integer i = 0;
System.out.println(i);
}
// 代码块
static {
Integer i = 0;
System.out.println(i);
}
}
内部类
定义
将一个类A定义在类B的内部,类A就是内部类
当类A的内部需要一个完整的结构进行描述,而这个内部的完成结构又只为外部类A提供服务,不在其他地方使用
分类
成员内部类
// 直接声明在外部类的里面
// 可以声明为静态成员内部类、也可以声明为非静态成员内部类
// 从类本身的角度看
// 可以声明属性、方法、构造器、代码块、内部类等结构
// 可以声明父类,可以实现接口
// 可以使用final修饰
// 可以使用abstract修饰
// 从外部类的成员的角度看
// 在内部可以调用外部类的结构
// 可以是public、private和protected修饰
// 可以使用static修饰
// 创建静态成员内部类的实例
// new 外部类名.内部类名()
// 创建非静态成员内部类的实例
// new 外部类名().new 内部类名()
// 如何在调用外部类的结构
// 可以直接不加修饰直接调用
// 当外部结构与内部结构重名时,外部类名.this.外部结构名()
public class A {
String name = "a";
Integer age = 11;
public class B {
String name = "b";
public void show() {
System.out.println("age" + age);
System.out.println("name" + name);
System.out.println("name" + this.name);
System.out.println("name" + A.this.name);
}
}
}
局部内部类
// 声明在方法内、构造器内、代码块的内部类
// 匿名局部内部类、非匿名局部内部类
// 基本使用
public class A {
String name = "a";
Integer age = 11;
public Comparable show() {
// 非匿名实现
public class B implements Comparable {
public int comparaTo(Obejct o) {
return 0;
}
}
return new B();
// 匿名实现
Comparable b = new Comparable () {
public int comparaTo(Obejct o) {
return 0;
}
}
return b;
}
}
权限修饰符
private
类内部使用
修饰的方法不能被重写
缺省(default)
类内部使用
同一个包内使用
protected
类内部使用
同一个包内使用
不同包的子类内使用
继承的子类中可以使用protected的结构
public
类内部使用
同一个包内使用
不同包的子类内使用
同一个工程内使用
class的权限修饰符只有public和缺省
所有权限修饰符都可以修饰属性、方法、构造器、内部类
使用
// 定义
public class Person
{
String name;
int age;
boolean isMale;
public void jieshao()
{
System.out.print("我叫" + name + ",今年" + age + "岁,我是" + (isMale ? "男" : "女"));
}
}
// 实例化对象
Person person = new Person();
// 属性赋值
person.name = "Tom";
// 打印属性的值
System.out.print(person.name);
// 调用方法
person.jieshao();
内存解析
类装载器
方法区
存储类的加载信息、常量、静态变量
虚拟机栈
存储局部变量
本地方法栈
堆
存储new出来的结构
比如对象、数组
对象的非静态属性也存储在堆中
程序计数器
将对象赋值给另一个对象时是浅拷贝,当有一个对象发生改变时,另一个对象也会改变
对象数组
Statudent[] arr = new Statudent[3];
// 对象数组的默认初始化值为null
匿名对象
// 没有显式赋值给一个变量,只能使用一次
// new 对象名(){}.变量名
// new 对象名(){}.方法名()
public void show() {
Thread t = new Thread() { // 他就是匿名对象
@Override
public void run() {
}
}
t.start();
}