第七次课的总结与思考

在第七次课,主要有以下内容:面向对象与面向过程的区别、类和对象、对象引用和指针、类方法和实例方法(this关键字的使用、值传递、可变参数类型)、类变量和非静态变量、递归和方法重载、访问权限修饰符、构造器、用递归实现1+2+3+...+100的和的代码、基于GUI的验证姓名和年龄的有效性的中年类的代码、打印所有汉字的代码

一、面向对象(oo)与面向过程(po)的区别

1、oo:先抽象,后具体

2、po:分解问题+逻辑为先(先细节,后整体)

二、类与对象

1、对象的产生和使用

如:Teacher teacher = new Teacher();

右边的Teacher()指的是Teacher类的无参构造器,teacher是Teacher的对象。

三、对象引用和指针

如:Person p = new Person();

p:引用变量,在栈中;

Person:在堆中。

例子:

package objectoriented;

public class Dog {

	public String name;
	public void run(){
		System.out.print(name + " is running...");
		//this指向当前对象
		this.jump();
	}
	public void jump(){
		System.out.print(" jump");
	}
}
package objectoriented;

public class ObjectOriented {

	public static void main(String[] args) {

		Dog dog = new Dog();
		dog.name = "little dog";
		dog.run();
	}

}

控制台输出:

little dog is running... jump

那么为什么在Dog类中,方法与方法之间可以相互调用?

因为在run方法中,this.jump()有this指针,而this指向当前对象。(在run方法中,this.jump()的this也可以不写)

四、类方法和实例方法

1、类方法也叫static方法,类方法和实例方法的区别在于有没有static关键字。在没有创建任何对象的前提下,可以通过类本身来调用static方法;而实例方法必须创建类的对象才能使用。

2、java只有值传递,如下面例子:

package objectoriented;

public class TestArgsPass {

	public static void main(String[] args) {

		int a = 100;
		int b = 102;
		System.out.println("交换前:a = "
				+ a + " b = " + b);
		swap(a,b);
		System.out.println("交换结束后:a = "
				+ a + " b = " + b);
	}

	public static void swap(int a, int b) {

		int temp = a;
		a = b;
		b = temp;
		System.out.println("swap方法里面的值:a = "
				+ a + " b = " + b);
	}

}
交换前:a = 100 b = 102
swap方法里面的值:a = 102 b = 100
交换结束后:a = 100 b = 102

3、可变参数类型,如String...args

例子:

package objectoriented;

public class Party {

	public static void main(String[] args) {
		Party party = new Party();
		party.info("小明","小强","小亮");
	}

public void info(String... args) {
	System.out.println("人数 = " + args.length+"人");
	System.out.print("具体有:");
	for (String i : args) {
		System.out.print(i + ", ");
	}
}

}

人数 = 3人
具体有:小明, 小强, 小亮, 

还可以输入混合类型的参数,如:

package objectoriented;

public class Party {
	public static void main(String[] args) {
		Party party = new Party();
		party.info(2007,"小明","小强","小亮");
	}

public void info(int n,String...args) {
	System.out.println("第" + n+"届同学聚会");
	System.out.print("参加的人有:");
	for (String i : args) {
		System.out.print(i + ", ");
	}
}

}

第2007届同学聚会
参加的人有:小明, 小强, 小亮, 

五、类变量与非静态变量

这里引用http://www.cnblogs.com/dolphin0520/p/3799052.html这篇博文的说法(作者对Java中的static关键字解析非常透彻,建议读者有空看看):static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。

六、递归和方法重载(overload)

1、递归,具体请读者浏览第八点的代码

2、方法重载:要求方法名相同,形参不同,与修饰符、返回值类型无关。如System.out.println()(有多个重载的方法,形参不同),使用者可挑选自己想用的那一个

方法重载要注意与方法覆盖相区别

七、构造器及访问权限修饰符

1、注意:每一个类都有一个默认的构造器:public className(){}(public可以省略),这个默认的构造器当没有在代码上显示出来时,它依然是存在于类中的。

