栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java基本语法(八):面向对象(上)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java基本语法(八):面向对象(上)

一.Java面向对象学习的三条主线:(上、中、下)

        1.Java类及类的成员:属性、方法、构造器;代码块、内部类

        2.面向对象的三大特征:封装、继承、多态、(抽象)

        3.其它关键字:this、super、static、final、abstract、interface、package、import等

       大处着眼,小处着手

二.思想解析:“人把大象装进冰箱”       1.面向过程:强调的是功能行为,以函数为最小单位,考虑怎么做。

        ①把冰箱门打开

        ②抬起大象,塞进冰箱

        ③把冰箱门关闭

      2.面向对象:强调具备了功能的对象,以类/对象为最小单位,考虑谁来做。

        ①人(类) 

        ②冰箱(类)

  

         ③大象(类)

三.面向对象的两个要素:

        类:对一类事物的描述,是抽象的、概念上的定义

        对象:是实际存在的该类事物的每个个体,因而也称为实例(instance)

       ①面向对象程序设计的重点是类的设计        ②设计类,就是设计类的成员。

                属性=成员变量= field =域、字段

                方法=成员方法=函数= method

                创建类的对象=类的实例化=实例化类

四.类和对象的使用(面向对象思想落地的实现)

        1.创建类,设计类的成员

        2.创建类的对象

        3.通过“对象.属性"或对象.方法"调用对象的结构


public class PersonTest {
    public static void main(String[] args) {
        //创建Persion类的对象
        Persion p1 = new Persion();

        //调用对象的结构:属性、方法
        //属性
        p1.name = "Tom";
        p1.isMale = true;
        System.out.println(p1.name);

        //方法
        p1.eat();
        p1.sleep();
        p1.talk("Chinese");

    }
}

class Persion {

    //属性
    String name;
    int age = 1;
    boolean isMale;

    //方法
    public void eat(){
        System.out.println("人可以吃饭");
    }

    public void sleep(){
        System.out.println("人可以睡觉");
    }

    public void talk(String language){
        System.out.println("人可以说话,使用的是:" + language);
    }
}

        如具创建了一个类的多个对则每个对象都独立的拥有一套类的属性。(非static的)

        意味着:如果我们修改一个对象的属性a,则不影响另外一个对象属性a的值。

五.类中属性的使用

         属性(成员变量)   vs   局部变量

        1.相同点

                1.1定义变量的格式:数据类型   变量名   =   变量值

                1.2先声明,后使用

                1.3变量都有其对应的作用域

        2.不同点:

                2.1在类中声明的位置的不同

                        属性:直接定义在类的一对{}内

                        局部变量:声明在方法内、方法形参、代码块内、构造器形参、构造器内部的变量

                2.2关于权限修饰符的不同

                        属性:可以在声明属性时,指明其权限,使用权限修饰符。(常用的权限修饰符: private、 public、缺省、protected)

                        局部变量:不可以使用权限修饰符。

                2.3默认初始化值的情况:

                        属性:类的属性,根据其类型,都有默认初始化值。

                                整型(byte、 short、int、long) : 0

                                浮点型(float、 double) : 0.0

                                字符型(char) : 0(或'u0000')

                                布尔型(boolean): false

                                引用数据类型(类、数组、接口):null

                        局部变量:没有默认初始化值。

                                意味着,我们在调用局部变量之前,一定要显式赋值。

                                特别地:形参在调用时,我们赋值即可。

                2.4在内存中加载的位置:

                        属性:加载到堆空间中   (非static的)

                        局部变量:加载到栈空间

