***封装***(即:将属性变为private -- 只能在当前类内被访问)
【前提】:为什么需要封装?会出现怎样的逻辑隐患??(程序正常运行,可是年龄怎么可能是-3呢??)
***包***
用途:
1、管理java文件;【建议】每个包中,存储信息功能单一的类;(单一职责 原则)
2、解决同名文件冲突;(java中不允许同一个包中存在同名的类)
【???如何实现跨包的类调用???】
调用形式一: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关键字***
访问:
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());
}
***代码块***
静态构造块--->构造代码块--->构造方法--->顺序执行(普通代码块)
【注意】:
1、普通代码块,顺序执行,先出现,先执行;
2、构造代码块,创建对象时调用,优先于构造方法;
(多个构造代码块之间也是顺序执行的)
3、静态代码块,类加载时调用,优先于构造代码块;
(多个静态代码块之间也是顺序执行的)
【总结】:
1、不论创建多少个类对象,静态代码块只执行一次,而构造代码块会每次实例化时都执行一次;
2、静态代码块中,只能对静态成员变量赋值,不能对普通成员变量赋值;实在想要给普通成员变量赋值,则需要创建类对象实现;
3、构造代码块中,可以直接对普通成员变量、静态成员变量直接赋值;
【说明】:如果程序中有需要只加载1次的信息,则可以放到静态代码块中