2、访问权限修饰符的权限按照由小到大的顺序排列:private(仅在同一类中可访问)、default(在同一包中可访问)、protected(在子类中可访问)、public(在不同包都可访问)

八、用递归实现1+2+3+...+100的代码

package objectoriented;

/**
 * 用递归方法,计算1+2+3+...+100
 * @version 1.0
 * @author jscly
 * @dateTime 2016/06/04
 */
public class Recursion {

	public static void main(String[] args) {

		int n = 100;
		Recursion recursion = new Recursion();
		System.out.println(recursion.count(n));
	}

	public int count(int n) {
//法一
		if(n == 1){
			return 1;
		}
		return n + count(n - 1);

//法二
//		if (n == 1) {
//			n = 1;
//		}
//		else if(n>1){
//
//			n += count(n - 1);
//		}
//
//		return n;
	}

}

九、基于GUI的验证姓名和年龄的有效性的中年类的实现代码

运行截图如下:

Person类:

package homework;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.swing.JOptionPane;

public class Person {

	private String name;
	private int age;

	public String getName() {
		return name;
	}

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

	public int getAge() {
		return age;
	}

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

}

MiddleAge中年类:

package homework;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

/**
 * 在GUI中,输入的姓名、年龄(规定:姓名只能由6-8位大小写的英文字母或汉字组成,年龄需<span style="font-family: Arial, Helvetica, sans-serif;">在40-50范围内),</span>如果姓名和年龄的输入格式正确,
 * 则显示结果;否则提醒用户相应的错误
 *
 * @author jscly
 * @version 1.0
 * @dateTime 2016/06/05
 *
 */
public class MiddleAge extends JFrame {

	JLabel jl_name;
	JLabel jl_age;
	JTextField jtf_name;
	JTextField jtf_age;
	JButton jbt_sure;
	JButton jbt_reset;
	JButton jbt_cancel;
	JTextArea jta_result;

	public MiddleAge() {
		jl_name = new JLabel("姓名");
		jl_age = new JLabel("年龄");
		jtf_name = new JTextField();
		jtf_age = new JTextField();
		jbt_sure = new JButton("确定");
		jbt_reset = new JButton("重置");
		jbt_cancel = new JButton("取消");
		jta_result = new JTextArea();

		jl_name.setHorizontalAlignment(0);
		jl_age.setHorizontalAlignment(0);
		jta_result.setEditable(false);

		JPanel p1 = new JPanel();
		p1.setLayout(new GridLayout(2, 2, 5, 5));
		p1.add(jl_name);
		p1.add(jtf_name);
		p1.add(jl_age);
		p1.add(jtf_age);

		JPanel p2 = new JPanel();
		p2.setLayout(new GridLayout(2, 3, 5, 5));
		for (int i = 0; i < 3; i++) {
			p2.add(new JLabel());
		}
		p2.add(jbt_sure);
		p2.add(jbt_reset);
		p2.add(jbt_cancel);

		JPanel p3 = new JPanel();
		p3.setLayout(new GridLayout(2, 1, 5, 5));
		p3.add(p1);
		p3.add(p2);

		add(p3, BorderLayout.NORTH);
		add(jta_result, BorderLayout.CENTER);
		jbt_sure.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				handle(jtf_name.getText(), jtf_age.getText());
			}

		});
		jbt_reset.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				jtf_name.setText("");
				jtf_age.setText("");
			}
		});
		jbt_cancel.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}
		});
	}

	public void handle(String name, String age) {
		Person person = new Person();
		int ageInt = 0;
		// 先判断姓名和年龄是否为空
		if ("".equals(name)) {
			JOptionPane.showMessageDialog(null, "姓名不能为空!");
			if ("".equals(age)) {
				JOptionPane.showMessageDialog(null, "年龄不能为空!");
			}
			return;
		}
		// (1)得到姓名的长度,接着判断这个长度是否合法
		// (2)判断年龄是否在[40,50]范围内
		if (!"".equals(name) || name != null
				&& (age != null || !"".equals(age))) {
			// 得到姓名的长度,并验证其有效性
			char[] charArray = name.toCharArray();
			int lengthOfName = 0;
			for (char i = 0; i < charArray.length; i++) {
				// 验证姓名的单个字符是否为大写或小写的英文字母,是则长度加1
				if ((charArray[i] >= 65 && charArray[i] <= 90)
						|| (charArray[i] >= 97 && charArray[i] <= 122)) {
					lengthOfName++;
				}

				/*
				 * 在unicode 编码表中 汉字范围从 4E00(一) 到 9fa5(龥);
				 * int 范围是 19968 - 40869;
				 * 总共记录汉字数量为20902 个
				 */

				// 验证姓名的单个字符是否为汉字,是则长度加2
				else if (charArray[i] >= '\u4e00' && charArray[i] <= '\u9fa5') {
					lengthOfName += 2;
				}
				// 姓名的单个字符不合法
				else {
					lengthOfName = 0;
					break;
				}
			}

			// 判断姓名长度是否合法
			if (lengthOfName < 6 || lengthOfName > 8) {
				JOptionPane.showMessageDialog(null,
						"姓名格式错误!应由中、英文组成,范围为6-8位(1个汉字占2位)");
				return;
			}

			// 判断年龄格式是否合法,得到年龄
			Pattern pattern = Pattern.compile("\\d{2}");
			Matcher matcher = pattern.matcher(age);
			if (matcher.matches()) {
				ageInt = Integer.parseInt(age);
			} else {
				JOptionPane.showMessageDialog(null, "年龄格式错误!请输入[40,50]范围内的数字");
				return;
			}

			// 判断年龄是否在[40,50]范围内
			if ((ageInt < 40 || ageInt > 50)) {
				JOptionPane.showMessageDialog(null, "年龄格式错误!请输入[40,50]范围内的数字");
				return;
			}
		}
		person.setName(name);
		person.setAge(ageInt);

		jta_result
				.setText("姓名:" + person.getName() + "\n年龄:" + person.getAge());
	}

	public static void main(String[] args) {
		MiddleAge person = new MiddleAge();
		person.setVisible(true);
		person.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		person.setTitle("中年类");
		person.setLocationRelativeTo(null);
		person.setSize(400, 400);
	}
}

