一、final关键字
public class FinalTest {
//final可以修饰变量,修饰完的变量成为常量
public void doSomething(final Student student){
//在方法调用的时候会进行第一次赋值,所以在通过new创建对象就是给
//Student对象进行二次赋值,所以报错
//Student = new Student();
}
//final可以修饰方法,但是final修饰的方法不可以被重写
public final void saySomething(){
System.out.println("final修饰的方法");
}
}
//final可以修饰类 但是final修饰的类没有子类只有父类
final class Test01 extends Test02{}
class Test02 extends FinalTest{
public void method(){
//final修饰的方法可以被继承到
saySomething();
}
}
//class Test03 extends Test01{}
class Test04{}
final修饰的类不能被继承,因此没有子类
final修饰的方法不能被重写:private、static修饰的方法不能被重写,默认为final修饰
final可以用来修饰常量
final修饰方法的形参:不能改变形参的值
二、继承
1.创建父类
public class Person {
String name="张飞";
private int age;
public Person(){
System.out.println("父类的构造方法");
}
public void method(){
System.out.println("父类中的方法");
}
public void lea(){
System.out.println("1");
}
public void work(){
System.out.println("父亲的工作是挣钱养家");
}
}
2.子类中的实现
public class Student extends Person {
@Override
public void work() {
System.out.println("孩子的工作是努力学习");
}
public Student(){
//在子类的构造方法中可以调用父类的构造方法,用于初始化父类属性
//如果父类是无参的构造方法,那么子类可以省略显示调用父类的构造方法,但是如果
//父类没有无参的构造方法,子类必须显示调用父类的构造方法,否则编译报错
// super(a:10);//必须放在方法的第一行
System.out.println("子类的构造方法");
}
String name = "张楠";
public void doSomething(){
//当父类中的成员跟子类中的成员名字相同时,在子类中会将父类的成员屏蔽掉,
//可以通过super调用父类的成员,解决这个问题
System.out.println(name);
System.out.println(super.name);
}
public static void main(String[] args) {
Student s = new Student();
System.out.println(s.name);
//父类中用private修饰的成员,属于父类独有的,子类不能在集成到了
// System.out.println(s.age);
s.method();
s.work();
s.doSomething();
s.lea();
}
}
三、方法重写(覆写、覆盖)
方法重写,当父类方法不能满足子类需要的时候,可以通过方法重写,解决重写方法的名字,直接回车
方法重写的规则:
1.要有继承,并且在子类中重写
2.重写方法与被重写方法:
(1)方法名称相同
(2)参数个数、类型、顺序相同
(3)返回类型一致或是协变返回类型
(4)协变返回类型:重写方法的返回类型是被重写方法返回类型的子类(或实现类类型)
3.private修饰的方法不能被重写
4.子类方法不能缩小父类方法的访问权限
5.子类方法不能抛出比父类方法更多的异常
6.非静态方法不能被static修饰的方法重写
7.static修饰的方法不能被重写,但static修饰的变量和方法都可以被屏蔽
四、类的继承
extends 表示继承关系,关键字在左侧的是子类,右侧是父类
子类又叫派生类,父类又叫基类或超类
继承之后子类会自动拥有父类的成员 java是单继承,只有一个父类
子类将继承父类的非私有属性和方法
一种在保持对象差异性的同时共享对象相似性的复用
通过继承,子类自动拥有父类的所有成员(成员变量和方法),父类的构造方法不能被子类继承
子类的引用可以访问继承父类成员,父类的引用不能访问子类中独有的成员
类声明时,使用extends关键字表示两个类的继承关系
权限修饰符:
1.子类不能继承父类中用private修饰的成员
2.子类与父类不在同一个包时,不能继承父类中用private修饰和默认的成员
java不支持多继承
五、重写与重载的比较
相同点:方法名相同
不同点:
1.使用条件:
(1)方法重写必须有继承,在子类中重写
(2)方法重载在同一个类中
2.参数
(1)方法重写参数类型、个数、顺序一致
(2)方法重载参数类型、个数、顺序至少一个不一致
3.返回类型
(1)方法重写方法返回类型必须一致或可协变
(2)方法重载对返回类型无要求,可以一致或不一致
4.次数:
(1)父类的一个方法只能被一个子类重写一次
(2)一个类中可以有一个方法的多个重载方法
5.权限和异常
(1)方法重写对方法的访问权限和抛出的异常有特殊的要求
(2)方法重载没有限制
重写只有发生在父类与子类之间,而重载可以发生在同一个类中
简述方法重载和方法重写的区别:
(1)方法重载和方法重写是Java多态性的不同表现。重载是一个类中多态性的一种表现,重写是父类与子类之间多态性的一种表现。
(2)如果在同一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,与返回值无关,则称为方法的重载。
(3)如果在子类中定义某方法与其父类有相同的名称、参数和返回值,我们说该方法被重写。子类的对象使用这个方法时,将调用子类中定义的。
六、作用域
方法内定义局部变量屏蔽类中同名的成员变量
子类继承父类:
1.子类中定义与父类同名的成员变量时,在子类范围内,屏蔽父类的成员变量
2.子类某成员方法重写父类方法,在子类范围内,屏蔽父类的成员方法
3.子类某静态方法与父类方法同名,在子类范围内,屏蔽父类的方法
七、super关键字
super:代表本类继承的直接父类当前的对象
用法:
1.在子类构造方法中通过super关键字调用这个类的父类的构造方法
(1)构造方法调用顺序:根基类、…、父类的父类、父类、子类
(2)默认调用无参构造方法
(3)父类若无无参构造方法,必须在子类构造方法中显式调用父类构造方法,否则编译报错
注:只能放在方法第一行,this()与super()不能在同一方法中使用
例如:super();或super(1,‘L’,50);
2.实例方法内局部变量或参数与成员变量同名,成员变量在实例方法内被屏蔽时,可以使用super关键字调用
例如:super.no=no;
注:静态方法中不能使用this和super关键字
八、不变模式
1.不变模式只设计到一个类,一个类的内部状态创建后,在整个生命周期都不会发生变化时,这样的类就叫不变类,使用不变类的做法就叫做不变模式
2.弱不变模式:一个类的实例状态是不变的,但是这个类的子类实例具有可能会变化的状态
(1)类的成员变量权限修饰符为private,set方法不设置成员变量
(2)缺点:子对象可以是可变对象
3.强不变模式:一个类的实例状态是不变的,这个类的子类实例也具有不可变化的状态。实现的途径是类所有的方法都是final类型,或者类本身用final修饰(没有子类)
九、对象池
1.虚拟机在启动的时候会实例化9个对象池,这9个对象池分别用来存储8种基本类型的包装类对象和String对象
2.String使用对象的方法:第一种方法在对象池种拿对象,第二种方法直接生成新的对象