20145236 冯佳 《Java程序设计》第3周学习总结

时间:2022-12-08 20:51:04

20145236 《Java程序设计》第3周学习总结

教材学习内容总结

第四章 认识对象

一、面向对象和面向过程

•面向对象是相对面向过程而言
•面向对象和面向过程都是一种思想
•面向过程强调的是功能行为
•面向对象将功能封装进对象,强调具备了功能的对象。
•面向对象是基于面向过程的。
•面向对象的特征:封装 继承 多态

创建对象,使用对象

class Car//对Car这类事物进行描述
{
String color = "red";
int num = 4;
void show()
{
System.out.println("color="+color+"..num="+num);
}
}
class CarDemo
{
public static void main(String[] args)
{
Car c = new Car();//建立对象
c.color = "black";//对对象的属性进行修改
c.show();//使用对象的功能。
}
}

二、对象指定与相等性(“=” 和 “==”)

“=”用于基本类型时,是将值复制给变量,“==”用于基本类型时,是比较两个变量储存的值是否相同,如下面的程序:

int a = 10;
int b = 10;
int c = a;
System.out.println(a == b); //显示true
System.out.println(a == c); //显示true

• ==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。

equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。

==比较的是两个对象的地址,而equals比较的是两个对象的内容。

三、基本类型打包器

Java中有两个类型系统,即基本类型与类类型,使用基本类型目的在于效率,然而更多时候,会使用类建立实例,因为对象本身可以携带更多信息,如果要让基本类型像对象一样操作,可以使用Long、Integer、Double、Float、Boolean、Byte等类来打包(Wrap)基本类型。

public class IntegerDemo {
public static void main(String[] args) {
int data1 = 10;
int data2 = 10;
Integer wrapper1 = new Integer(data1); //打包基本类型
Integer wrapper2 = new Integer(data2);
System.out.println(data1 / 3); //基本类型运算
System.out.println(wrapper1.doubleValue() / 3); //操作打包器方法
System.out.println(wrapper1.compareTo(wrapper2)); }
} output:
3
3.3333333333333335
0

基本类型打包器都是归类于java.lang包中,如果要使用Integer打包int类型数据,方法之一是用new创建Integer实例时,传入int类型数据。除了使用new创建基本类型打包器之外,从J2SE 5.0之后提供了自动装箱功能和自动拆箱功能。自动装箱与拆箱的功能事实上是编译程序蜜糖。

四、数组

数组在Java中就是对象。

1.数组的创建:

元素类型[] 数组名= new 元素类型[]{元素,元素,……};
int[] arr = new int[]{3,5,1,7};
int[] arr = {3,5,1,7};

2.使用for循环,通过使用length属性获取数组长度:

int[] scores = { 88, 81, 74, 68, 78, 76, 77, 85, 95, 93};
for (int i = 0; i < scores.length; i++) {
System.out.printf("学生分数:%d %n",scores[i]);
}

3.使用增强式for循环:

for(int score:scores){
System.out.printf("学生分数:%d %n",score);
}

五、字符串

字符串本质是打包字符数组的对象,是java.lang.String类的实例。字符串对象一旦建立,就无法更改对象中的任何内容,对象上没有任何方法可以更改字符串内容。

输入整数,再输入0后会计算所有整数总和代码如下:

import java.util.Scanner;

public class Sum
{
public static void main(String[] args)
{
Scanner scanner = new Scanner(System.in);
long sum = 0;
long number = 0;
do
{
System.out.print("输入数字:");
number = Long.parseLong(scanner.nextLine());
sum += number;
}
while(number != 0);
System.out.println("总和为:"+sum);
}
}

运行结果:

20145236 冯佳 《Java程序设计》第3周学习总结

•课后操作题3

下面是一个数组,请使用程序使其中元素排序为由小到大:
int[] number = {70, 80, 31, 37, 10, 1, 48, 60, 33, 80}
package cc.openhome;

class Number
{
public static void main(String[] args)
{
int[]arr=new int[]{70,80,31,37,10,1,48,60,33,80};
for (int c=0;c<arr.length ;c++ )
{
for (int b=c+1;b<arr.length;b++ )
{
if(arr[c]>arr[b])
{
int tep=arr[c];//实现两个变量的值互换,由此可以排列出数组从小到大
arr[c]=arr[b];
arr[b]=tep;
}
}
System.out.print(arr[c]+" ");//第一次跳出内循环:arr{9,12,56,45,10}第二次跳出:arr{9,10,56,45,12}
}
}
}

运行结果:

20145236 冯佳 《Java程序设计》第3周学习总结

第五章 对象封装

一、Java封装概念

在面向对象程式设计方法中,封装(英语:Encapsulation)是指,一种将抽象性函式接口的实作细节部份包装、隐藏起来的方法。
封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。
要访问该类的代码和数据,必须通过严格的接口控制。
封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。
适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。

二、构造函数与方法重载

如果定义类时,没有撰写任何构造函数,编译程序会自动加入一个无参数、内容为空的构造函数,称为默认构造函数。可以定义多个构造函数,只要参数类型或个数不同,这称为重载构造函数。

方法重载让程序设计人员不用苦恼方法名称的设计,可用一致的名称来调用类似功能的方法,方法重载可根据传递自变量的类型不同,也可根据参数列个数的不同来设计方法重载。

eg:

public class SomeClass {
public void someMethod(){
} public void someMethod(int i){
} public void someMethod(float f){
} public void someMethod(int i,float f){
}
}

编译程序在处理重载函数时,会依以下顺序来处理:

(1)还没有装箱动作前可符合自变量个数与类型的方法

(2)装箱动作后可符合自变量个数与类型的方法

(3)尝试有不定长度自变量并可符合自变量类型的方法

(4)找不到合适的方法,编译错误

三、static和final

•final定义的变量可以看做一个常量,不能被改变;
•final定义的方法不能被覆盖;
•final定义的类不能被继承。
•final static 就是再加上static的特性就可以了
•static和final是没有直接关系的
•static 是在内存中分配一块区域,供整个类通用,所有的类的对象都享有它的共同的值

教材学习中的问题和解决过程

在学习Java这么久了,我一直都不知道类到底是什么,只知道用class就能产生一个类,但是学了第四章,我才差不多明白,要产生对象必须先定义类,类是对象的设计图,对象是类的实例。类定义时使用class关键词,建立实例要使用new关键词。在对Java了解不多的时候只觉得这个东西很抽象,但是随着不断地敲书上的代码练习,现在已经能理解类的大概含义了。然而接下来就是数组了,虽然以前学C语言的时候接触过数组,但是对于数组还并不能熟练地掌握和运用,比如数组的复制,操作数组对象,必须要跟着书上的内容来编写数组代码验证结果。至于第五章的内容则是更加的抽象,因为我不明白为什么要封装,要怎样才叫封装?封装的意义是什么?还有什么是构造函数和方法重载?带着这些疑问,我将教材上的内容仔细的看了好几遍,努力的去理解,认真的去实践书上的程序,所以最终可能开窍了一点儿了。封装的目的主要就是隐藏对象细节,将对象当做黑箱进行操作。而对于static和final的区别:final可修饰类、域(变量和常量)、方法 ,而static不修饰类,static和final是没有直接关系的。

Java封装类实例:

public class EncapTest{

   private String name;
private String idNum;
private int age; public int getAge(){
return age;
} public String getName(){
return name;
} public String getIdNum(){
return idNum;
} public void setAge( int newAge){
age = newAge;
} public void setName(String newName){
name = newName;
} public void setIdNum( String newId){
idNum = newId;
}
}

代码调试中的问题和解决过程

•定义类。只要有一个类定义,编译程序机会产生一个.class文档。在Clothes类中,定义了color和size两个变量。

•ClassObject Field.java

package cc.openhome;

class Clothes //定义Clothes类
{
String color;
char size;
} public class Field
{
public static void main(String[] args)
{
Clothes sun = new Clothes();//建立Clothes实例
Clothes spring = new Clothes();//建立Clothes实例 sun.color = "red";
sun.size = 'S';
spring.color = "green";
spring.size = 'M';
System.out.printf("sun(%s,%c)%n",sun.color,sun.size);//显示个别对象的数据成员值
System.out.printf("spring(%s,%c)%n",spring.color,spring.size);//显示个别对象的数据成员值
}
}

运行结果:

20145236 冯佳 《Java程序设计》第3周学习总结

•构造函数

•ClassObject Field2.java

package cc.openhome;

