JAVA开发学习-day03

JAVA开发学习-day03

1.方法

1.1 基本定义

‌Java中的‌方法是执行特定操作的代码块,它可以返回一个值或者不返回任何值。 方法由几个关键部分组成:

返回类型:指定方法执行后返回的数据类型。如果方法不返回任何值,则使用void关键字。
‌方法名:一个有效的标识符,用于标识方法。方法名应反映方法的功能。
‌参数列表:可选的,括号内包含要传递给方法的参数,参数之间用逗号分隔,每个参数必须有明确的类型和名称。
‌方法体:花括号内包含的代码块实现了方法的具体逻辑。

    //方法 函数 过程
    //语法
    //返回值类型 方法名(参数列表){方法体}   参数列表与业务逻辑相关
    //返回值类型 该方法必须返回这个类型的对象
    //当一个方法不需要返回值 返回值类型定义为void
    //void中不能return null
    //void 可以写return


    //求最大值
    public static int max(int a, int b){
        System.out.println();
        return a > b ? a : b;
        //return后不能写代码
    }
    //定义一个sum方法
    public static int sum(int a, int b){
        return a + b;
    }

    public static void printmax(int a, int b){
        System.out.println(a > b ? a : b);
        return; //终止方法作用
    }

    public static void printMaxA(int a, int b){
        //求出最大值
        //打印
        printmax(a , b);
    }

1.2 实参 形参

形参:方法定义时的参数,由数据类型和参数名组成

实参: 方法调用时用的参数

public class EasyA {
    public static void main(String[] args) {
        int a = sum(1, 2); //实参:调用方法时传入的参数,sum(1, 2)就是实参
    }
}
    //定义一个sum方法
    //形参:定义方法时,参数列表的参数名   int a , int b就是形参
    public static int sum(int a, int b){   
        return a + b;
    }

1.3 重载

在同一个类中,方法名相同,参数列表不同即为重载

可以通过改变参数列表来实现重载

    //参数列表要素
    //1.参数类型不同
    public static void printmax(byte a, int b){

    }
    //2.参数的个数不同
    public static void printmax(short a){

    }
    //3.参数的顺序不同  参数中的类型顺序不同
    public static void printmax(int b, byte a){

    }
    /*与返回类型无关
    即方法定义时除了返回值类型都相同,是不可行的
    public static int printmax(int b, byte a){
    }*/

1.4 可变参数

1.一个方法中最多有一个可变参数
2.可变参数必须在参数列表的最后一个
3.可变参数数量可变,类型不可变
4.调用可变参数方法,可以使用数组代替
5.可变参数可以不传

public class EasyA {
    public static void main(String[] args) {
        int[] arr = {312,312,4342};
        // int[] arr;  arr = {1,2,3}; ❌
        System.out.println(sum(1,2,4,54,5,3,4,345,34,52,45,245245,425,2,5));
        sum(arr);
    }
}
    //可变参数 在数据类型后加...
    //使用 将可变参数当作数组使用
    //注意点:
    //1.一个方法中最多有一个可变参数
    //2.可变参数必须在参数列表的最后一个
    //3.可变参数数量可变,类型不可变
    //4.调用可变参数方法,可以使用数组代替
    //5.可变参数可以不传
    public static int sum(int... a){
        int sum = 0;
        for( int item : a ){
            sum += item;
        }
        return sum;
    }

1.5 在其他类中调用方法

在同一包下调用其他类的方法

//类名.方法名()
public class TestA {
    public static void main(String[] args) {
        //在其他类中调用EasyA类的方法
        EasyA.printmax(12 , 23);
    }
}

2.排序

2.1 冒泡排序

冒泡排序(Bubble Sort)是一种简单的排序算法,它通过多次遍历待排序的元素,比较相邻元素的大小,并交换它们直到整个序列有序。冒泡排序的基本思想是将较大的元素逐渐“浮”到数组的右端,而较小的元素逐渐“沉”到数组的左端。其基本原理如下:

1.从数组的第一个元素开始,比较相邻的两个元素。

2.如果前一个元素大于后一个元素(升序排序),则交换它们的位置。

3.步骤1和步骤2,直到遍历整个数组。