十、打印所有汉字的实现代码

在验证第九点的代码中的姓名的有效性的时候(需要检查用户是否输入了汉字),我查找了有关汉字对应的ASCIIi的内容(具体参考了这篇文章:http://www.07net01.com/2015/08/900751.html),现在编写一个用于输出所有汉字的代码,供大家参考学习

package printallchinese;

public class PrintAllChinese {

	/**
	 * 打印所有的汉字
	 *
	 * 在unicode 编码表中 汉字范围从 4E00(一) 到 9fa5(龥); int 范围是 19968 - 40869; 总共记录汉字数量
	 * 20902 个
	 *
	 * @author jscly
	 * @version 1.0
	 * @dateTime 2016/06/04
	 * @return
	 */
	public String printAllChinses() {
		String result = "";
		// 法一
		// for (char i = '\u4e00',k = 0; i <= '\u9fa5'; i++,k++) {
		// if ((k + 1) % 50 == 0) {
		// result += "\n" + i;
		// k = 0;
		// }
		// else {
		// result += " " + i;
		// }
		// }

		// 法二
		for (int i = 19968, k = 0; i <= 40869; i++, k++) {
			// 每行输出50个汉字
			if ((k + 1) % 50 == 0) {
				result += "\n" + (char) i;
				k = 0;
			} else {
				result += " " + (char) i;
			}
		}

		return result;
	}

	public static void main(String[] args) {

		PrintAllChinese pac = new PrintAllChinese();
		String result = pac.printAllChinses();
		System.out.println(result);

	}

}

控制台输出结果的部分截图:

再次深深被博大精深、源远流长的中华文化所震撼!!!

时间: 2024-10-07 04:52:19

第七次课的总结与思考的相关文章

七月算法--12月机器学习在线班-第七次课笔记—最大熵

七月算法--12月机器学习在线班-第七次课笔记—最大熵 七月算法(julyedu.com)12月机器学习在线班学习笔记 http://www.julyedu.com

centos mysql 优化 第七节课

centos mysql  优化  第七节课 f

Linux学习第七节课(2019.9.20)

今晚第七节课,老刘讲了文件的特殊权限SUID,SGID,SBIT,文件的隐藏设置chattr以及隐藏文件的查看lsatrr:文件访问控制列表设置setfacl以及文件访问控制的查询getfacl:切换用户命令su以及sudo命令执行权赋予用户的命令:最后讲了第六章的开头linux的目录.这周报考了,突然有点压力,哈哈,希望顺顺利利,11月1日考过红帽rhsca以及rhce.老刘网站:linuxprobe.com 原文地址:https://blog.51cto.com/14523487/24398

C#第七节课

//正文之前先吐槽(助教跳过这段啊我前面都注释了)...这学期的12周之后算了算好像还蛮闲的...12周之前...尤其是现在到12周...一顿大作业一顿大作业...还有新开的课还有期末..还有acm集训...学弟学妹要是看到博客记得...C#与Android不可兼得...少选课保平安...何苦为难自己...好了吐槽结束 上周讲了很多...感觉进度又加快了一些...我就说说课后自己又重现的老师提起过的知识吧.正好这个五一除了acm集训就在写C#的大作业,所以这节课就着重说一些实验中的问题以及实验和

第七节课:字典

字典是无序的,它不能通过偏移量来索引,只能通过键来存取. 字典= {'key':value} key:类似我们现实的钥匙,而value则是锁.一个钥匙开一个锁. 特点:内部没有顺序,通过键来读取内容,可嵌套,方便我们组织多种数据结构,并且原地修改里面的内容,属于可变类型. 组成字典的键必须是不可变的数据类型,比如 数字.字符串,元组等. 列表是可变对象不能作为键. 键是字符串:info = {'a':1,'b':2}键是数字: info2 = {1:'a',2:'b'}键是元组: cinfo =

第七次课大纲

指针部分的总结: 一.指针的定义与引用 内存相关概念,指针的定义,&运算符,*运算符: (1)定义一个整型变量a: int a: (2)定义一个指向整型的指针p: int *p; (3)指针变量p指向整型变量a: p=&a: (4)变量a加上5: a=a+5:a+=5; *p=*p+5;*p+=5; [问题:如何理解透彻C语言?1)计算机所有专业课学完(以编译原理,计算机组成原理和操作系统为例),2)实践] 二.指针与函数 (1)声明一个函数swap,返回值是void类型,形参是两个int