class Clothes2
{
String color;
char size;
Clothes2(String color, char size)//定义构造函数
{
this.color=color;//color参数的值指定给这个对象的color成员
this.size=size;
}
} public class Field2
{
public static void main(String[] args)
{
Clothes2 sun = new Clothes2("red",'S');//使用指定构造函数建立对象
Clothes2 spring = new Clothes2("green",'M'); System.out.printf("sun(%s,%c)%n",sun.color,sun.size);
System.out.printf("spring(%s,%c)%n",spring.color,spring.size);
}
}

运行结果:

20145236 冯佳 《Java程序设计》第3周学习总结

•使用标准类:使用java.util.Scanner

•ClassObject Guess.java

package cc.openhome;
import java.util.Scanner;//告诉编译程序接下来想偷懒 public class Guess
{
public static void main(String[] args)
{
Scanner scanner = new Scanner (System.in);//建立Scanner实例
int number = (int) (Math.random() * 10);
int guess; do
{
System.out.printf("猜数字(0—9):");
guess = scanner.nextInt();//取得下一个整数
}
while(guess != number); System.out.println("猜中了...XD"); }
}

运行结果:

20145236 冯佳 《Java程序设计》第3周学习总结

•使用java.math.BigDecimal

•ClassObject DecimalDemo.java

import java.math.BigDecimal;

public class DecimalDemo
{
public static void main(String[] args)
{
BigDecimal operand1 = new BigDecimal ("1.0");
BigDecimal operand2 = new BigDecimal ("0.8");
BigDecimal result = operand1.subtract(operand2); System.out.println(result); }
}

运行结果:

20145236 冯佳 《Java程序设计》第3周学习总结

•用BigDecimal比较相等

•ClassObject DecimalDemo2.java

package cc.openhome;

import java.math.BigDecimal;

public class DecimalDemo2
{
public static void main(String[] args)
{
BigDecimal o1 = new BigDecimal ("0.1");
BigDecimal o2 = new BigDecimal ("0.1");
BigDecimal o3 = new BigDecimal ("0.1");
BigDecimal result = new BigDecimal("0.3");
if(o1.add(o2).add(o3).equals(result))
{
System.out.println("等于0.3");
}
else
{
System.out.println("不等于0.3");
} }
}

运行结果:

20145236 冯佳 《Java程序设计》第3周学习总结

•基本类型打包器

•Wrapper IntegerDemo.java

package cc.openhome;

public class IntegerDemo
{
public static void main(String[] args)
{
int data1 = 10;
int data2 = 20;
Integer wrapper1 = new Integer(data1); //打包基本类型
Integer wrapper2 = new Integer(data2);
System.out.println(data1/3); //基本类型运算
System.out.println(wrapper1.doubleValue()/3); //操作打包器方法
System.out.println(wrapper1.compareTo(w2));
}
}

运行结果:

20145236 冯佳 《Java程序设计》第3周学习总结

•声明数组来储存XY坐标位置要放的值

•Array XY.java

package cc.openhome;

public class XY
{
public static void main(String[] args)
{
int[][] cords={
{1,2,3},
{4,5,6}
};
for(int[] row : cords)
{
for(int value : row)
{
System.out.printf("%2d",value);
}
System.out.println();
}
}
}

运行结果:

20145236 冯佳 《Java程序设计》第3周学习总结

•操作数组对象

•将每个学生成绩默认为60分起

•Array Score2.java

package cc.openhome;

import java.util.Arrays;

public class Score2
{
public static void main(String[] args)
{
int[] scores = new int[10];
for(int score : scores)
{
System.out.printf("%2d",score);
}
System.out.println();
Arrays.fill(scores,60);
for(int score : scores)
{
System.out.printf("%3d",score);
}
}
}

运行结果:

20145236 冯佳 《Java程序设计》第3周学习总结

•数组复制

•Array CopyArray.java

package cc.openhome;

import java.util.Arrays;

public class CopyArray
{
public static void main(String[] args)
{
int[] scores1 = {88,81,74,68,78,76,77,85,95,93};
int[] scores2 = Arrays.copyOf(scores1,scores1.length);
for(int score : scores2)
{
System.out.printf("%3d",score);
}
System.out.println(); scores2[0] = 99;//不影响scorel参考的数组对象
for(int score : scores1)
{
System.out.printf("%3d",score);
}
}
}

运行结果:

20145236 冯佳 《Java程序设计》第3周学习总结

•字符串特性

•String Oneto100.java

