(六)Java面向对象进阶知识2

目录

1.多态

2.多态的优势和弊端(包括解决办法)

3.包

4.final关键字

5.权限修饰符

6.代码块

6.1局部代码块

6.2构造代码块


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) {
        
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值