基础笔记2(对象)

1。内存模型:

栈:自动分配连续的空间,后进先去,局部变量

堆:存放new出的对象。

     方法区(也是一种堆):类的代码,静态变量,常量

 

2.构造方法和方法名和类名一致。

 

3.重载,方法参数类型,个数,顺序,

注意一个问题(基本数据数据类型的自动提升类型:没有对应的才会提升到存在的:比如short 到int)

 

4.非静态可以调用静态的,静态不能调用非静态,(因为创建的顺序(存在顺序))。

 

5.this.当前类,构造方法。类似的关键字:super(总是在子类构造器默认第一行(隐式的存在)

 

6.toSting():返回的是类名和16进制的hash值

 

7.equals(ob):this==ob即当前对象的比较。(也是tostring()即地址的比较)

 

8.final :

修饰变量,即是常量,不能修改

修饰方法,不能被重写

修饰类。不能被继承。

 

9,继承,封装,多态

 

10.封装:private(类中) default(包中) protect(包和子类中) public(所以类)

成员一般private,get set 使用public 设置,boolean 类型is set.

 

11多态的基本特征:

继承,重写,父类引用指向子类对象

11.1重写:子类的方法的权限大于等于父类;方法的返回类型和异常小于等于父类。

 

12:instanceof  判断对象是某类的实例

 

13:多态补充:

非重写内的方法调用方法,调用的方法是重写的方法。

 

14.抽象方法:没有方法体的方法。

包含抽象方法的类是抽象类。应用于子类需要重写方法。

 

15接口:只有常量和抽象方法(一种规范,和实现分离)

默认变量是 public static final

 

16.回调(callback)或者钩子(hook);模板模式

利用多态将父类调用的方法写好。然后子类重写父类调用的方法,传入父类对象。

m(A a){
1....
2...... a.print(); } 也可以
Interface A { print(){ } class B implement A{ print(){} } main(){ m(new B());//回调 }
或 m(new A(){ print();});//回调方法

17.内部类:更好的封装

非静态内部类,不能有静态成员,因为内部类对象本身是依赖外部类存在的,和设计理念不符。

但是可以有常量(final static),但必须是数值常量。

 

非静态内部的调用

外部类.内部类 类名=new 外部类().new 内部类();

内部类可以直接获取外部类的变量

如果有重名,内部的变量获取 this.变量。 外部变量获取:外部类名.this.变量

 

静态内部类和外部类没有太多的联系(像属于包的关系)

一种方式:mport 路径.外部类.内部类。(像是外部类包下类)就可以平常一样定义此静态内部类了

二种方式:外部.内部类 类名=new 外部类.内部类();

 静态内部类和静态方法一样都只能使用外部类的静态属性。

 

方法内部类:比如方法中加个线程对象

内部对象使用方法中的变量时候,该变量必须是final的即变成常量了,直接复制到对象中。

原因是:生命周期不一样,方法执行完,方法中的变量从栈内删了,而对象可能还在被使用,那么就不能获取到那个变量了。造成生命周期不一致了。

而对于引用对象也是,不加final可能出现,引用被覆盖,然后调用引用得到的是新对象了,方法执行完,内部中本来需要的那个对象没了使用被清理掉了。

 

posted @ 2016-11-09 22:15  假程序猿  阅读(156)  评论(0)    收藏  举报