黑马程序员技术交流社区

标题: 裘-样+面向对象+this+static+API的使用 [打印本页]

作者: 裘-样    时间: 2015-9-17 21:17
标题: 裘-样+面向对象+this+static+API的使用
/*
        今天学的是面向对象和API的使用方式。

        面向对象:
                首先得讲类,再讲对象。
                类是事物区分的时候,向上抽取其共性而产生一个个类。
                对象是类的一个实例化。
                面向对象强调的是对象的功能能够返回一个什么样的结果,并不需要考虑其过程。
                这样做就更加的符合人们的思维。
                能够让复杂的问题简单化。
        封装
                不直接向外提供数据或者方法,而是通过一个公共的向外暴露的接口来允许外部的访问。
                封装现在学到的有方法(函数),就是对一个具体功能的封装。
                类,类中可以封装一个个具体功能的方法,等待其他类或者对象的调用。
                private关键字,通过这个关键字私有化类的成员,让其不能被外部直接访问和操作。

        构造代码块
                定义在类中方法外的一个孤零零的{}中的内容
                在构造函数之前执行
                其中的代码一般为此类多个构造函数共性代码的向上抽取

        构造函数
                类一创建对象的时候就执行,用于对对象进行初始化操作
                构造函数不可以加静态修饰符static
                                没有返回值
                                方法名和类名一致

        this关键字
                this关键字代表着所在函数所属对象的引用。
                this在函数(方法)中出现局部变量隐式的覆盖成员变量的时候使用

        **面向对象讲到这里就可以写一个 pojo类 了**

        static关键字
                static是静态的修饰符,可以修饰类中的成员
                在类一加载的时候就加载了
                所以是在对象之前出现在内存中的
                故而,类名可以直接调用,对象也可以调用。
                static修饰的为静态成员,为类中所有对象共享的内容
                一个对象对他进行了更改的操作,其他对象调用输出时,其值已经发生了改变

                static修饰的方法为静态方法,只可以访问静态的成员。

        Api的使用,举例:Math
                打开Api之后再索引处输入要查找的内容,找到后进入查看
                看类的时候,要先看其说明,能够大概明白这个类的作用
                之后看类的构造函数,
                        有的话,就证明能够创建其对象再操作其中的方法
                        没有的话,看看有啥静态的方法,静态的方法是可以直接通过类名来调用的
                        最后一种的情况比较少见,要先通过静态方法获取类的一个实例,方法名一般为:getInstance();返回值为对象。
                        这种情况,要先得到其实例,之后再操作其方法。

        案例:
                写一个pojo类,选学生类
                Math类的学习
                一个猜数字的小游戏

        今天学习的内容我尽量通过在案例的代码中以注释说明一下。
*/

package com.itheima.javaday7;

import java.util.*;

class ObjectThisStaticMath
{
        int num = 10;

        public static void main(String[] args){
       
                //Student stu = new Student();
                //System.out.println(stu);//null***0

                Student stu = new Student("lin",23);
                System.out.println(stu);//lin***23

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

                mathDemo();//静态方法可以访问类中的静态成员

                //System.out.println(num);//静态方法无法访问非静态成员
                /*
                src\150917\ObjectThisStaticMath.java:80: 错误: 无法从静态上下文中引用非静态 变量
                 num
                                                System.out.println(num);
                                                                                   ^
                1 个错误
                */
                System.out.println("*******************");

                ObjectNew on = new ObjectNew();
                /*
                这是用来理清楚new关键字创建对象时,对象的初始化过程的。
                从其输出结果我们可以得出如下结论:
                        对象的初始化过程有四个步骤:
                                1,默认初始化
                                        这是在创建对象时,对象给予成员变量的一个默认初始化值
                                2,显示初始化
                                        这是在类中定义变量时,直接赋值,会覆盖掉之前的默认值
                                3,构造代码块初始化
                                        这是在构造代码块中给成员变量赋值,也会覆盖之前的值
                                        但是这个在现实开发中一般不用
                                        因为其作用是当类中的所有构造函数都有相同的执行代码的时候,
                                        才需要将其向上抽取,写入构造代码块中,
                                        之后每一个构造函数中就都不用写了。
                                4,构造函数初始化
                                        在构造函数中给成员变量赋值,也会覆盖之前的值
                                        常用,一般对象的初始化都是通过构造函数的
                */

                System.out.println("*******************");
                GuestNumber.show();//类中的静态方法可以通过类名直接调用
        }

