当前位置: 首页 > article >正文

Java语法基础知识点2

目录

四、继承

4.1extends关键字:

4.2父类成员变量/方法访问:

4.3构造方法:

4.4protected关键字:

4.5final关键字:

4.6组合

五、多态

5.1发生多态的前提:

5.2向上转型和向下转型:

5.3方法重写:


四、继承

4.1extends关键字:

如果想要继承,那么就要使用到extends关键字,继承是对共性的抽取,实现代码的复用

基础语法如下:class 子类 extends 父类{}

//把猫和狗所有相同的成员变量进行抽取,放到Animals父类中,只要发生继承关系,就能够使用name和age成员变量
class Animals{
    public String name;  
    public int age;
}

//狗有名字和年龄
class Dog extends Animals{
}

//猫也有名字和年龄
class Cat extends Animals{
}

public class Main {
    public static void main(String[] args) {
        Dog dog=new Dog();
        Cat cat=new Cat();
    }
}

4.2父类成员变量/方法访问:

super关键字:这是子类访问父类成员变量/方法的关键字,作用类似于this关键字,但是super只能够用在发生继承关系访问父类的成员变量/方法上,具体用法如下:

class Animals{
    public String name;
    public int age;

    public void Sleep(){
        System.out.println(this.name+"正在睡觉");
    }
}

class Dog extends Animals{
    public void Bark(){
        super.Sleep(); 
        System.out.println(super.name+"汪汪叫");

    }
}

class Cat extends Animals{
    public void miaomiao(){
        System.out.println(super.name+"喵喵叫");
    }
}

特别注意的是,如果子类和父类出现同名情况下,不使用super关键字的话,会优先访问子类同名的成员变量/方法;如果没有同名的话,就会访问父类的成员变量/方法,如果访问的变量在子类和父类都没有,那么就会报错

4.3构造方法:

父类的构造方法跟子类的构造方法类似,如果没有显示定义,那么编译器会自动生成一个无参的构造方法

class Animals{
    public String name;
    public int age;

    public Animals(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void Sleep(){
        System.out.println(this.name+"正在睡觉");
    }
}

class Dog extends Animals{
    
    //由于父类显示定义构造方法,那么我们在子类构造方法中就要用到super关键字给name和age传值
    public Dog(String name, int age) {
        super(name, age);
    }

    //如果父类没有定义构造方法,那么编译器会自动生成一个无参构造方法,那么子类构造方法中的super()里就没有值public Dog(){    super();}
}

4.4protected关键字:

是个包子权限,在不同包的情况下,只有子类能够访问被protected修饰的父类的成员变量/方法

4.5继承方式:

支持单继承,多层继承,但是不支持多继承,就是一个子类继承多个父类;

4.5final关键字:

被final修饰的变量,就会变成常量,不能被修改:

        final int a=10;
        a=9;//报错,因为a被final修饰,此时的a就是常量10

如果final修饰的是类,那么就说明这个类不能够被继承

如果final修饰方法,那么这个方法就不能被重写

4.6组合

组合与继承相似,但是不同的点就是组合是对象之间是has-a的关系,例如汽车,汽车有零配件轮胎、方向盘等,创建一个Car类时,同时创建零配件轮胎、方向盘对象,如果销毁Car类,那么零配件也会一同销毁

//轮胎
class LunTai{

}
//方向盘
class FangXiangPan{

}
//汽车
class Car{
    private LunTai lt;
    private FangXiangPan fxp;

}
//宝马是汽车,可以继承汽车当中的轮胎,方向盘
class BaoMa extends Car{
    
}

五、多态

5.1发生多态的前提:

多态的意思就是,如果不同的对象去执行同一件事,会产生不同的结果;发生向上转型、对父类方法进行重写,并且要在继承体系下这三个是发生多态的前提。

5.2向上转型和向下转型:

向上转型是创建一个子类对象给到父类对象使用,这是一个小范围到大范围的转换,例如狗是动物

语法格式如下:父类类型 变量名=new 子类类型()

class Animals{
    public String name;
    public int age;

    public Animals(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void eat(){
        System.out.println(this.name+"正在吃");
    }
}
class Dog extends Animals{      //继承
    public Dog(String name,int age){
        super(name,age);
    }

    @Override
    public void eat() {           //对父类方法进行重写
        System.out.println(super.name+"吃狗粮");
    }
}
public class Main {
    public static void main(String[] args) {
        Animals dog=new Dog("小黑",7);  //发生向上转型
        dog.eat();//输出结果是小黑吃狗粮,而不是小黑正在吃
    }
}

向上转型使用的场景有三个:直接赋值、方法传参、方法返回

向下转型:

我们知道,如果发生向上转型的话,只能够访问到父类的方法和变量,却不能够访问到子类的方法和变量,如果我们要访问到子类的方法和变量,那么我们就要用到向下转型,以下是向下转型的例子:

class Animals{
    public void eat(){
        System.out.println("正在吃");
    }
}
class Dog extends Animals{

    @Override
    public void eat() {
        System.out.println("吃狗粮");
    }
    public void Sleep(){
        System.out.println("在睡觉");
    }
}

public class Main {
    public static void main(String[] args) {
        Animals a1=new Dog();//发生向上转型
        if (a1 instanceof Dog){   //这里的instanceof意思是如果a1引用的是Dog对象,那么true
            Dog dog=(Dog)a1;//如果要访问到子类的Sleep方法,就要发生向下转型,一定要强制类型转换,因为不是所有的动物都是狗这里是大范围向小范围转换了
            dog.Sleep();  //此时就能够访问到子类的方法了
        }
    }
}

instanceof关键字:

if(A instanceof B)这里的instanceof意思就是如果A引用的是B,那么true

5.3方法重写:

方法重写用在多态当中,方法重写只能够更改方法里的方法体,不能够改变方法的参数类型,返回值和参数;

方法重载是必须更改参数列表,其他是可以修改,这就是方法重载和方法重写的区别

特别注意的是,我们要避免在构造方法中调用重写的方法!!!


http://www.kler.cn/a/568774.html

相关文章:

  • 达梦数据库系列之Mysql项目迁移为达梦项目
  • 基于html的俄罗斯方块小游戏(附程序)
  • 技术问题汇总:前端怎么往后端传一个数组?
  • DeepSeek 与大数据治理:AI 赋能数据管理的未来
  • 第十五届蓝桥杯最后一题 拔河问题
  • 各种传参形式
  • 深入探索 STM32 微控制器:从基础到实践
  • 每日一题——接雨水
  • 2.Exercise
  • 关于时间序列预测
  • 3.16 AI Agent 技术全景解析:从核心能力到企业级应用实践
  • GPT-4.5震撼登场,AI世界再掀波澜!(3)
  • Tkinter和爬虫写的知乎回答下载exe【免费下载】
  • 【STM32F103ZET6——库函数】6.PWM
  • 【软件安装】非华为手机安装华为电脑管家(14.0.5.8 C233)(附带安装包下载地址)
  • 蜈蚣博弈(Centipede Game)
  • Oracle性能调优(一):时间模型统计
  • 类似ComfyUI和Midjourney这样的文生图图生图应用的API与服务架构该怎么设计
  • 算法1-2 分数线划定
  • 【蓝桥杯集训·每日一题2025】 AcWing 5437. 拐杖糖盛宴 python