抽象方法和抽象类
用abstract修饰
注意:
1.抽象方法没有方法体,只有声明,定义的是一种规范,子类必须定义具体实现;
2,有抽象方法的类必须定义为抽象类,抽象类中可以包含普通方法;
3.抽象类不能实例化,不能用new关键字来实例化;
4,抽象类只能被用来继承,抽象类必须被子类实现;
5.抽象类可以包含属性,方法,构造方法等,但是构造方法不能用来new实例,只能用来被子类调用
接口
接口是比抽象类还抽象的“抽象类”。接口不提供任何实现。接口中的一切都是不变的。接口和它的实现类也不是父子关系,而是实现规则的关系。接口就是规范。
接口的声明:
[访问修饰符] interface 接口名 [extends 父接口1,父接口2…] {
常量定义;
方法定义;
}
接口使用的详细说明:
1.访问修饰符只能是public和默认。
2.extends:接口可以继承多个父接口;
3.常量:接口中的属性只能是常量,默认public Final修饰;
4方法:接口中的方法默认是public abstract修饰
5.实现类可通过implements来实现接口中的规范
6.接口不能创建实例,但是可用于声明引用变量类型
7.一个类实现了接口,则必须实现接口中的所有方法,而且这些方法只能是public的
要了解面向接口编程的思想。
内部类
内部类(innerclasses):顾名思义就是将一个类放在另一个类的内部定义。内部类可以用所有的访问控制符修饰,但是外部顶级类只能用public和default修饰。内部类只是一个编译的概念,一旦编译成功,就会成为两个不同的类。所以内部类是相对独立的存在,其成员变量/方法可与外部类相同。
内部类的作用及使用场合:
1.提供了良好的封装,只能让外部类直接访问,不允许同一个包中的其他类直接访问;
2.内部类可以直接访问外部类的私有属性,内部类被当成其外部类的成员,但外部类不能访问内部类的内部属性和方法
3.接口只是解决了多重继承的部分问题,而内部类使得多重继承的解决方案变的更加完整。
###内部类的分类
内部类分为成员内部类,匿名内部类和局部内部类;
成员内部类:
又分为非静态内部类和静态内部类
-
非静态内部类:
i. 非静态内部类必须寄存在一个外部类对象里。因此,如果有一个非静态内部类对象那么一定存在对应的外部类对象。非静态内部类对象单独属于外部类的某个对象。ii. 非静态内部类可以直接访问外部类的成员,但是外部类不能直接访问非静态内部类成员。
iii. 非静态内部类不能有静态方法、静态属性和静态初始化块。
iv. 外部类的静态方法、静态代码块不能访问非静态内部类,包括不能使用非静态内部类定义变量、创建实例。
v. 成员变量访问要点:
1. 内部类里方法的局部变量:变量名。 2. 内部类属性:this.变量名。 3. 外部类属性:外部类名.this.变量名。
内部类的访问:
1. 外部类中定义内部类:
new Inner()2. 外部类以外的地方使用非静态内部类:
Outer.Inner varname = new Outer().new Inner()。
-
静态内部类
i. 定义方式:
static class ClassName {
//类体
}ii. 使用要点:
-
当一个静态内部类对象存在,并不一定存在对应的外部类对象。 因此,静态内部类的实例方法不能直接访问外部类的实例方法。
-
静态内部类看做外部类的一个静态成员。 因此,外部类的方法中可以通过:“静态内部类.名字”的方式访问静态内部类的静态成员,通过 new 静态内部类()访问静态内部类的实例。
-
匿名内部类
适合那种只需要使用一次的类。比如:键盘监听操作等等。
语法:
new 父类构造器(实参类表) \实现接口 () {
//匿名内部类类体!
}
注意
1. 匿名内部类没有访问修饰符。
2. 匿名内部类没有构造方法。因为它连名字都没有那又何来构造方法呢。
局部内部类
还有一种内部类,它是定义在方法内部的,作用域只限于本方法,称为局部内部类。
局部内部类的的使用主要是用来解决比较复杂的问题,想创建一个类来辅助我们的解决方案,到那时又不希望这个类是公共可用的,所以就产生了局部内部类。局部内部类和成员内部类一样被编译,只是它的作用域发生了改变,它只能在该方法中被使用,出了该方法就会失效。
局部内部类在实际开发中应用很少。
String基础
String类又名不可变字符序列。它位于java.lang 包中,Java程序默认导入java.lang中的所有类。Java字符串就是Unicode字符序列。Java中无内置的字符串类型,而是在标准Java类库中提供了一个预定义的String类。
.Java允许使用符号"+“把两个字符串连接起来。
n-符号”+“把两个字符串按给定的顺序连接在一起,并且是完全按照给定的形式。
n-当”+"运算符两侧的操作数中只要有一个是字符串(String)类型,系统会自动将另一个操作数转换为字符串然后再进行连接。
#####Java的内存分析中,常量池的概念:
1. 全局字符串常量池(String Pool)
全局字符串常量池中存放的内容是在类加载完成后存到String Pool中的,在每个VM中只有一份,存放的是字符串常量的引用值(在堆中生成字符串对象实例)。
2. class文件常量池(Class Constant Pool)
class常量池是在编译的时候每个class都有的,在编译阶段,存放的是常量(文本字符串、final常量等)和符号引用。
3. 运行时常量池(Runtime Constant Pool)
运行时常量池是在类加载完成之后,将每个class常量池中的符号引用值转存到运行时常量池中,也就是说,每个class都有一个运行时常量池,类在解析之后,将符号引用替换成直接引用,与全局常量池中的引用值保持一致。
后面再详细了解常量池
学习如何看官方的API文档以及了解String类的常见方法及使用