Java继承
-
特点:
1、利于代码复用
2、缩短开发周期
-
一种类与类之间的关系
-
使用已存在的类的定义作为基础建立新类
-
新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类
-
满足“A is a B”的关系就可以形成继承关系
-
父类的构造方法不允许被继承,不允许被重写,但是会影响子类对象的实例化
继承的实现
-
使用extends关键字
-
//编写父类 class Animal{ //公共属性和方法 } //编写子类 class Dog extends Animal{ //子类特有的属性和方法 } class Cat extends Animal{ }
-
一个子类只能继承一个父类
-
子类只可以访问父类非私有成员
-
父类不可以访问子类特有成员
方法的重写
-
在子类中定义,重写父类中的方法
-
方法名,参数列表(参数类型、顺序、个数)都要与父类继承的方法相同,对参数名无限制
-
当子类重写父类方法后,子类对象调用的是重写后的方法
-
返回值对方法重写的影响:
-
如果是void或基本数据类型,必须完全相同
-
如果是自定义的引用数据类型,方法的返回值允许是父类或者是它的子类
-
-
访问修饰符对方法重写的影响:
-
可以修改
-
但访问范围需要大于大于父类的访问范围
-
访问修饰符
-
公有的:public
-
访问权限最大
-
允许在任意位置访问
-
-
私有的:private
-
访问权限最小
-
只允许在本类中进行访问
-
可以实现数据安全性的限定
-
-
受保护的:protected
-
允许在当前类、同包子类/非子类、跨包子类调用
-
跨包非子类中不允许
-
-
默认
-
允许在当前类、同包子类、同包非子类调用
-
跨包子类/非子类不允许
-
访问修饰符 | 本类 | 同包 | 子类 | 其他 |
---|---|---|---|---|
private | ✔ | × | × | × |
默认 | ✔ | ✔ | × | × |
protected | ✔ | ✔ | ✔ | × |
public | ✔ | ✔ | ✔ | ✔ |
super
-
父类对象的引用
-
访问父类成员方法
super.print();
-
访问父类属性
super.name;
-
访问父类构造方法
super();
-
-
继承后的初始化顺序:
-
父类静态成员
-
子类静态成员
-
父类对象构造
-
子类对象构造
-
-
访问修饰符不影响静态成员加载顺序,静态成员加载顺序跟书写位置有关
-
子类的构造过程中必须调用其父类的构造方法
-
子类构造默认调用父类无参构造方法
-
可以通过super()调用父类允许被访问的其他构造方法,,super()必须放在子类构造方法有效代码第一行
-
super关键字不能在静态方法中被调用
-
构造方法调用时,super和this不能同时出现
Object类
-
Object类是所有类的父类
-
一个类没有使用extends关键字明确标识继承关系,则默认继承Object类(包括数组)
-
Java中的每个类都可以使用Object中定义的方法
-
equals():
-
继承Object中的equals方法时,比较的是两个引用是否指向同一个对象
-
子类可以通过重写equals方法的形式,改变比较的内容
-
-
toString():
-
输出对象名时,默认会直接调用类中的toString
-
继承Object中的toString方法时,输出对象的字符串表示形式:类型信息+@+地址信息
-
子类可以通过重写toString方法的形式,改变输出的内容以及表现形式
-
final关键字
-
修饰类public final class/final public class:该类没有子类
-
final修饰方法:该方法不允许被子类重写,但是可以正常被子类继承使用
-
final修饰方法内的局部变量:只要在具体被使用之前赋值即可,一旦赋值不允许被修改
-
final修饰类中的成员属性:赋值过程:1、定义直接初始化 2、构造方法 3、构造代码块
-
final不能用来修饰构造方法
-
修饰变量表示不允许修改
-
基本数据类型的变量》》初始赋值之后不能更改
-
引用类型的变量》》初始化之后不能再指向另一个对象,但对象的内容是可变的
-
-
可配合static使用:
-
方法
-
变量
-
-
使用final修饰可以提高性能,但会降低可扩展性
注解
-
JDK1.5版本引入的一个特性
-
可以声明在包、类、属性、方法、局部变量、方法参数等的前面,用来对这些元素进行说明、注释
-
按运行机制分:
-
源码注解,注解只在源码阶段保留,在编译阶段会被丢弃
-
编译时注解,注解会在编译时期保留,在加载class文件时会被丢弃
-
运行时注解,在运行阶段还起作用,甚至会影响运行逻辑的注解
-
-
按照来源分:
-
来自JDK的注解
-
来自第三方的注解
-
我们自己定义的注解
-
-
元注解:注解的注解
单例模式
-
设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案
-
设计模式是基于场景的解决方案
-
如果某个新场景的解决方案被认可,那我们就可以定义一个新的设计模式
-
单例模式
-
目的:使得类的一个对象成为该类系统中的唯一实例
-
定义:一个类有且仅有一个实例,并且自行实例化向整个系统提供
-
优点:
-
在内存中只有一个对象,节省内存空间
-
避免频繁的创建销毁对象,提高性能
-
-
缺点:
-
扩展比较困难
-
如果实例化后的对象长期不利用,系统将默认为垃圾进行回收,造成对象状态丢失
-
-
要点:
-
某个类只能有一个实例
-
必须自行创建实例
-
必须自行向整个系统提供这个实例
-
-
实现:
-
只提供私有的构造方法
-
含有一个该类的静态私有对象
-
提供一个静态的公有方法用于创建、获取静态私有对象
-
-
-
使用场景:
-
1、创建对象时占用资源过多,但同时又需要用到该类对象
-
2、对系统内资源要求统一读写,如读写配置信息
-
3、当多个实例存在可能引起程序逻辑错误,如号码生成器
-
饿汉式
-
对象创建过程中实例化
-
package com.imooc.singleton; //饿汉式:创建对象实例的时候直接初始化 public class SingletonOne { //1、创建类中私有构造 private SingletonOne() { } //2、创建该类型的私有静态实例 private static SingletonOne instance=new SingletonOne(); //3、创建公有静态方法返回静态实例对象 public static SingletonOne getInstance() { return instance; } }
-
速度快,空间大
-
类加载时就创建实例
-
饿汉式线程安全
懒汉式
-
静态公有方法中实例化
-
package com.imooc.singleton; //懒汉式:类内实例对象创建时并不直接初始化,直到第一次调用get方法时才完成初始化操作 public class SingletonTwo { //1、创建私有构造方法 private SingletonTwo() { } //2、创建静态的该类实例对象 private static SingletonTwo instance=null; //3、创建开放的静态方法提供实例对象 public static SingletonTwo getInstance() { if(instance==null) instance=new SingletonTwo(); return instance; } }
-
时间换空间
-
第一次使用时进行实例化
-
懒汉式存在线程风险
-
同步锁
-
双重校验锁
-
静态内部类
-
枚举
-