一、抽象类与接口
抽象类
特点:
1.抽象类中可以构造方法
2.抽象类中可以存在普通属性,方法,静态属性和方法。
3.抽象类中可以存在抽象方法。
4.如果一个类中有一个抽象方法,那么当前类一定是抽象类;抽象类中不一定有抽象方法。
5.抽象类中的抽象方法,需要有子类实现,如果子类不实现,则子类也需要定义为抽象的。
6,抽象类不能被实例化,抽象类和抽象方法必须被abstract修饰
关键字使用注意:
抽象类中的抽象方法(其前有abstract修饰)不能用private、static、synchronized、native访问修饰符修饰。
接口
1.在接口中只有方法的声明,没有方法体。
2.在接口中只有常量,因为定义的变量,在编译的时候都会默认加上public static final
3.在接口中的方法,永远都被public来修饰。
4.接口中没有构造方法,也不能实例化接口的对象。(所以接口不能继承类)
5.接口可以实现多继承
6.接口中定义的方法都需要有实现类来实现,如果实现类不能实现接口中的所有方法则实现类定义为抽象类。
7,接口可以继承接口,用extends。
二、 java里的静态变量是放在了堆内存还是栈内存?
堆区:
1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身
栈区:
1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中
2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
方法区:
1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
3.运行时常量池
常量池:
1.常量池中包含代码中所定义的各种基本类型(如int、long等等)和对象型(如String及数组)的常量值。
1.1 这些类是Byte,Short,Integer,Long,Character,Boolean,另外两种浮点数类型的包装类则没有实现。另 外Byte,Short,Integer,Long,Character这5种整型的包装类也只是在对应值小于等于127时才可使用对象池,也即对象不负 责创建和管理大于127的这些类的对象。大于127的对象存放在堆中。
1.2 String类也实现了常量池技术
2.常量池还包含一些以文本形式出现的符号引用,比如:
2.1 类和接口的全限定名;
2.2 字段的名称和描述符;
2.3 方法和名称和描述符。
三、&,| 与&&,||
1.对于&
String s = null;看下面一段代码
if( (s!=null) & (s.length()>0) ) // String s = null;没有给s开辟空间,s.length()报NullPointerException没有指向的错误
2.对于&&
String s = null;
if( (s!=null) && (s.length()>0) )//&&和|| 是按照“短路”方式求值的。如果第一个操作数已经能够确定表达式的值,第二个操作数就不必计算了
位移运算符:&和| 运算符应用于布尔值,得到的结果也是布尔值,不按“短路”方式计算。即在得到计算结果之前,一定要计算两个操作数的值。
四、内部类
1. 静态内部类:
1). 静态内部类本身可以访问外部的静态资源,包括静态私有资源。但是不能访问非静态资源,可以不依赖外部类实例而实例化。
2. 成员内部类:
1). 成员内部类本身可以访问外部的所有资源,但是自身不能定义静态资源,因为其实例化本身就还依赖着外部类。
3. 局部内部类:
1). 局部内部类就像一个局部方法,不能被访问修饰符修饰,也不能被static修饰。
2). 局部内部类只能访问所在代码块或者方法中被定义为final的局部变量。
4. 匿名内部类:
1). 没有类名的内部类,不能使用class,extends和implements,没有构造方法。
2). 多用于GUI中的事件处理。
3). 不能定义静态资源
4). 只能创建一个匿名内部类实例。
5). 一个匿名内部类一定是在new后面的,这个匿名类必须继承一个父类或者实现一个接口。
6). 匿名内部类是局部内部类的特殊形式,所以局部内部类的所有限制对匿名内部类也有效
五、final
final 修饰符
final 变量:
final 变量能被显式地初始化并且只能初始化一次。被声明为 final 的对象的引用不能指向不同的对象。但是 final 对象里的数据可以被改变。也就是说 final 对象的引用不能改变,但是里面的值可以改变。
final 修饰符通常和 static 修饰符一起使用来创建类常量。
final 方法:
类中的 final 方法可以被子类继承,但是不能被子类修改。
声明 final 方法的主要目的是防止该方法的内容被修改。
如下所示,使用 final 修饰符声明方法。
final 类:
final 类不能被继承,没有类能够继承 final 类的任何特性。
值传递引用传递:https://www.zhihu.com/question/31203609?sort=created
六、变量初始化
1. 类的初始化顺序:父类静态变量 --> 父类静态代码块 --> 子类静态变量 --> 子类静态代码块 --> 父类非静态变量 --> 父类非静态代码块 --> 父类构造方法 --> 子类非静态变量 --> 子类非静态代码块 --> 子类构造方法。
2. 全局变量不初始化有默认值,局部变量必须初始化后才能使用,否则编译错误。
网友评论