package cc.openhome;
public class One
{
public static void main(String[] args)
{
StringBuilder builder = new StringBuilder();
for(int i = 1; i < 100; i++)
{
builder.append(i).append('+');
}
System.out.println(builder.append(100).toString());
}
}

运行结果:

20145236 冯佳 《Java程序设计》第3周学习总结

20145236 冯佳 《Java程序设计》第3周学习总结

•通过成员方法(函数)封装操作

•Encapsulation2 CashAPP.java

package cc.openhome;
import java.util.Scanner; public class CashApp
{
public static void main(String[] args)
{
CashCard[] cards={
new CashCard("A001",500,0),
new CashCard("A002",300,0),
new CashCard("A003",1000,1)
}; Scanner scanner = new Scanner(System.in);
for(CashCard card : cards)
{
System.out.printf("为(%s,%d,%d)储值:",card.number,card.balance,card.bonus);
card.store(scanner.nextInt());
System.out.printf("明细(%s,%d,%d)%n",card.number,card.balance,card.bonus);
}
}
}

运行结果:

20145236 冯佳 《Java程序设计》第3周学习总结

这个程序不知道是哪里出了问题,应该是CashCard的问题,但是目前还没有解决。

•构造函数与方法重载

•Class OverloadBoxing.java

class Some
{
void someMethod(int i)
{
System.out.println("int 版本被调用");
}
void someMethod(Integer integer)
{
System.out.println("Integer 版本被调用");
}
}
public class Overload
{
public static void main(String[] args)
{
Some s = new Some();
s.someMethod(1);
}
}

运行结果:

20145236 冯佳 《Java程序设计》第3周学习总结

•使用this

•Class ObjectlnitialBlock.java

package cc.openhome;
class Other{
{
System.out.println("对象初始区块");
}
Other()
{
System.out.println("Other() 构造函数");
}
Other(int o )
{
this();
System.out.println("Other(int o ) 构造函数");
}
} public class ObjectInitialBlock
{
public static void main(String[] args)
{
new Other(1);
}
}

运行结果:

20145236 冯佳 《Java程序设计》第3周学习总结

•static类成员

•Class ImportStatic.java

package cc.openhome;

import java.util.Scanner;
import static java.lang.System.in;
import static java.lang.System.out;
public class ImportStatic
{
public static void main(String[] args)
{
Scanner scanner = new Scanner(in);
out.print("请输入姓名:");
out.printf("%s 你好!%n",scanner.nextLine());
}
}

运行结果:

20145236 冯佳 《Java程序设计》第3周学习总结

•不定长度自变量

•Class MathTool.java

package cc.openhome;
public class Main{
public static int sum(int... numbers){
int sum = 0;
for(int number:numbers){
sum+=number; }
return sum;
}
}

•传值调用

•Class CallByValue

public class CallByValue {
public static void main(String[] args) {
Customer c1 = new Customer("Justin");
some(c1);
System.out.println(c1.name); Customer c2 = new Customer("Justin");
other(c2);
System.out.println(c2.name);
} static void some(Customer c) {
c.name = "John";
} static void other(Customer c) {
c = new Customer("Bill");
}
} class Customer {
String name;
Customer(String name) {
this.name = name;
}
}

运行结果:

20145236 冯佳 《Java程序设计》第3周学习总结

•代码托管

20145236 冯佳 《Java程序设计》第3周学习总结

其他(感悟、思考等,可选)

我觉得通过这两章内容的自学,自己又掌握了很多知识,对于自己的Java程序设计又达到了一个新的突破,虽然书上的概念性的知识好多还是没有;理解,但是我按照老师布置的学习任务去做,把书上的代码挨着敲了一遍,当然,虽然是原搬的,但是发现还是遇到了错误的地方,很多还是自己粗心输错了,或者少输了,就导致代码编译不通过。所编代码一定要认真认真再认真,因为有可能少输一个分号就可能使代码运行不成功。但是通过敲这些代码,从中我也掌握了很多技巧性的东西,所以 这周的学习让我收获颇丰。但是有一个最大的问题!代码托管不会弄,研究了一下午都没托管上去,简直爆炸!!!但是后来通过咨询同学,看了好多相关的博客,终于成功的将代码都推送上去了。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 200/200 2/2 20/20
第二周 300/500 2/4 18/38
第三周 500/1000 1/5 40/78

参考资料