JavaEE 学习笔记 第四章 面向对象(上)9

第四章 面向对象


Java 面向对象学习的三条主线:

        Java 类及类的成员:属性,方法,构造器,代码块,内部类

        面向对象的三大特征:封装性,继承性,多态性,(抽象性)

        其他关键字:this,super,static,final,abstract,interface,import等


4.4 再谈方法

4.4.1 方法的重载

         重载的概念:在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。 

        ”两同一不同“:同一个类,同一个方法名,参数列表不同,参数类型 不同,参数个数不同

        重载的特点:与返回值类型无关,只看参数列表,且参数列表必须不同(参数个数或参数类型)。调用时,根据方法参数列表的不同来区别。

        重载示例:如下图:




4.4.2 可变形参的方法

        JavaSE 5.0中提供了Varargs(variable number of arguments)机制,允许直接定义能和多个实参相匹配的形参。从而,可以用一种更简单的方式,来传递个数可变的实参。

        JDK 5.0以前:采用数组形参来定义方法,传入多个同一类型变量

        public static void test( int a,String[] books );

        JDK 5.0:采用可变个数形参来定义方法,传入多个同一类型变量

        public static void test( int a,String ... books );

        具体使用:

                ①.可变个数形参的格式:数据类型 ... 变量名

                ②.当调用可变个数形参的方法时,传入的参数个数:0个,1个,2个,......

                ③.可变个数形参的方法与本类中方法名相同,形参不同的方法之间构成重载

                ④.可变个数参数的方法与本类中方法名相同,形参类型也相同的数组之间不构成重载。换句话说,二者不能共存。

                ⑤.可变个数参数在方法的形参中,必须声明在末尾

                ⑥.可变个数形参在方法的形参中,最多只能声明一个可变形参                

4.4.3 方法参数的值传递机制

        ①.关于变量的赋值:

                如果变量是基本数据类型,此时赋值的是变量所保存的数据值。

                如果变量是引用数据类型,此时赋值的是变量所保存的数据的地址值。

        ②.方法,必须由其所在类或对象调用才有意义。若方法含有参数:

                形参:方法声明时的参数

                实参:方法调用时实际传给形参的参数值

         ③.Java的实参值如何传入方法呢?

                 Java里方法的参数传递方式只有一种:值传递。将实际参数值的副本(复制品)传入方法内,而参数本身不受影响。

                        形参是基本数据类型:将实参基本数据类型变量的”数据值“传递给形参

                        形参是引用数据类型,将实参引用数据类型变量的”地址值“传递给形参

//计算圆的面积
public class Circle {
    public double radius;//圆的半径
    
    //面积方法
    public double findArea() {
        return Math.PI*radius*radius;
    }
}

class PassObejcet{
    public static void main(String[] args) {
        PassObejcet passObejcet = new PassObejcet();
        Circle circle = new Circle();
        passObejcet.printAreas(circle,5);
    }
    public void printAreas(Circle c,int time){
        System.out.println("Radius              Area");
        for (int i = 1; i <= time; i++) {
            c.radius = i;
            System.out.println(c.radius+"                "+c.findArea());
        }
    }
}

4.4.4 递归方法

        递归方法:一个方法体内调用它自身。

        方法递归包含了一种隐式的循环,它会重复执行某段代码,但这种重复执行无需循环控制。

        递归一定要向已知方向递归,否则这种递归就变成了无穷递归,类似死循环。

扫描二维码关注公众号,回复: 13397925 查看本文章


//例4 斐波那契数列
import java.util.Scanner;

public class test {
    public static long feibonaqie(long number) {
        if (number == 0 || number == 1) {
            return number;
        } else {
            return feibonaqie(number - 1) + feibonaqie(number - 2);

        }
    }

    public static void main(String args[]) {
        Scanner input = new Scanner(System.in);
        System.out.println("请输入需要计算第几项的值:");
        long number = input.nextLong();
        System.out.println("第" + number + "项的斐波那锲值为:" + feibonaqie(number));
    }
}

4.5 面向对象特征之一:封装与隐藏

4.5.1 概述

        我们程序设计追求”高内聚,低耦合“:

                ①.高内聚:类的内部数据操作细节自己完成,不允许外部干涉;

                ②.低耦合:仅对外暴露少量的方法用于使用。

        隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提高系统的可扩展性,可维护性。通俗的说,把该隐藏的隐藏起来,该暴露的暴露出来。这就是封装性的设计思想。

4.5.2 封装性的体现

         Java中通过将数据声明为私有的(private),再提供公共的(public)方法:getXxx()和setXxx()实现对该属性的操作,以实现下述目的:

        隐藏一个类中不需要对外提供的实现细节;使用者只能通过事先定制好的方法来访问数据,可以方便的加入控制逻辑,限制对属性的不合理操作;便于修改,增强代码的可维护性。

       Java权限修饰符public,protected,private置于类的成员定义前,用来限定对象对该类成员的访问权限。 四种权限可以用来修饰类及类的内部结构:属性,方法,构造器,内部类。而对于class的权限修饰只可以用public和default(缺省):public类可以在任意地方被访问,default类只可以被同一个包内部的类访问。

       封装性总结:Java提供了四种权限修饰符来修饰类及类的内部结构,体现类及类的内部结构在被调用时的可见性的大小。



import java.util.Scanner;

public class Person {

    private int age;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if (age > 0 & age < 130) {
            this.age = age;
            System.out.println("格式正确!");
        } else {
            System.out.println("年龄格式错误!");
        }
    }

    public static void main(String[] args) {
        Person person = new Person();
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入你的年龄:");
        person.setAge(scanner.nextInt());
        int age = person.getAge();
        System.out.println(age);
    }
}

 4.6 构造器(构造方法,constructor)

construct:建设,建造        construction:CCB        constructor:建设者

4.6.1 构造器的概述

        作用:创建对象,初始化对象的属性

                如:Order o = new Order();        Person p = new Person(Tom,17);

        说明:

                ①.如果没有显示的定义类的构造器的话,则系统默认提供一个空参的构造器

                ②.定义构造器的格式:权限修饰符 类名(形参列表){ }

                ③.一个类中定义多个构造器,彼此之间构成重载

                ④.我们显式的定义了类的构造器之后,系统就不再提供默认的空参构造器

                ⑤.一个类中至少有一个构造器

        特征:它具备与类相同的名称;它不声明返回值类型(与声明为void不同),不能被static,final,synchronized,abstract,native修饰,不能有return语句返回值。

4.6.2 属性赋值过程

        截止到目前,我们讲到了很多位置都可以对类的属性赋值,现总结这几个位置,并指明赋值的先后顺序:

        赋值的位置:

                ①.默认初始化

                ②.显式初始化

                ③.构造器中初始化

                ④.通过“对象.属性”或“对象.方法”的方法赋值

        赋值的先后顺序:①②③④

        

4.6.3 构造器的使用与练习



public class Person {

    private int age;
    private String name;

    public Person() {
        age = 18;
    }

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


    public static void main(String[] args) {
        Person person1 = new Person();
        Person person2 = new Person(20,"lisi");
        System.out.println(person1.age);
        System.out.println("姓名:"+person2.name+" 年龄:"+person2.age);
    }
}

//计算三角形的面积
public class TriAngle {

    //底边长
    private double base;
    //高
    private double height;

    public TriAngle() {
    }

    public TriAngle(double base, double height) {
        this.base = base;
        this.height = height;
    }

    public double Mj(TriAngle triAngle){
        return (triAngle.base*triAngle.height)/2;
    }

    public double getBase() {
        return base;
    }

    public void setBase(double base) {
        this.base = base;
    }

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }

    public static void main(String[] args) {
        
        TriAngle triAngle1 = new TriAngle(2,2);
        double mj1 = triAngle1.Mj(triAngle1);
        System.out.println("面积为:"+mj1+"平方米");
        
        TriAngle triAngle2 = new TriAngle();
        triAngle2.setBase(3);
        triAngle2.setHeight(3);
        double mj2 = triAngle2.Mj(triAngle2);
        System.out.println("面积为:"+mj2+"平方米");
    }
}


扩展知识:JavaBean

        JavaBean是一种Java语言写成的可重用组件,所谓javaBean,是指符合如下标准的Java类:类是公共的,有一个无参的公共的构造器,有属性,且有对应的get,set方法。

        用户可以使用JavaBean将功能,处理,值,数据库访问和其他任何可以用Java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面,Servlet,其他JavaBean,applet程序或者应用来使用这些对象。用户可以认为JavcBean提供了一种随时随地的复制粘贴的功能,而不用关心任何改变。


点击进入:下一节:JavaEE 学习笔记 第四章 面向对象(中) 10

猜你喜欢

转载自blog.csdn.net/woailuo8214/article/details/121267658