java三大特性 ~ 封装(封装、包、static、代码块)

***封装***(即:将属性变为private -- 只能在当前类内被访问)

【前提】:为什么需要封装?会出现怎样的逻辑隐患??(程序正常运行,可是年龄怎么可能是-3呢??)

 java三大特性 ~ 封装(封装、包、static、代码块)

java三大特性 ~ 封装(封装、包、static、代码块)

 

 

 

***包***

用途:

1、管理java文件;【建议】每个包中,存储信息功能单一的类;(单一职责 原则)

2、解决同名文件冲突;(java中不允许同一个包中存在同名的类)

java三大特性 ~ 封装(封装、包、static、代码块)

java三大特性 ~ 封装(封装、包、static、代码块)

 

 

【???如何实现跨包的类调用???】

调用形式一:java文件开头导入包  

 import  xxx.*;//加载包下的所有类  工作量大

 import  xxx.Cat;//加载包下的指定类   建议使用

调用形式二:直接在代码中加载

  {
       xxxx.Cat cat=new  xxxx.Cat( );
  }

调用形式三:如果需要导入两个包,但是这两个包中有相同名字的类,则:        

import  xxxx.Cat;
import xxxx1.*;
{
   Cat cat=new  Cat( );   //这里调用的是xxxx包下的Cat类,直接找到指定到的类,
   
   xxxx1.Cat  cat = new xxxx1.Cat( );
                         //如果还有别的需要xxxx1包中的Cat类,则创建对象时需指定具体的包名,
}

【注意】:import  包名.* ,只能访问指定包名下的类,无法访问子包下的类;(xx下还有xxx、xxx1,则import xx.* //报错,因为不能指定到xxx/xxx1下的类)

 

***static关键字***

java三大特性 ~ 封装(封装、包、static、代码块)

访问:

1、类名.静态成员名Cat . price=3000;)   推荐使用

2、对象名.静态成员名cat . run( ) =3000;)  //会有警告标志,但可使用

 

【注意】:

1、所有对象共用;(在内存中仅开辟了同一个空间)

2、在普通成员方法中,可以直接访问类中的静态成员/静态方法;   

3、在静态方法中,不能直接访问同一个类中非静态成员(普通成员变量)/非静态方法(普通成员方法),只能直接调用静态成员/静态方法;

【补充】:如果实在想用,则只能通过再次对象实例化后,对象.成员方法/成员变量 ===》才能访问 非静态成员/非静态方法;

4、静态方法中不能使用this;

【e.g】:

char ch='c';

static char getMChar(){

    return ch;     //编译出错,静态方法中不能直接访问非静态成员

}

public static void main(String[] args) {

    System.out.println(new Demo().getMChar());

}

 

***代码块***

java三大特性 ~ 封装(封装、包、static、代码块)

 

静态构造块--->构造代码块--->构造方法--->顺序执行(普通代码块)

 

【注意】:

1、普通代码块,顺序执行,先出现,先执行

2、构造代码块创建对象时调用,优先于构造方法;

(多个构造代码块之间也是顺序执行的)

3、静态代码块类加载时调用,优先于构造代码块;

(多个静态代码块之间也是顺序执行的)

 

【总结】:

1、不论创建多少个类对象,静态代码块只执行一次,而构造代码块会每次实例化时都执行一次;

2、静态代码块中,只能对静态成员变量赋值,不能对普通成员变量赋值;实在想要给普通成员变量赋值,则需要创建类对象实现;

3、构造代码块中,可以直接对普通成员变量、静态成员变量直接赋值;

 

【说明】:如果程序中有需要只加载1次的信息,则可以放到静态代码块中