1. 封装:只对外界提供有用的属性和行为 外界不用关心类具体的实现过程
构造方法:只能用来创建对象,系统会自动在这个类中加入一个默认的构造方法;也可以自己定义,一旦自己写了之后系统默认的构造方法就不存在了;构造方法必须存在;构造方法可以有多个,(为什么)因为方法的重载(可以同名,参数列表不同) 只能在创建对象时使用,可以给属性赋值
特点:构造方法名和类名相同,没有返回值类型,可以有参数,系统自动加入的构造方法是空参的,也无执行体 如 Person(){} (main()为什么没有返回值:因为JVM 调用此方法)
修改属性的值:不能使用构造方法,使用set()方法修改
定义构造方法时若局部变量与成员变量同名时,则使用局部变量,this(使用哪个对象就指向谁,类似于墙头草) 是一个引用,随着程序的执行,总是指向被使用的对象 (堆内存的地址)构造方法之间的调用通过 this 完成 ,且必须写在构造方法的第一行 如:
Person(String name,int age){ //局部变量与成员变量同名时,使用局部变量
this.name=name; //this 是一个引用,总是指向被使用的对象
this.age=age;
}
2. static 静态变量:又叫类变量
静态成员变量的特点:1)既可以通过对象访问也可以通过类名直接访问;2)存储所属类的所有对象共享的数据;3)随着类的加载在方法区的静态区开辟内存(创建对象之前);4)随着类的加载在方法区静态区开辟内存,程序退出时才释放内存 。 (缺点)占用内存时间长;静态的只能使用静态的
非静态成员变量(实例变量)特点:1)只能使用对象来访问;2)存储每一个对象特有的数据;3)是在创建对象时在堆中开辟内存的;4)创建对象时在堆中开辟内存,当所属对象成为垃圾时等待垃圾回收线程回收。 非静态的方法通过对象调用
对比:访问方式不同 储存数据不同 存储位置不同 生命周期不同(从在内存中出现到消失)
静态区只保存一个 static所修饰的成员变量,当它的值被修改时,后面均共享被修改后的值
使用场景:1)在什么情况下成员变量可以被修饰为 static :当成员变量的值被所属类的所有对象共享时。 2)什么情况下成员方法可以被修饰为 static :当该方法没有用到所属类中的非静态成员时 ,静态方法是无法从静态上下文中引用非静态方法的。
为什么静态方法不能使用非静态成员:静态的出现时非静态的还没出现,但非静态的可以使用静态的
静态的应用:封装工具类(一般工具类的方法是静态的)
Arrays.copyOf() 拷贝 Arrays.binarySearch(arr,34) 二分法查找 Arrays.sort(arr) 排序
直接通过类 Arrays 调用说明上面的三个方法是静态的
把一个常用的功能封装在一个类中
说明书:即文档注释使用 /** */注释 加载字节码文件时生成说明书( 生成工具类的api)那必须是public的
javadoc -d(指定路径) doc (文件夹) ArrayTool.java
静态代码块:随着类(字节码)的加载而执行,且只执行一次,优先于 main() 方法的执行,程序中的初始化功能通常写在静态代码块中 静态的优先开辟内存 ,最早出现 如:
class Test
{
static int num=10;
static{
System.out.println("C");
}
public static void show(){
System.out.println(num);
}
}
class Demo10
{
static{ //第一步执行
System.out.println("A");
}
public static void main(String[] args) { //第三步才执行
//Test t=new Test();
//Test.show();//加载Test.class
Test t=null;
}
static{ //第二步执行
System.out.println("B");
}
} // 打印结果为 A B C
构造代码块:对象一创建就执行,优先于构造方法执行,所有对象共性的功能可以写在构造代码块中 如:
class Person
{
String name;
{
System.out.println("呵呵");
}
Person(String name)
{
this.name=name;
System.out.println(name);
}
}
class Demo11
{
public static void main(String[] args)
{
new Person("李四");
new Person("张三");
}
}