作业2:2018/7/4

本文详细解析了Java中的关键概念,包括局部变量与成员变量的区别、形式参数的基本类型与引用类型区别、匿名对象及其应用场景、封装的概念及其实现、this关键字的使用、构造方法的作用与特点等,并提供了具体的代码示例。

1:局部变量和成员变量的区别?
(1)、在类中的位置不同
成员变量:在类中方法外面;有static关键字修饰,就叫作静态变量或类变量;没有static关键字修饰,就叫作非静态变量或实例变量;
局部变量:在方法或者代码块中,或者方法的声明上(即在形式参数列表中)
(2)、在内存中的位置不同
成员变量:在堆中(方法区中的静态区)
局部变量:在栈中
(3)、生命周期不同
成员变量:随着对象的创建而存在,随着对象的消失而消失
局部变量:随着方法的调用或者代码块的执行而存在,随着方法的调用完毕或者代码块的执行完毕而消失
(4)、初始值
成员变量:成员变量可以不显式初始化,有默认初始值
局部变量:没有默认初始值,使用之前需要赋值,否则编译器会报错(The local variable xxx may not have been initialized)

2:形式参数分别为基本类型和引用类型的区别?请举例说明情况
首先要弄清什么是形式参数,基本类型,引用类型;
形式参数(形参)百度百科里的解释是:在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数.
通俗的说就是:形式参数是指在函数名后面的小括号里定义的变量, 用于接受来自调用函数的参数。
基本类型:四类八种,储存的是数据本身 byte short int long float double boolean char
引用类型:储存的是地址值 比如 类,接口,集合之类的,java中的包装器类型就是引用类型;
可以张这样理解,c/c++中的指针和引用类型本质一样,在C++中还有一个专门的引用操作符
然后:
  对于基本类型,形式参数的改变不会影响实际参数
  对于引用类型,形式参数的改变会直接影响实际参数
再然后:就是形式参数分别是基本类型和引用类型的调用

3:匿名对象是什么?应用场景是什么?
(1):什么是匿名对象?
没有名字的对象。
(2):匿名对象应用场景。
调用方法,仅仅只调用一次的时候。
a.这种匿名调用有什么好处?节省代码。
b.注意:调用多次的时候,不适用。匿名对象调用完毕即为垃圾,可以被垃圾回收器回收。
实例一:
//匿名对象是否可以调用属性并赋值?有什么意义?
/*
匿名对象可以调用属性,但是没有意义,因为调用后就变成垃圾
如果需要赋值还是用有名字对象
*/
new Car().color = “red”;
new Car().num = 8;
new Car().run();
实例二:匿名对象可以当作参数传递
//Car c2 = new Car();
//method(c2);
method(new Car()); //匿名对象可以当作参数传递

4:封装是什么?java中封装的体现有哪些?请举例说明。
(1)封装的—安全特性
(2)封装的第二个好处-将变化隔离
(3)封装便于使用
(4)提供重复性的特性。
封装的好处:
1:隐藏了类的具体实现
2:操作简单
3:提高对象数据的安全性
体现:
private, protected, public关键字的使用

5:this关键字是什么?this关键字的应用场景?
(1)this关键字用来指向当前对象或类实例
(2)this可以用于构造函数调用其他构造函数。
但注意:只能定义在构造函数的第一行。因为初始化动作要先执行。

6:构造方法的作用是什么?构造方法的特点是什么?构造方法的注意事项是什么?构造方法中可不可以写return语句呢?
a、作用:
构造方法:也就是类的初始化方法,初始化一个对象,给对象赋值,每个java类实例化的时候都会调用一个构造方法
b、特点:
方法名与类名同名,没有返回类型,连void也没有,没有具体的返回值;
c、注意事项:
(1)如果没有手动编写的话会有一个默认的无参构造方法,
(2)构造方法可以被重载 也就是可以有多个名字相同参数不同的方法
d、可以有返回语句return;

7:给成员变量赋值有几种方式?
(1)通过成员函数来赋值 eg: obj.setPerproties()
(2)通道构造函数来赋值,给一个对象赋值初始化

8:标准的代码编写及测试:
A:学生类的案例
B:手机类的案例
C:长方形类的案例
9:简述一个类的成员变量初始化过程
Student s = new Student();

”’
//Person类
package test;

public class Person {
protected String m_ID;
protected String m_name;
protected String m_sex;
protected int m_age;
protected String m_degree;
protected String m_college;

public Person() {

    m_ID = "1234";
    m_name = "Tom";
    m_sex = "male";
    m_age = 0;
    m_degree = "undergraduate";
    m_college = "XiYou";

    System.out.println("I'm class Person");
}

public Person(String ID, String name, String sex, Integer age, String degree, String college) {

    this.m_ID = ID;
    this.m_name = name;
    this.m_sex = sex;
    this.m_age = age;
    this.m_degree = degree;
    this.m_college = college;
}

public void viewInforamtion() {
    System.out.println("ID : " + m_ID);
    System.out.println("name : " + m_name);
    System.out.println("sex : " + m_sex);
    System.out.println("age : " + m_age);
    System.out.println("degree : " + m_degree);
    System.out.println("college : " + m_college);
}

public void sayHello() {
    System.out.println("I'm clsss Person");
}

@Override
public String toString() {
    return getClass().getName();
}

@Override
public boolean equals(Object object) {
    if (this == object){
        return true;
    }

    if(object instanceof Person) {
        Person person = (Person)object;
        if(!this.m_name.equals(person.m_name)) {
            return false;
        }
        if(this.m_ID != person.m_ID) {
            return false;
        }
        if (this.m_age != person.m_age) {
            return false;
        }

        return true;
    }

    return false;
}

@Override
public int hashCode() {
    return m_ID.hashCode();
}

}