六.类中方法的声明和使用

        方法:描述类应该具有的功能。

        1.方法的分类

        2.方法的声明

                权限修饰符   返回值类型   方法名(形参列表){

                                        方法体

                }

        3.说明:

                3.1 权限修饰符:

                        Java规定的4种权限修饰符: private、 public、缺省、protected

                3.2 返回值类型:有返回值   vs   没有返回值

                        3.2.1 如果方法有返回值,则必须在方法声明时,指定返回值的类型。同时,方法中,需要使用return关键字来返回指定类型的变量或常量。

                                 如果方法没有返回值,则方法声明时,使用void来表示。通常没有返回值的方法中,就不使用return。但是如果使用的话,只能“return;”,表示结束此方法的意思。

                        3.2.2我们定义方法该不该有返回值?

                                 ①题目要求

                                 ②凭经验:具体问题具体分析

                3.3方法名:属于标识符,遵循标识符的规则和规范,“见名知意”

                3.4 形参列表:方法可以声明0个,1个,或多个形参。

                        3.4.1 格式:数据类型1 影参1,数据类型2 形参2,。。。

                        3.4.2 我们定义方法时,该不该定义形参?

                                ①题目要求

                                ②凭经验:具体问题具体分析

                3.5 方法体:方法功能的体现

        4.return关键字的使用:

                1.使用范围:使用在方法体中

                2.作用:

                        ①结束方法

                        ②针对于有返回值类型的方法,使用"return 数据"方法返所要的数据。

                3.注意点:return关键字后面不可以声明执行语句。

        5.方法的使用中,可以调用当前类的属性或方法

                特殊的:方法A中又调用了方法A:递归方法。

                方法中,不可以定义方法。

       练习1:

                要求:

                (1)创建Person类的对象,设置该对象的name.age和sex属性,调用study方法, 输出字符串"studying”,调用showAge()方法显示age值, 调用addAge()方法给对象的age属性值增加2岁。

                (2)创建第二个对象,执行上述操作,体会同一个类的不同对象之间的关系。

       Persion类
package com.wy.exer;




public class Persion {
    String name;
    int age;
    
    int sex;


    public void study(){
        System.out.println("studying");
    }

    public void showAge(){
        System.out.println("age: " + age);
    }

    public int addAge(int i){
        age += i;
        return age;
    }
}
       PersionTest类
package com.wy.exer;