7、第七节课,js逻辑运算

1.条件语句 function MyClick() { var iNum1=10; var iNum2=15; var iNum3=20; if (iNum1==iNum2) { iNum2=iNum3; } alert(iNum2); } 2. iNum3=iNum1>iNum2?iNum1:iNum2;//如果iNum1大于iNum2 则取值iNum1,或则取iNum2. 3. function MyClick() { var sInput=prompt("请输入一个1~100之间的整

2015-09-28 第七节课 (js简介、声明变量、数据类型)

vs新建步骤 文件——新建项目——web——空白web应用程序——取名.位置.确定——此时软件会自动生成一个sln文件(解决方案),一解决方案下面可以有多个项目. 点击项目——新建文件夹css和js和image——新建html页面取名demo1 (推荐设置:工具——选项——可以设置下字体和颜色:文本编辑器——把常用的几种语言设上行号颜色提示) 什么是Javascript ? Javascript 是一种脚本语言,是一种脚本语言,结构简单,使用方便,其代码可以直接放入HTML文档中,可以直接在支持

JSP第七次课:实现商品管理功能

相关知识: JSP+JavaBean开发模式 一.商品信息添加"商品类别"项 1.数据库添加商品类别项 2.JavaBean中添加商品类别项 四.实现商品更新功能 1.商品信息添加功能实现 (1)商品信息添加页面设计g_add.jsp <%@ pagecontentType="text/html;charset=utf-8" pageEncoding="utf-8"%> <%@ pageimport="mybean.*