//Father类
package test;

import java.util.Scanner;

public class Father extends Person {

public Father() {
    System.out.println("I'm father.");
}

@Override
public void viewInforamtion() {

}

// 重写父类的方法
@Override
public void sayHello() {
    System.out.println("I'm father");
    this.viewInforamtion();
}


public void changeInfomation() {
    System.out.println("What type info want you change?");
    System.out.println("Please input a int value of reflect...");
    System.out.print("Please input : ");
    Scanner scanner = new Scanner(System.in);
    int n = scanner.nextInt();

    System.out.print("Please input info:");
    String temp = scanner.next();
    scanner.close();


    boolean flag = true;

    switch(n) {
    case 1: m_ID = temp; break;
    case 2: m_name = temp; break;
    case 3: m_sex = temp; break;
    case 4: m_degree = temp; break;
    case 5: m_college = temp; break;
    default:System.out.println("Error option"); 
            flag = false;
            break;
    }

    if(flag) {
        System.out.println("Have changed successfuly!");
    }   
}

public void deleteInformation() {

}

public void addInformation() {

}

}

//Student类:
package test;

import test.Father;
import test.Subject;

public class Student extends Father {

// 学科及成绩信息类
private Subject subject;

public Student() {
    super();
    subject = new Subject();

    System.out.println("I'm a student.");
}

// 重写父类的方法
@Override
public void sayHello() {
    System.out.println("I'm a student");
}

// 查看信息
@Override
public void viewInforamtion() {
    super.viewInforamtion();
    System.out.println(subject.getCourse() + " : " + subject.getScore());
}

// 爸爸
public String callFather() {
    return super.m_name;
}

// 老师
public String callTeacher() {
    return "";
}

// 修改信息
public void changeInfomation(String id) {
    if(this.m_ID.equals(id)) {

    }
}

// 删除信息
public void deleteInformation() {

}

// 增加信息
public void addInformation() {

}

//更新信息
public void updateInformation() {

}

public static void main(String[] args) {
    Student student = new Student();

}

}
”’
运行结果:这里写图片描述

我感觉学习c++的面向对象的对象构造过程跟能理解一个对象的构造深度,它里面包括了的对象的释放–析构函数,对象的释放严格与构造过程相反