        //Math类的学习
        public static void mathDemo(){
               
                //Math中获取两个数中大数的值
                int max = Math.max(4,9);
                System.out.println(max);

                //计算2的10次幂
                double d = Math.pow(2,10);
                System.out.println(d);

                //四舍五入求double型的整数
                double d1 = Math.round(12.49);
                System.out.println(d1);

                //求小于等于该数的最大double型整数
                double d2 = Math.floor(12.345);
                System.out.println(d2);

                //求大于等于该数的最小double型整数
                double d3 = Math.ceil(12.345);
                System.out.println(d3);

                //获取随机数
                for(int i = 0 ;i<10;i++){
                        double b = (int)(Math.random()*100+1);
                        System.out.print(b+" ");
                }
                System.out.println();
        }
}

//**类**定义一个类来理清楚new关键字创建对象时,对象的初始化过程
class ObjectNew
{
        int num = 10;

        {
                System.out.println("num = "+num);//10
                num = 20;
                System.out.println("num = "+num);//20
        }

        public ObjectNew(){

                System.out.println("num = "+num);//20
                num = 30;
                System.out.println("num = "+num);//30
        }
}

//**类**写一个pojo类,选学生类
class Student
{
        /*
        定义pojo类学生类的属性
        使用private私有的关键字,封装了学生类的属性,
        让外部不能直接访问到该属性,得通过我们暴露在外的接口
        */

        //姓名
        private String name;
        //年龄
        private int age;

        //无参的构造函数
        public Student(){}

        //带参的构造函数
        public Student(String name,int age){
               
                /*
                这里使用到this关键字,是因为参数名和成员变量名一致了,
                如果不用this关键字指明,则变成了局部变量给局部变量赋值的操作,
                没有涉及到对象的属性。
                */
                this.name = name;
                this.age = age;
        }

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

        public String getName(){
               
                /*
                这里没有用this关键字标识name属性,是因为局部变量中没有name变量,
                它会自动到函数的外部,也就是类的成员变量中找,找到了就返回
                */
                return name;
        }

        public void setAge(int age){
               
                this.age = age;
        }

        public int getAge(){
       
                return age;
        }

        //toString()方法覆盖了Object中的方法,显示的是对象中自定义要显示的信息
        public String toString(){
               
                return name+"***"+age;
        }
}

//**类**一个猜数字的小游戏
class GuestNumber
{
        public static void show(){
                //1,产生一个随机数
                int num = (int)(Math.random()*100)+1;
               
                int count = 0;
                while(true){
                       
                        System.out.println("输入你猜的整数:");
                       
                        //2,输入你猜的整数,用到了Scanner
                        Scanner sc = new Scanner(System.in);
                        int guestNum = sc.nextInt();

                        //3,将产生的随机数与你才的数进行比较
                        if(guestNum > num){
                                count ++;
                                System.out.println("你猜的数字"+guestNum+"太大了!给钱 1块 !再给你一次机会。。。");
                        }else if(guestNum < num){
                                count ++;
                                System.out.println("你猜的数字"+guestNum+"太小了!给钱 1块 !再给你机会。。。");
                        }else{
                                System.out.println("恭喜你猜中了,有奖!钱给你! 3块 !"
                                                                        +"但是,悄悄说一声,你花了"+count+"块钱!哈哈。。。");
                                break;
                        }

                }
        }
}






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2