static关键字
static关键字称为静态,static可以用来修饰类的属性,方法,代码块和内部类.
static的特点:
随着类的加载而加载,只有一份,类加载后就可以直接使用,在方法区存储.
优先于对象存在,先加载类,之后才创建对象.
被static修饰的成员被所有对象共有
可以不创建对象而直接被类调用
public class Chinese {
String name;//未被static修饰的成员变量 随着对象的创建而创建 会被加载到对象内存中 每一个的值都是不同的
int age;
int ID;
static String country = "中国";//被static修饰的变量 被加载在方法区 只有一份 对象可以引用 但不会被加载到堆中 值是固定的
}
public class ChineseTest {
public static void main(String[] args) {
Chinese zs = new Chinese();
zs.name = "张三";
zs.age = 19;
zs.ID = 123456789;
Chinese ls = new Chinese();
ls.name = "李四";
ls.age = 18;
ls.ID = 123456798;
System.out.println(zs.name);
System.out.println(zs.country);
System.out.println(ls.name);
System.out.println(ls.country);//被static修饰的变量可以被对象调用
System.out.println(Chinese.country);//被static修饰的变量可以用类直接调用
}
被static修饰的变量 被加载在方法区 只有一份 对象可以引用 但不会被加载到堆中 值是固定的
未被static修饰的成员变量 随着对象的创建而创建 会被加载到对象内存中 每一个的值都是不同的
static可以修饰成员方法,修饰后的成员方法中只能访问静态的成员变量
静态方法也是随着类的加载而加载.
static不能用来修饰构造方法.
代码块
代码块在类中声明类似一个没有名字的方法,代码块分为实例块和静态块.
代码块在类中可以有多个.
实例块:每一次创建对象时都会被调用.
{
Java语句;
}
静态块:只在类加载的时候自动调用一次,与创建对象及创建对象的个数无关.
static {
Java语句;
}
实例代码块可以使用被静态修饰的变量 也可以使用非静态修饰的变量
静态代码块可以使用被静态修饰变量,但不能使用非静态修饰的变量 原因: 静态随着类的加载而加载 非静态是随着对象的加载而加载,静态的加载是随着类的加载而加载的,静态的加载先于非静态 静态代码块随着类的加载只加载一次
public class Demo {
int a=1;
static int b=2;
{
System.out.println("实例代码块1"+a);
}
{
System.out.println("实例代码块2"+b);
}
static {
System.out.println("静态代码块1");
}
static {
System.out.println("静态代码块2"+b);
}
public class TestDemo {
public static void main(String[] args) {
new Demo();
System.out.println(Demo.b);
new Demo();
System.out.println(Demo.b);
}
类中的元素加载执行顺序
①先加载静态的,变量 代码块 方法等 按照从上向下的顺序执行
②成员变量
③实例代码块
④构造方法
⑤成员方法
包
包类似于文件夹,是为了更好的管理类,Java提供了包机制,用于区别类的命名空间(类地址).
全类名=包名+类的简称
包的作用:
①避免类名重复
包名的存在就是让我们根据不同的需求调用不同的类.
当你调用一个包的类时,需要导包在Java中使用import关键字进行导包,同包中使用时不需要导入.
注意:在Java中lang包(即language语言包)是默认的,可以直接使用不需要导入.
以Date为例,我们可以看到Java中不同的包中都有Date,当你的代码中需要使用多个包中的同名类时,不能同时导入所有的包,其中可以导入一个包,其他的相同类则需要使用全类名进行导入使用.
②便于根据不同的功能管理类
公共的功能
与数据库交互的功能
与前端交互的功能
③控制访问权限
使用不同的访问权限修饰符可以对包进行访问权限控制.
包的命名规范:
在包名中,可以使用.号来区分包的级别;包名一般情况下是小写
第一级 指该项目的类型,如com,org,gov等,
第二级 指项目所开发或者运行的公司名称,如:oracle,sun等
第三级 指项目的名称,如:bcms,oa,erp,cms等
第四级 指项目模块的名称,如:bean,action,exception等
访问权限修饰符
Java中有四个权限访问修饰符,权限从大到小依次为:
1)public :公共的 可以修饰类 属性 方法 可以被任意类访问
2)protected:受保护的 可以修饰 属性 方法 该类的子类
可以被同包类访问,如果不是同包类,必须是该类的子类才可以访问
3)default:默认的 可以修饰同包的类 属性 方法 只能被同包的类访问
4)private:私有的 可以修饰同类的属性 方法 只能在本类中访问
package com.ffyc.zlp.javaoop.day1;
public class Demo1 {
public int pubnum;
protected int pronum;
int num;
private int prinum;
public void test(){
System.out.println(this.pubnum);
System.out.println(this.pronum);
System.out.println(this.num);
System.out.println(this.prinum);
}
}
package com.ffyc.zlp.javaoop.day1;
public class Demo2 {
Demo1 Demo1 = new Demo1();
public void test(){
System.out.println(Demo1.pubnum);//公共的 可以被任意类访问
System.out.println(Demo1.pronum);//可以被同包的类访问
System.out.println(Demo1.num);//同包可以使用
// System.out.println(Demo1.prinum);//私有权限,同包不同类不能使用
}
}
package com.ffyc.zlp.javaoop.day2;
import com.ffyc.zlp.javaoop.day1.Demo1;
public class Demo3 extends Demo1 {
com.ffyc.zlp.javaoop.day1.Demo1 Demo1 = new Demo1();
public void test(){
System.out.println(Demo1.pubnum);//公共的 可以被任意类访问
//System.out.println(Demo1.pronum);//创建对象才能使用
//System.out.println(Demo1.num);//默认权限 子类不能使用
// System.out.println(Demo1.prinum);//私有权限,同包不同类不能使用
Demo3 Demo3 = new Demo3();
System.out.println(Demo3.pronum);//子类继承父类 protected可以被子类继承 不同包子类可用
}
}
封装
封装就是将类的某些信息隐藏在类内部,不允许外部程序直接访问, 而是通过该类提供的方法来实现对隐藏信息的操作和访问.
我们在类中使用private关键字,使得同包中的其他类可以对使用了private的信息不能进行操作,但是我们可以通过编写一个方法只要符合条件就可以对被private修饰过的信息进行操作.
封装的好处:
只能通过规定的方法进行访问
隐藏类的实现细节
方便加入控制语句或者修改实现方法的条件.
通过上边两张图片我们可以看到,使用了private关键字修饰的变量并不能在TestDemo4中被使用,编译器报错。
下图通过编译新的方法,将使用了private关键字修饰的变量可以被我们使用。