public class PersionTest {
    public static void main(String[] args) {
        Persion p1 = new Persion();

        p1.name = "Tom";
        p1.age = 18;
        p1.sex = 1;

        p1.study();
        p1.showAge();
        int newAge = p1.addAge(2);
        System.out.println(p1.name + "的新年龄是: " + newAge);

        /
public class CircleTest {
    public static void main(String[] args) {

        Circle c1 = new Circle();

        c1.radius = 2.1;
        double area = c1.findArea();
        System.out.println(area);

    }
}

//圆
class Circle{

    //属性
    double radius;

    //求圆的面积
    public double findArea(){
        double area = Math.PI * radius * radius;
        return area;
    }
}
       练习3
package com.wy.exer;




public class StudentTest {
    public static void main(String[] args) {
        //声明Student类型的数组
        Student[] stus = new Student[20];

        //给数组元素赋值
        for (int i = 0;i < stus.length;i++){
            stus[i] = new Student();
            //给Student对象的属性赋值
            stus[i].number = i + 1;
            //年级[1,6]
            stus[i].state = (int)(Math.random() * (6 - 1 + 1) + 1);
            //成绩[0,100]
            stus[i].score = (int)(Math.random() * (100 + 1));
        }
        //遍历学生数组
        for (int i = 0;i < stus.length;i++){
//            System.out.println(stus[i].number + "," + stus[i].state + "," + stus[i].score);
            System.out.println(stus[i].info());
        }
        System.out.println("*********************************");

        //问题一:打印出3年级(state值为3)的学生信息。
        for (int i = 0;i < stus.length;i++){
            if (stus[i].state == 3){
                System.out.println(stus[i].info());
            }
        }
        System.out.println("*********************************");
        //问题二:使用冒泡排序按学生成绩排序,并遍历所有学生信息
        for (int i = 0;i < stus.length - 1;i++){
            for (int j = 0;j < stus.length - 1;j++){
                if (stus[j].score > stus[j + 1].score){
                    //如果需要换序,交换的是数组的元素:Student对象! ! !
                    Student temp = stus[j];
                    stus[j] = stus[j + 1];
                    stus[j + 1] = temp;
                }
            }
        }
        //遍历学生数组
        for (int i = 0;i < stus.length;i++){
            System.out.println(stus[i].info());
        }
    }
}

class Student{
    int number;//学号
    int state;//年级
    int score;//成绩

    public String info(){
        return "学号: " + number + ",年级: " + state+ ",成绩: " + score;
    }
}
       练习3优化
package com.wy.exer;




public class StudentTestYouHua {
    public static void main(String[] args) {
        //声明Student类型的数组
        Student1[] stus = new Student1[20];

        //给数组元素赋值
        for (int i = 0;i < stus.length;i++){
            stus[i] = new Student1();
            //给Student对象的属性赋值
            stus[i].number = i + 1;
            //年级[1,6]
            stus[i].state = (int)(Math.random() * (6 - 1 + 1) + 1);
            //成绩[0,100]
            stus[i].score = (int)(Math.random() * (100 + 1));
        }

        StudentTestYouHua test = new StudentTestYouHua();
        //遍历学生数组
        test.print(stus);

        System.out.println("*********************************");

        //问题一:打印出3年级(state值为3)的学生信息。
        test.search(stus,3);

        System.out.println("*********************************");
        //问题二:使用冒泡排序按学生成绩排序,并遍历所有学生信息
        test.sort(stus);

        //遍历学生数组
        test.print(stus);

    }
    public void print(Student1[] stus){
        for (int i = 0;i < stus.length;i++){
            System.out.println(stus[i].info());
        }
    }

    public void sort(Student1[] stus){
        for (int i = 0;i < stus.length - 1;i++){
            for (int j = 0;j < stus.length - 1;j++){
                if (stus[j].score > stus[j + 1].score){
                    //如果需要换序,交换的是数组的元素:Student对象! ! !
                    Student1 temp = stus[j];
                    stus[j] = stus[j + 1];
                    stus[j + 1] = temp;
                }
            }
        }
    }

    public void search(Student1[] stus,int state){
        for (int i = 0;i < stus.length;i++){
            if (stus[i].state == state){
                System.out.println(stus[i].info());
            }
        }
    }
}

class Student1{
    int number;//学号
    int state;//年级
    int score;//成绩

    public String info(){
        return "学号: " + number + ",年级: " + state+ ",成绩: " + score;
    }
}
七.理解“万事万物皆对象”

        1.在Java语言范畴中,我们都将功能、结构等封装到类中,通过类的实例化,来调用具体的功能结构

                1.scanner ,strirlg等

                2.文件:File

                3.网络资源:URL

        2.涉及到Java语言与前端Html、后端的数据库交互时,前后端的结构在Java层面交互时,都体现为类、对象。
        3.引用类型的变量,只可能存储两类值:null或地址值(含变量的类型)

        4.匿名对象的使用
                1.理解:我们创建的对象,没有显式的赋给一个变量名。即为匿名对象

                2.特征;匿名对象只能调用一次。

八.再谈方法

        1.方法的重载

                1.定义:在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。

                "两同一不同":同一个类、相同方法名

                                        参数列表不同:参数个数不同,参数类型不同

                2.判断是否是重载:

                        跟方法的权限修饰符、返回值类型、形参变量名、方法体都没有关系

                3.在通过对象调用方法时,如何确定某一个指定的方法:

                        ①方法名

                        ②参数列表

        2.可变个数形参的方法(允许直接定义能和多个实参相匹配的形参)

                1.jdk 5.0新增的内容

                2.具体使用:

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

                        2.2当调用可变个数形参的方法时,传入的参数个数可以是:0个,1个,2个, 。。。

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

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

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

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

        3.方法参数的值传递机制

                1.关于变量的赋值:

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

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

                2.方法的形参的传递机地值传递

                        1,形参和实参

                                1.形参:方法定义时,声明的小括号内的参数

                                2.实参:方法调用时,实际传递给形参的数据

                        2.值传递机制

                                1.如果参数是基本数据类型。此时实参赋给形参的是实参真实存储的数据值。
                                2.如果参数是引用数据类型,此时实参赋给形参的是实参存储数据的I地址值。

        4.递归方法

                1.一个方法体内调用它自身

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

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

    
    public static void main(String[] args) {
        RecursionTest test = new RecursionTest();
        System.out.println(test.getSum(100));

    }

    public int getSum(int i){
        if (i == 1){
            return 1;
        }else {
            return i + getSum(i - 1);
        }
    }

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/459621.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号