三个关键词
面试题:实现多态的方式有哪些?区别是什么?
有两种方式:方法重写 方法重载
区别:
方法重载:静态方式实现多态,在java编译时就已经确定了重载的方法,调用时根据参数决定调用哪个重载
方法重写:动态方式实现多态,在调用时,根据父类的引用指向那个子类对象,就用哪个子类的方法去覆盖掉那个父类中的方法
问题:子类和是覆盖掉父类中的方法?–在调用时
super和this不能同时出现在一个构造方法里
当出现this()时,会在this()里调用super()方法
类型转换
自动类型转换:级别低的自动转向级别高的
强制类型转换
向上类型转换:也称为装箱,自动完成,把子类转换为父类类型
向下类型转换:也称为拆箱,强制完成,把父类转换为子类类型
面向对象3大特征:封装、继承、多态
面向对象4大特征:抽象、封装、继承、多态
面向对象的设计思路:
- 抽象。发现类
- 发现类的属性
- 发现类的方法
- 优化:封装,继承,多态
关键字
abstract:抽象
【说明】抽象方法所在的类一定是抽象类,抽象类中不一定有抽象方法
首相类不能被new,但有构造方法
子类继承父类后,如果父类中有抽象方法,那么子类必须重写(实现)父类中的抽象方法
作用:1、无法确定方法体
2、约束子类的作用,子类必须重写父类的抽象方法,除非子类也具有抽象性
【经验】:如果某个类不想被new,那么就可以声明为abstract类,统称为父类用作引用类型
stract:静态的
能修饰属性、方法、内部类、代码块
【说明】static修饰的成员在程序运行后,就自动加载到内存的方法区中,所以静态成员可以直接访问
访问方式:类名.静态成员名
当程序关闭后,方法区中的static成员才会消失
【经验】各个对象公共的属性、方法 才设置为static
非static修饰的成员,称为实例成员
静态成员和实例成员之间的互相访问
package com.qf.pro2103.day12.statics;
public class Teacher {
public static void main(String[] args) {
// TODO Auto-generated method stub
//在静态方法中可以直接访问静态成员
Teacher.m1();
//在同一类中,静态成员之间互相访问,可以不通过类名,建议通过类名访问
m1();
//在静态方法中不能直接调用实例成员
//Teacher.m2();
Teacher t=new Teacher();
t.m2();
}
//静态方法
public static void m1(){
System.out.println("m1");
}
//实例成员,只有在new后才在堆空间中存在
public void m2
System.out.println("m2");
}
}
在实例方法中,是否可以直接访问静态成员?—可以
{}括起来的代码称为动态代码块
执行顺序在属性初始赋值之后,构造方法之前被执行,作用给属性赋值指定初始值
JVM
编写.java文件 编译成.class文件 jvm运行.class文件
带有静态成员的对象的创建过程
1、父类的静态成员—属性
2、父类的静态成员—代码块
3、子类的静态成员—属性
4、子类的静态成员—代码块
----------------以上是静态,以下是实例的
5、父类的实例属性
6、父类的动态代码块
7、父类的构造方法
8、子类的实例属性
9、子类的动态代码块
10、子类的构造方法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aoRpDJhQ-1628596585045)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20210810195036731.png)]
final最终的
修饰3类成员
修饰属性:常量,值不能被更改
package com.qf.pro2103.day12.finals;
public class Student {
//使用final修饰变量就是常量:不能通过代码改变其值
//常量命名时都使用大写字母
//【说明】属性常量在声明的同时必须赋值
public final String SCHOOL_NAME="千锋大连";
public void test1(){
//SCHOOL_NAME="千锋";//不能改变常量的值
final String CLASS_NAME;
CLASS_NAME="java2103";//局部常量,先声明,然后赋值
System.out.println(CLASS_NAME);
//CLASS_NAME="JAVA2103"; //局部常量赋值后,就不能改变其值。
}
}
修饰方法:最终方法,不能被子类重写
package com.qf.pro2103.day12.finals;
public class Animal {
public final void say(){
System.out.println("你瞅啥?");
}
}
package com.qf.pro2103.day12.finals;
public class Dog extends Animal {
public void say(){ //子类不能重写父类中final修饰的方法
System.out.println("狗在巡视");
}
}
修饰类:最终类,不能被继承
package com.qf.pro2103.day12.finals;
public final class Luozi {
}
package com.qf.pro2103.day12.finals;
public class XiaoLuozi extends Luozi {
}
终类,不能被继承
package com.qf.pro2103.day12.finals;
public final class Luozi {
}
package com.qf.pro2103.day12.finals;
public class XiaoLuozi extends Luozi {
}
String 就是final修饰的,不能有子类