任务描述 本关任务:编写一个清洗QueueStream数据的SparkStreaming程序。 相关知识 为了完成本关任务,你需要掌握:1.如何使用SparkStreaming,2.如何使用 SparkStreaming读取QueueStream。 SparkStreaming 的开发步骤 初始化SparkConf并设置相关参数 val conf = new SparkConf().setMaster(master).setAppName(appName) 说明: appName 是应用程序在集群 UI 上显示的名称。 master 是Spark,Mesos或YARN集群的URL,或在本地模式下运行使用 local[*] 初始化JavaStreamingContext并设置处理批次的时间 val ssc = new StreamingContext(conf, Seconds(1)) 设置数据源 例如: val inputStream = ssc.queueStream(rddQueue) 批次数据处理(使用相关算子完成相应的操作) 算子 含义 map(func) 通过将源DStream的每个元素传递给函数func来返回一个新的DStream flatMap(func) 与map似,但每个输入项可以映射到0个或更多输出项。 filter(func) 通过仅选择func返回true的源DStream的记录来返回新的DStream repartition(numPartitions) 通过创建更多或更少的分区来更改此DStream中的并行度级别 union(otherStream) 返回一个新的DStream,它包含源DStream和otherDStream中元素的并集 count() 通过计算源DStream的每个RDD中的元素数量,返回单元素RDD的新DStream reduce(func) 通过使用函数func(它接受两个参数并返回一个)聚合源DStream的每个RDD中的元素,返回单元素RDD的新DStream 。该函数应该是关联的和可交换的,以便可以并行计算 countByValue() 当在型为K的元素的DStream上调用时,返回(K,Long)对的新DStream,其中每个键的值是其在源DStream的每个RDD中的频率 reduceByKey(func,[ numTasks ]) 当在(K,V)对的DStream上调用时,返回(K,V)对的新DStream,其中使用给定的reduce函数聚合每个键的值。注意:默认情况下,这使用Spark的默认并行任务数(本地模式为2,在群集模式下,数量由config属性确定spark.default.parallelism进行分组。您可以传递可选numTasks参数来设置不同数量的任务 join(otherStream, [numTasks]) 当在(K,V)和(K,W)对的两个DStream上调用时,返回(K,(V,W))对的新DStream与每个键的所有元素对 cogroup(otherStream, [numTasks]) 当在(K,V)和(K,W)对的DStream上调用时,返回(K,Seq [V],Seq [W])元组的新DStream transform(func) 通过将RDD-to-RDD函数应用于源DStream的每个RDD来返回新的DStream。这可以用于在DStream上执行任意RDD操作 updateStateByKey(func) 返回一个新的“状态”DStream,其中通过在键的先前状态和键的新值上应用给定函数来更新每个键的状态 foreachRDD(func) 最通用的输出运算符,它将函数func应用于从流生成的每个RDD。此函数应将每个RDD中的数据推送到外部系统,例如将RDD保存到文件,或通过网络将其写入数据库。请注意,函数func在运行流应用程序的驱动程序进程中执行,并且通常会在其中执行RDD操作,这将强制计算流式RDD。 启动流计算 ssc.start(); 等待处理停止 ssc.awaitTermination(); QueueStream QueueStream(队列流):推入队列的每个RDD将被视为DStream中的一批数据,并像流一样处理。 编程要求 在右侧编辑器补充代码,完成以下需求: 将时间戳转换成规定格式的时间形式(格式为:yyyy-MM-dd HH:mm:ss ) 提取数据中的起始URL(切割符为空格) 拼接结果数据,格式如下: Ip:124.132.29.10,visitTime:2019-04-22 11:08:33,startUrl:www/2,targetUrl: https://search.yahoo.com/search?p=反叛的鲁鲁修,statusCode:200 将最终结果写入Mysql数据库 测试说明 平台将对你编写代码进行评测: 预期输出: 1 Ip:100.143.124.29,visitTime:2017-10-27 14:58:05,startUrl:www/1,targetUrl:https://www.baidu.com/s?wd=反叛的鲁鲁修,statusCode:404 2 Ip:30.132.167.100,visitTime:2018-12-02 11:29:39,startUrl:www/4,targetUrl:-,statusCode:302 3 Ip:30.156.187.132,visitTime:2016-05-17 17:18:56,startUrl:www/2,targetUrl:-,statusCode:200 4 Ip:29.100.10.30,visitTime:2016-10-12 01:25:47,startUrl:www/3,targetUrl:http://cn.bing.com/search?q=游戏人生,statusCode:302 5 Ip:132.187.167.143,visitTime:2017-01-08 23:21:09,startUrl:pianhua/130,targetUrl:-,statusCode:200 6 Ip:143.187.100.10,visitTime:2016-09-21 19:27:39,startUrl:www/1,targetUrl:-,statusCode:302 7 Ip:10.100.124.30,visitTime:2018-09-16 02:49:35,startUrl:www/4,targetUrl:http://cn.bing.com/search?q=来自新世界,statusCode:200 8 Ip:29.10.143.187,visitTime:2017-09-29 15:49:09,startUrl:www/1,targetUrl:-,statusCode:404 9 Ip:29.187.132.100,visitTime:2018-11-27 05:43:17,startUrl:www/1,targetUrl:-,statusCode:200 10 Ip:187.167.124.132,visitTime:2016-01-28 13:34:33,startUrl:www/6,targetUrl:-,statusCode:200 开始你的任务吧,祝你成功! import java.text.SimpleDateFormat import java.util.Date import org.apache.spark.{HashPartitioner, SparkConf} import org.apache.spark.rdd.RDD import org.apache.spark.streaming.{Seconds, StreamingContext} import scala.collection.mutable object QueueStream { def main(args: Array[String]) { val rddQueue = new mutable.SynchronizedQueue[RDD[String]]() val conf = new SparkConf().setMaster("local[2]").setAppName("queueStream") /********** Begin **********/ //1.初始化StreamingContext,设置时间间隔为1s //2.对接队列流 /** * * 数据格式如下: * 100.143.124.29,1509116285000,'GET www/1 HTTP/1.0',https://www.baidu.com/s?wd=反叛的鲁鲁修,404 * 数据从左往右分别代表:用户IP、访问时间戳、起始URL及相关信息(访问方式,起始URL,http版本)、目标URL、状态码 * * * 原始数据的切割符为逗号,(英文逗号) * * 需求: * 1.将时间戳转换成规定时间(格式为:yyyy-MM-dd HH:mm:ss ) * 2.提取数据中的起始URL(切割符为空格) * 3.拼接结果数据,格式如下: * Ip:124.132.29.10,visitTime:2019-04-22 11:08:33,startUrl:www/2,targetUrl:https://search.yahoo.com/search?p=反叛的鲁鲁修,statusCode:200 * 4.将最终结果写入 mysql 数据库, 调用DBUtils.add(line)即可, line:String */ //3.获取队列流中的数据,进行清洗、转换(按照上面的需求) //4.将最终结果写入 mysql 数据库, 调用DBUtils.add(line)即可, line:String //5.启动SparkStreaming /********** End **********/ DBUtils.addQueue(ssc, rddQueue) } }
最新发布
11-28
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

phial03

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值