📄 07_java_advanced_speciality.txt
字号:
内部类
反射
集合
三个修饰符:
static final abstract
static:它用来修饰类中的成员属性和方法.
修饰属性:静态属性
在animal类name和age属性,
这样的属性又叫做实例属性.
和它对应的是静态属性或叫类属性.
属性:
1.实例属性
用来描述某个实例的.
这些属性一定和某个对象相关系.他们就是用来描述对象的.没有对象这些属性就没有意义.
2.静态属性
用来描述类的特征.
这些属性是用来描述整个这个类的特征的.它不合具体的个体/实例/对象相关系.
例子:
动物园:
每个动物脖子上挂描述当前这个动物的牌子
真个动物园动物的数量
差别:
1,访问方式
实例属性:必须要通过对象去访问.a1.name
静态属性:直接通过类名去访问.
2,空间分配的时机的方式不一样.
实例属性:生成对象的时候,每个对象都有一份独立的空间.
静态属性:在类加载的时候分配空间,并且整个类只有一份.
修饰方法:静态方法
1.实例方法.
它用来描述具体某个对象的特征.
2.静态方法.
它用来描述整个类的行为特征.
差别:
访问方式
实例方法,用对象访问.
静态方法,用类名去访问.可以在没有对象之前就可以访问.
限制:
静态方法只能访问静态成员.当然也不能直接去使用this.
为什么:
因为静态方法有可能在没有对象之前就可以调用,那么它的实例成员,在方法中是没有意义的.
那么:在非静态方法访问静态成员.
main()方法为什么一定是静态,因为它是整个程序的入口,那么在调用它之间没有可能做任何事情,所以不能创建任何对象.
静态方法的特点:
静态方法不满足多态的特性.
静态方法是不能被覆盖.
因为:
静态方法是类的描述,它和对象没有关系,然而多态是针对于对象来说的.测试的例子来测试一下.
理解:
一般出现这样的情况是你的代码不符合规范.对于静态方法应当使用类名来调用,而不应当是用对象名来调用.这些属性和方法都用类名去掉不用对象去调用,那么就不会出现这种静态和多态的混乱.
静态方法:描述类的行为的不是描述对象的行为的
修饰代码块:
在类的方法外部用static{....}定义,静态代码块.
在段代码里面能够出现静态成员,非静态成员不能访问.
类被加载完成之后,让系统自动执行.
可以认为静态代码块是类的初始化代码.
类在何时被加载:
1,生成该类的对象的时候.new 该类的对象的时候,会加载这个类以及他的父类.
2,访问类的静态成员的时候.
3,反射内的方法.
如果在程序重要加载这个类,一旦加载后,会直接的去调用静态代码块
Animal a1;这个不会加载类,jvm不用知道你的类型,只用给你分配一个存放引用的空间.
顺序:
1.当的一次发生以下情况之一时jvm要加载类.
1.生成对象
2.访问静态成员
3.Class.forName("");
2.为静态的属性分配空间.(实例化);
3.去执行静态代码块.
这是类加载的时候要做的一些工作.
public class ABC{
static ABC abc=new ABC();
static a=10;//如果把这条语句拿到上面结果就会有变化.
static b;
public ABC(){
a=20;
b=10;
}
public static void main(){
System.out.println(ABC.a);
System.out.println(ABC.b);
}
}
//结果时10,20
//在创建abc对象的时候给变量传值了,之后初始化属性a的时候又一次赋了初值.
final:它能够修饰类,属性,方法,方法中的局部变量.
修饰类:表示这个类不能被继承.
修饰属性:该属性不能改变.只能赋一次值
修饰方法:该方法不能被覆盖
修饰局部变量:一点定义下来,不能被改变.
修饰属性和方法的特征:
final int n=10;//属性.
n是常量,如果这样,我哪怕在程序中生成100个1000个对象,每个对象都有一个n的空间.由于他们都相同.到不如怎么变化一下n在每个类里面都只保留一份.
static final经常合起来使用.
又一种情况例外:
final int s;
//可以在构造方法里面去赋值.
这是说:在不同对象中,对象的该常量的值不同.
只不过这个对象定下来,这个对象就不可以改了.
static final 在定义的时候赋值.
final 可以在构造方法里面赋值.
abstract:用来修饰一个类或者方法.
修饰类,抽象类.
修饰方法,抽象方法.
例子:动物..移动的方法..抽象的.
把它的方法做成一个抽象方法.在方法后面不要{}直接要;,在前面加上abstract关键字.
无法确定具体行为,那么就做成抽象方法.
意义:
抽象方法,实际上是留给子类去实现的.
规则:
如果类里面有抽象方法了必须定义成抽象类.
反过来,如果某个类没有任何抽象方法,它继承自抽象类,它也是抽象类.
抽象类不能够实例化,但是可以声明引用,所以可以去利用多态引用到子类.
抽象类实际上是个抽象的概念.
抽象类和普通的类的唯一差别是不能实例化.
其他的所有内容都父类子类的关系一样.
子类继承自一个抽象类,那么如果你的子类不是抽象类,那么它就要实现父类里面的方法.方法的实现等同方法的覆盖.给出实现体.不论你的大括号里面有没有语句.
final和abstract不可以同时使用,如果用了abstract那么就是个抽象类,抽象类就是希望去被覆盖,如果声明了final那么就不可以完成.
接口
特殊的抽象类.
1.接口中的所有方法都是公开抽象方法.
2.接口所有属性都是final static
3.接口没有构造方法.接口不仅不能实例化,并且没有构造方法.
为什么抽象类有构造方法,因为抽象类有子类.接口没有子类只有实现类
4.一个类可以同时实现多个接口.
类去实现接口的关系,可以认为是变相的继承关系.
5.一个接口也可以同时继承自多个接口.
类继承父类,实现接口的差别:
所有类都有个父类.
一个类可以继承父类,也可以实现接口,没有冲突.
以前的对象就是个单面体.你可以去定义这个坦克能干什么.
现在如果有了接口,那么我们就可以不同的方式看待坦克,从移动的角度看待,它就是个交通工具.如果把它当作武器来看它就是一个可以攻击的武器.移动和武器都是接口.
行看成岭侧成峰,各个角度都不同.
不识坦克真面目,只因你在用接口.
接口给编程带来的好处
1.实际上接口是将服务的提供者和服务的使用者分离.
也就是说:
接口相当于指定一个标准.对于服务的使用者只需要关心服务的使用.不用关心具体的实现
最终这样做的好处就是能够降低耦合度.
一个良好的软件设计的六字箴言,
高内聚,
类独立万称工作的能力全面.执行的时候只需要做很少的通信.
低耦合.
相互之间依赖很少.
为了的是提高我们软件的可扩展性和可维护性.
扩展性:
只需要了解和我要使用的模块的几个功能.
维护性:
为什么说面向接口编程降低了我们程序的耦合度.
JDBC sun定义的一套接口.
把服务的提供者和访问者,中间的接口把两者隔离开.
上层应用和底层实现的关联关系的耦合度降低了.
2.不要面向对象编程要针对接口,针对抽象编程.
尽量不要出现那个具体的实现类.
在程序中本来就要,不用具体的类型,而用一个抽象的类型.
你的实现变了,我的抽象不用变.
是不是我整个的代码都要改变.
接口定的细
1.减少实现类的负担
2.给用我的接口人提供个性化的服务.
我们希望制做一个用户管理系统.可以为是软件中的模块.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -