目录
22.this关键字
特点:this代表其所在函数所属对象的引用
用的时候:当在函数内需要用到调用该函数的对象时,就用this来表示这个对象
this语句:
功能:实现构造函数之间的调用
要求:this语句只能定义在构造函数的第一行
Person(String name){
this.name = name;
}
Person(String name,int age){
this(name); //注意这的this后面没有点号 这就是this语句
this.age = age;
}
23.static关键字
特点:
① 随着类的加载而加载
② 优先于对象存在
③ 被所有对象所共享
④ 可以直接被类名调用
注意:
① 静态方法只能访问静态成员
② 静态方法中不可以写this,super关键字
③ 主函数是静态的
好处:
对对象的共享数据进行单独空间的存储,节省空间,没有每一个对象都存储一份
可以直接被类名调用
弊端:
生命周期过长。
访问出现局限性(静态只能访问静态的)
24.实例变量和类变量的区别
① 存放位置:类变量随着类的加载而存在方法区中
实例变量随着对象的建立而存于堆内存中
② 生命周期:类变量生命周期最长,随着类的消失而消失
实例变量随着对象的消失而消失
25.静态的使用注意事项
① 静态的只能引用静态的方法和变量而非静态的什么都可以
② 静态方法中不可以定义this,super关键字
静态对象是用时候:
当对象中出现共享数据时,该对象被静态所修饰
对象中的特有数据要定义成非静态存在于堆内存中
静态函数使用的时候
当功能内部没有访问到非静态数据(对象特有数据)那么该功能可以定义成静态
26.主函数的格式
主函数是固定格式的jvm识别,传入的是new String[0];
27.静态代码块
static{
//静态代码块语句
}
特点:随着类的加载而执行,只执行一次并且优先于主函数执行
功能:用于给类进行初始化
加载时间:用的时候才加载
28.单例设计模式
解决的问题:解决一个类在内存中值存在一个对象
① 将构造函数私有化
② 在类中创建一个本类对象
③ 提供一个方法可以获取到该对象
写法一:称为饿汉式(开发一般用这个因为安全)
class Single(){
private Single() {}
private static Single s = new Single();
public static Single getInstance(){
return s;
}
}
写法二:称为懒汉式(延迟加载)
class Single(){
private Single() {}
private static Single s = null;
public static Single getInstance(){
if(s==null){
synchronized(Single.class){
if(s==null){ //当CPU处理完这一句去处理别的程序去了就完蛋了
s = new Single();//用同步可以避免面试爱考
}
}
}
return s;
}
}
29. 继承 A extends B
① 提高了代码的复用性
② 让类与类直接产生了关系,才有了多态的特征
③ java中除接口外只支持单继承,因为多继承容易带来安全隐患:当父类中功能重复,就不知运行哪一个了
④ java支持多层继承,也就是一个继承体系
注意:千万不要为了获取别的类的功能而继承,必须是类与类之间有所属关系才可以继承,所属关系是 is a
java虽不支持多继承但保留了这种机制,就是多实现
方法:查阅父类功能,创建子类对象使用功能
30.聚集关系 has a
① 聚合:有什么
② 组合:是一部分(更紧密)
31.super
子类中调用父类中的为了区分可以用super调用
super 代表父类对象的引用
super 语句一定要定义在子类构造函数的第一行
32.重写
子父类方法要一模一样,返回类型要一模一样
注意:
① 子类覆盖父类,必须保证子类权限大于等于父类权限,才可以覆盖,否则编译失败
② 静态只能覆盖静态
33.子父类中的构造函数
在对子类对象进行初始化时父类的构造函数先会运行,因为所有的构造函数的第一句有一个默认的super();
调用父类的无参的构造函数语句
子类必须要访问父类的构造函数,若父类没有默认的构造函数,那么子类必须要调用父类的有参的构造函数,
否则编译不会通过,因为父类中的数据子类可以直接获取,所以子类在建立的时候要先看父类如何初始化的,
所以子类在对对象初始化时要先访问父类的构造函数
构造函数里面要么有this(); 要么有super(); 二者不能共存
34.final
最终。作为一个修饰符
① 可以修饰类,函数,变量
② 被final修饰的类不可以被继承,为了避免被子类继承,被子类复写功能
③ 被final修饰的方法不能被复写
④ 被final修饰的变量是一个常量只能赋值一次,既可以修饰成员变量也可以修饰局部变量
public static final double PI = 3.14;
⑤ 内部类定义在类中的局部位置上时,只能访问该局部被final修饰的局部变量
35.抽象 abstract
特点:
① 抽象方法只能放在抽象类中
② 抽象方法和抽象类都必须被abstract关键字修饰
③ 抽象类不可以用来new创建对象,因为调用抽象方法没有意义
④ 抽象类中的方法要被使用,必须由子类复写所有的抽象方法后建立子类对象调用
如果子类只覆盖了部分的抽象方法那么该子类还是一个抽象类
⑤ 抽象类中可以不定义抽象方法,这样做仅仅是不让该类建立对象
36.模板方法设计模式
在定义功能时,功能的一部分是确定的,担有一部分是不确定的,而确定的部分在使用不确定的部分
那么就将不确定的部分暴露出去,有该类的子类去完成。
例:
abstract class GetTime{
final public void getTime(){
long start = System.currentTimeMillis();
runCode();
long end = System.currentTimeMillis();
System.out.println("运行的时间"+(start-end));
}
abstract public void runCode();
}
class SubTime extends GetTime{
public void runCode(){
for(int i=0;i<1000;i++){
System.out.print(i);
}
System.out.println();
}
}
public class TemplateDemo {
public static void main(String[] args) {
SubTime st = new SubTime();
st.getTime();
}
}
37.接口 interface
格式特点:
① 接口中常见的定义:抽象方法,常量
② 修饰:常量:public static final
方法:public abstract
③ 接口中的成员都是 public的,只要写上了interface就有了默认的修饰符
但是还是写全了比较好,为了提高可阅读性
接口的特点:
① 接口是对外暴露规则
② 接口是程序的功能扩展
③ 接口可以用来多实现
④ 接口与接口之间是实现关系,而且类可以继承一个类的同时实现多个接口
⑤ 接口和接口之间可以有继承关系
implements 实现接口的关键字
接口是不可以创建对象的,因为有抽象方法,需要被子类实现,子类对接口的抽象方法
全部覆盖后,子类才可以实例化,否则子类是一个抽象类
通过接口的名字是可以调用接口里面的常量的,因为在编译后接口也相当于类,是class文件
接口支持多实现:
interface A{
}
interface B{
}
class Test implements A,B{ //这就是多实现
}
接口与接口之间的关系:且接口之间存在多继承,因为没有方法体,是不会有冲突的但要求接口中不允许有相同的方法
interface A{}
interface B extends A{}
interface C extends B,A{}