4.重复上步骤,每次遍历都将最大的元素“冒泡”到数组的末尾。

5.重复以上步骤,但不包括已排序的最大元素,直到整个数组排序完成。

import java.util.Arrays;

public class TestA {
    public static void main(String[] args) {
        int[] arr = {100,55,65,84,54,12,56,15,-1};
        bubbleSort(arr);
        System.out.println(Arrays.toString(arr));
    }

    public static int[] bubbleSort(int[] arr){
        for(int i = 0 ; i < arr.length - 1; i++){
            for(int j = 0 ; j < arr.length - 1 - i; j++){
                if(arr[j] > arr[j+1]){
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
        return arr;
    }
}

3.类

编程时先定义好类,再对类实例化产生对象。类的形式如下:

class declaration{                //类声明部分
        class body                //类体部分
}

3.1 全局变量(在类中定义属性)

全局变量通常被定义为类的成员变量。全局变量可以在类的任何地方访问,而不限于特定的方法或代码块。

public class Staff {
    //在类中定义属性
    //又叫做全局变量:在整个类都可以访问到的变量
    String code;
    String sex;
    String name;
    // double slaray;
    // 浮点数不能精确地表示十进制小数,可能导致精度损失和计算错误。
    /*BigDecimal salary;  所以在涉及金钱时一般用BigDecimal*/
    double salary;

    //类中的方法可以直接调用本类中的属性
    public void work(){
        System.out.printf("%s正在工作\n", name);
    }
}

3.2 构造方法

构造方法是用于创建和初始化对象的特殊方法。构造方法的正确编写和使用对于编写高质量的Java代码至关重要。

public class Staff {

    //在类中定义属性
    //又叫做全局变量:在整个类都可以访问到的变量
    String code;
    String sex;
    String name;
    // double slaray;
    // 浮点数不能精确地表示十进制小数,可能导致精度损失和计算错误。
    /*BigDecimal salary;*/
    double salary;

    //定义构造方法
    //1.没有返回值类型
    //2.方法名和类名一致
    //3.如果一个类没有定义任何构造方法,系统会给与一个默认的空的构造方法
    //4.类中一旦自定义了任意构造方法,系统给定的默认构造方法就消失了
    //默认构造方法如下所示
    Staff(){

    }

    //构造方法设置属性
    Staff(String code, String name, String sex, double salary){
        //将参数name设置给属性name
        //就近原创  name = name; ----->两个都是参数name
        //局部变量:在方法体或者代码块中声明的变量
        //全局变量:在类当中定义的变量
        //在局部变量和全局变量重名的情况下,可以使用this关键字,标注全局变量
        this.code = code;
        this.name = name;
        this.sex = sex;
    }
}

构造方法的访问修饰符通常是 public,以确保其他类可以访问并创建对象。

构造方法的名称必须与类名完全相同。

构造方法可以不带参数,称为无参数构造方法,也可以带有参数,称为带参数构造方法。

带参数的构造方法用于接收传递给构造方法的参数,并在对象初始化时使用这些参数来设置对象的属性。

3.3 实例化对象

public class TestStaff {
    public static void main(String[] args) {
        //实例化对象  开辟内存空间
        Staff staff = new Staff();
        //设置对象的属性 类中声明了哪些属性,对象中就有什么属性
        staff.code = "YG10001";
        staff.name = "张三";
        staff.sex = "男";
        staff.salary = 10000;

        Staff staffA = new Staff();
        staffA.code = "YG10002";
        staffA.name = "李四";
        staffA.sex = "女";
        staffA.salary = 12000;
        
        //使用构造方法初始化对象
        Staff staffB = new Staff("YG10003","钱五","男",200);
    }
}

4.面向对象特征(特性)

封装,继承,多态

4.1 封装

封装: 隐藏类当中的细节(属性,方法等),不让其他类随意访问
通过四个访问权限修饰符来界定访问权限和范围以达到封装的效果
public protected default private
公共的 受保护的(家族性的) 默认(本包中) 私有的(本类中)

四个访问权限的修饰符界定的访问权限和范围如下图所示:
在这里插入图片描述

由于私有的(private)属性只能在本类中访问,所以外部类想要调用或修改私有属性就需要用到getter和setter方法

public class EasyC {
    //面向对象特征(特性)
    //封装  继承  多态

    //封装 隐藏类当中的细节(属性,方法等),不让其他类随意访问
    //通过四个访问权限修饰符来界定访问权限和范围以达到封装的效果
    // public      protected             default      private
    // 公共的       受保护的(家族性的)      默认(本包中)    私有的(本类中)


    // 为了访问私有属性所以设置了getter,setter方法
    // getter  setter  javabean(专门存储数据的java类)
    public static int num_public = 22;
    static int num_default = 33;  // default

    private String name;
    private String code;
    private String sex;

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public  String getName(){
        //java语言中大小写敏感
        return this.name;
    }

    public void setName(String name){
        this.name = name;
    }

}

在IDEA可以在类的区域右键,选择Generate来快速生成getter和setter方法

4.2 继承

继承 一个类可以继承父类,子类就具有父类中定义好的属性和方法, 其关键字为extends

但不是所有的属性和方法都能访问到

可以继承的属性和方法前的权限修饰符: public, protected, 本包下的父类default

继承的好处:

1.代码重用
2.多态实现的基础

注意:
1.java中一个类只能有一个直接父类(单继承)
2.java支持多重继承

4.2.1 方法的重写

子类可以对父类中的方法进行重写,重写的方法只有方法体不同,其余要与父类的方法一致

可以使用@Override注解,验证方法是否是重写的方法

重写的方法的访问权限只能更开放,不能更闭塞 protected -> public √ public -> private ❌

class Plane{
    protected String code;  //protected 可以被子类或子代关系类 或本包下的类可以访问
    String color;

    public void fly(){
        System.out.println("起飞!!!");
    }

}
//用关键字extends继承类
class BigPlane extends Plane{
    public String code;
    //子类继承父类
    //方法的重写:子类对父类中继承过来的方法重新定义
    //重写只能改写方法体,其余不能改变
    //可以使用@Override注解,验证方法是否是重写的方法
    //重写的方法的访问权限只能更开放,不能更闭塞   protected -> public  √  public -> private ❌

    @Override   //对父类中的fly()进行了重写
    public void fly(){
        System.out.println("超级起飞!!!!");
    }
}
4.2.2 子父类之间的构造方法

子类的构造方法中首行必须要用父类的构造方法

默认调用父类的无参构造方法

class Plane{
    protected String code;  //protected 可以被子类或子代关系类 或本包下的类可以访问
    String color;
}

//用关键字extends继承类
class BigPlane extends Plane{
    //此时父类中没有构造类,所以子类调用的父类的默认无参构造方法
    //如果父类中的构造方法是无参的,子类不写构造类也可
}

父类当中没有无参构造方法,子类构造方法必须定义调用父类的哪一个构造方法

使用supper关键字调用父类的构造方法

class Plane{
    protected String code;  //protected 可以被子类或子代关系类 或本包下的类可以访问
    String color;

    public Plane(String code) {
        this.code = code;
    }

    public Plane(String code, String color){
        this.code = code;
        this.color = color;
    }

    public Plane(){

    }
}

//用关键字extends继承类
class BigPlane extends Plane{
    public String code; //子类中的属性可以和父类中的一致
    //子父类间的构造方法
    public BigPlane(String code, String color){
        //子类的构造方法中首行必须要用父类的构造方法
        //默认调用父类的无参构造方法
        //父类当中没有无参构造方法,子类构造方法必须定义调用父类的哪一个构造方法
        //使用supper关键字调用父类的构造方法
        //super();
        super(code,color);
    }

    public BigPlane(String code){
        super(code);
    }

    public BigPlane(){
        super();
    }
}

只要在子类构造方法的方法体首行调用了父类的supper()方法就不会报错

class Plane{
    protected String code;  //protected 可以被子类或子代关系类 或本包下的类可以访问
    String color;
    
    public Plane(String code, String color){
        this.code = code;
        this.color = color;
    }

    public Plane(){

    }
}

//用关键字extends继承类
class BigPlane extends Plane{

    public String code;

    public BigPlane(String code, String color){
        super(); //调用父类无参的构造方法
    }

}
4.2.3 向上转型

Java 的向上转型是一种多态的实现方式,它允许我们使用父类类型的引用变量来引用子类类型的对象,并且可以通过这个引用变量调用子类中重写或继承自父类的方法。向上转型的作用主要体现在两个方面:增强代码的灵活性和可扩展性,以及强制规范类的结构和行为。

public class HomeWork {
    public static void main(String[] args) {
        
        Animal animal1 = new Dog();
        Animal animal2 = new Cat();
        //调用了子类中重写的move方法
        animal1.move(); //输出为狗在移动
        //子类中没有重写sleep方法,所以调用的子类继承父类的方法sleep
        animal2.sleep(); //输出为动物在睡觉
        //animal1.bark(); // 编译错误,Animal类型不能调用Dog类型的方法
        //向上转型的父类类型变量可以引用子类对象,但只能调用子类中重写或继承自父类的方法,不能直接访问子类中特有的方法。   
    }
}

class Animal {
    public void move() {
        System.out.println("动物在移动");
    }

    public void sleep() {
        System.out.println("动物正在睡觉");
    }
}

class Dog extends Animal {
    public void bark() {
        System.out.println("狗在嗷嗷叫");
    }
    public void move() {
        System.out.println("狗在移动");
    }
}
class Cat extends Animal {
    public void scratch() {
        System.out.println("猫在挠人");
    }
}
4.2.4 调用属性看变量声明
public class EasyD {
    public static void main(String[] args) {

        //调用属性看变量的声明
        BigPlane bigPlane = new BigPlane();
        bigPlane.code = "AAAA";
        bigPlane.printcode();
        //变量声明为 BigPlane,所以子类的code变为"AAAA"
        //输出结果为       this.code:AAAA    super.code:null
        Plane plane = new BigPlane();
        plane.code = "BBBB";
        plane.printcode();
        //变量声明为 Plane,所以父类的code变为"BBBB"
        //输出结果为       this.code:null    super.code:BBBB
        BigPlane plane1 = (BigPlane) plane;
        plane1.code = "CCCC";
        plane1.printcode
        //变量声明为 BigPlane,所以子类的code变为"CCCC"
        //输出结果为       this.code:CCCC    super.code:BBBB
        

    }
}


class Plane{
    protected String code;  //父类的code
    String color;

    public Plane(String code) {
        this.code = code;
    }

    public Plane(String code, String color){
        this.code = code;
        this.color = color;
    }

    public Plane(){

    }

    public void fly(){
        System.out.println("起飞!!!");
    }

    public void printcode(){
        System.out.println(code);
    }
}

//用关键字extends继承类
class BigPlane extends Plane(

    public String code; //子类的code
    
    public BigPlane(String code, String color){
        super(code,color);
    }

    public BigPlane(String code){
        super(code);
    }

    public BigPlane(){
        super();
    }

    @Override
    public void printcode(){
        System.out.println("this.code:" + this.code);
        System.out.println("super.code:" + super.code);
    }
}

4.3 多态

多态是面向对象编程中的一个重要概念,它允许不同类型的对象对同一方法进行不同的实现。

public class EasyE {

    //简单工厂设计模式
    public static Parent getObj(int a){
        if(a == 1){
            return new ChildA();
        }else if(a == 2){
            return new ChildB();
        }else {
            return new Parent();
        }
    }

    public static void main(String[] args) {
        int num = 1;
        Parent p = getObj(num); //p这个变量可能指向任意个子类的对象
        p.method(); //多态: 调用方法时出现多种结果
        //多态分类:
        //静态多态: 重载造成,在类编译时,就可以确定调用的是哪一个方法
        //动态多态: 重写造成,只有在执行过程中,才能确定执行的是哪一个类中的方法
    }
}

class Parent{
    public void method(){
        System.out.println("parent");
    }
}

class ChildA extends Parent{
    @Override
    public void method(){
        System.out.println("ChildA");
    }
}

class ChildB extends Parent{
    @Override
    public void method(){
        System.out.println("ChildB");
    }
}
  • 26
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值