目录
1.多态
多态指同类型的对象,表现出不同形态,从而提升代码复用性。
多态创建对象的方法:Fu f = new Zi();
多态调用特点:调用成员变量的特点:编译看左边,运行也看左边
调用成员方法的特点:编译看左边,运行看右边
public class Test1 {
public static void main(String[] args) {
Person p = new Student(); //创建方式
//调用成员变量的特点:编译看左边,运行也看左边
System.out.println(p.name); //输出为“人”,若父类没有name则报错
p.show(); //输出为“这是子类的方法”,若父类没有show方法则报错
}
}
class Person{
String name = "人";
public void show(){
System.out.println("这是父类的方法");
}
}
class Student extends Person{
String name = "学生";
public void show(){
System.out.println("这是子类的方法");
}
}
2.多态的优势和弊端(包括解决办法)
多态的优势:方法中,使用父类型作为参数,可以接收所有子类对象
多态的弊端:如果是用多态创建的对象不能调用子类特有的功能
public class Test02 {
public static void main(String[] args) {
Animal a = new Dog();
a.eat(); //多态成员方法:编译看左边,运行看右边
a.lookhome(); //报错,多态对象不能调用子类的特有方法,
//因为编译看左边,父类没有的话直接报错
//那么如何解决呢?类型转换
Dog d = (Dog) a;
d.lookhome();
//java新特性,判断类型与强制转换写成一行代码
//先判断a是否为Dog类型,如果是,则强转成Dog类型,转换之后变量名为d
// 如果不是,则不强转,结果直接是false
if(a instanceof Dog d){
d.lookhome();
} else if (a instanceof Cat c) {
c.catchMouse();
}else {
System.out.println("没有这个类型,无法转换");
}
}
}
class Animal{
public void eat(){
System.out.println("动物在吃东西");
}
}
class Dog extends Animal{
@Override
public void eat(){
System.out.println("狗吃骨头");
}
public void lookhome(){
System.out.println("狗在看家");
}
}
class Cat extends Animal{
@Override
public void eat(){
System.out.println("猫吃鱼");
}
public void catchMouse(){
System.out.println("猫在抓老鼠");
}
}
3.包
包就是文件夹。用来管理各种不同功能的lava类,方便后期代码维护
包名的规则:公司域名反写+包的作用,需要全部英文小写,见名知意。com.mzz.domain
当需要使用其他包的类时,为了避免写全类名的麻烦,就需要导包
- 使用同一个包中的类时,不需要导包
- 使用java.lang包中的类时,不需要导包
- 其他情况都需要导包
- 如果同时使用两个包中的同名类,需要用全类名
4.final关键字
当使用final修饰:
- 方法:表明该方法是最终方法,不能被重写,常用于不希望别人重写改变的方法规则(比如Object类中获取字节码文件的方法)
- 类:表明该类是最终类,不能被继承,例如String类,所以说String字符串是不可变的
- 变量:叫做常量,只能被赋值一次
其中,当final修饰变量比较常见,这时的变量也可称为常量,
final修饰的变量是基本类型:那么变量存储的数据值不能发生改变
final修饰的变量是引用类型:那么变量存储的地址值不能发生改变,对象内部的可以改变
final Student s = new Student();
s = new Student();
//报错,final s不能分配新的地址
final int[] arr = {1,2,3,4,5};
arr[1] = 20;
//正确
5.权限修饰符
权限修饰符的使用规则:
实际开发中,一般只用private和public
- 成员变量私有
- 方法公开
特例:如果方法中的代码是抽取其他方法中共性代码,这个方法一般也私有。
6.代码块
6.1局部代码块
可以写在方法里,不常用,用于管理变量的生命周期,大括号结束即变量被回收,用于节约内存,但是现在内存都很大,不怎么需要了。
public static void main(String[] args) {
{
int a = 10;
System.out.println(a);
}
}
6.2构造代码块
抽取几个构造方法中共同的部分,优先于构造方法执行,也是为了节约内存,不够灵活(只要实例化对象一定会执行)不常用。
6.3静态代码块
用static{}包裹的代码块,需要通过static关键字修饰,随着类的加载而加载,并且自动触发、只执行一次,无论创建多少个对象都只会执行一次,可以用于数据初始化,比如对于某些信息管理系统,可以在main函数之前初始化信息。
public class test3 {
static ArrayList<User> list = new ArrayList<>();
//static静态代码块只能调用static的数据,所以ArrayList也要定义为静态变量
static {
list.add(); //初始化用户列表中的信息
}
public static void main(String[] args) {
}
}