什么阶段可以开始要积累java程序代码代码

最近积累的一些java细节
最近几天一直在钻研多线程问题,因为这一块一直是弱项,之前一直近不下心来细细学习,这些天网上看了一些资料,感觉受益匪浅,在此记录一下。
昨天看到关于静态类的并发问题,开始看着挺蛋疼的,擦,静态类里面怎么可能会有并发问题,设计有问题吧,用静态类处理全局变量,找抽么@。@。于是蛋疼实验了一下,哈哈,蛮好玩的!如有错误之处,欢迎指正,谢谢!
下面是代码:
首先是一个工具类,用于时间相关计算
public final class TimeUtil {&
&&& /* 这里故意声明了一个全局的calendar实例,让static方法改变这个实例(到底是实例还是句柄,待我灯下测试即知)的日期,凸显并发问题! */&
&&& private static Calendar calendar = Calendar.getInstance();&
&&&& * 根据用户输入时间获取这一年的第几天
&&&& * @param date
&&&& * @return dayOfYear
&&& public static int getDay(Date date) {&
&&&&&&& calendar.setTime(date);&
&&&&&&& return calendar.get(Calendar.DAY_OF_YEAR);&
&&&& * 根据用户输入时间获取月份
&&&& * @param date
&&&& * @return month 值为月份-1
&&& public static int getMonth(Date date) {&
&&&&&&& calendar.setTime(date);&
&&&&&&& return calendar.get(Calendar.MONTH);&
&&&& * 根据给定字符串获得对应日期
&&&& * @param str 格式 yyyy-MM-dd hh:mm:ss
&&&& * @return
&&& public static Date getTimeByStr(String str) {&
&&&&&&& SimpleDateFormat df = new SimpleDateFormat(&yyyy-MM-dd hh:mm:ss&);&
&&&&&&& Date time =&
&&&&&&& try {&
&&&&&&&&&&& time = df.parse(str);&
&&&&&&& } catch (ParseException e) {&
&&&&&&&&&&& e.printStackTrace();&
&&&&&&& }&
public final class TimeUtil {
&&& /* 这里故意声明了一个全局的calendar实例,让static方法改变这个实例(到底是实例还是句柄,待我灯下测试即知)的日期,凸显并发问题! */
&&& private static Calendar calendar = Calendar.getInstance();
&&&& * 根据用户输入时间获取这一年的第几天
&&&& * @param date
&&&& * @return dayOfYear
&&& public static int getDay(Date date) {
&&&&&&& calendar.setTime(date);
&&&&&&& return calendar.get(Calendar.DAY_OF_YEAR);
&&&& * 根据用户输入时间获取月份
&&&& * @param date
&&&& * @return month 值为月份-1
&&& public static int getMonth(Date date) {
&&&&&&& calendar.setTime(date);
&&&&&&& return calendar.get(Calendar.MONTH);
&&&& * 根据给定字符串获得对应日期
&&&& * @param str 格式 yyyy-MM-dd hh:mm:ss
&&&& * @return
&&& public static Date getTimeByStr(String str) {
&&&&&&& SimpleDateFormat df = new SimpleDateFormat(&yyyy-MM-dd hh:mm:ss&);
&&&&&&& Date time =
&&&&&&& try {
&&&&&&&&&&& time = df.parse(str);
&&&&&&& } catch (ParseException e) {
&&&&&&&&&&& e.printStackTrace();
接着是一个测试线程类
public class TestStaticThread implements Runnable {&
&&& String timeS&
&&& public TestStaticThread(String timeStr) {&
&&&&&&&&&&& this.timeStr = timeS&
&&& @Override&
&&& public void run() {&
&&&&&&& try {&
&&&&&&&&&&& //不加sleep时间效果不明显啊!&&
&&&&&&&&&&& Thread.sleep(100L);&
&&&&&&&&&&& Date time = TimeUtil.getTimeByStr(timeStr);&
&&&&&&&&&&& int day = TimeUtil.getDay(time);&
&&&&&&&&&&& int month = TimeUtil.getMonth(time);&
&&&&&&&&&&& System.out.println(&线程[& + Thread.currentThread().getName() + &]指定日期为[& + timeStr + &], & +&
&&&&&&&&&&&&&&&&&&& &经过幸苦的计算后, 得到的天数为[& + day + &], 得到的月份为[& + (month + 1) + &月]&);&
&&&&&&& } catch (InterruptedException e) {&
&&&&&&&&&&& e.printStackTrace();&
&&&&&&& }&
public class TestStaticThread implements Runnable {
&&& String timeS
&&& public TestStaticThread(String timeStr) {
&&&&&&&&&&& this.timeStr = timeS
&&& @Override
&&& public void run() {
&&&&&&& try {
&&&&&&&&&&& //不加sleep时间效果不明显啊!
&&&&&&&&&&& Thread.sleep(100L);
&&&&&&&&&&& Date time = TimeUtil.getTimeByStr(timeStr);
&&&&&&&&&&& int day = TimeUtil.getDay(time);
&&&&&&&&&&& int month = TimeUtil.getMonth(time);
&&&&&&&&&&& System.out.println(&线程[& + Thread.currentThread().getName() + &]指定日期为[& + timeStr + &], & +
&&&&&&&&&&&&&&&&&&& &经过幸苦的计算后, 得到的天数为[& + day + &], 得到的月份为[& + (month + 1) + &月]&);
&&&&&&& } catch (InterruptedException e) {
&&&&&&&&&&& e.printStackTrace();
最后是程序的入口
public class StaticTest {&
&&& public static void main(String[] args) {&
&&&&&&& TestStaticThread testStaticThread1 = new TestStaticThread(& 15:15:15&);&
&&&&&&& TestStaticThread testStaticThread2 = new TestStaticThread(& 18:45:30&);&
&&&&&&& TestStaticThread testStaticThread3 = new TestStaticThread(& 18:45:30&);&
&&&&&&& Thread t1 = new Thread(testStaticThread1, &t1&);&
&&&&&&& Thread t2 = new Thread(testStaticThread2, &t2&);&
&&&&&&& Thread t3 = new Thread(testStaticThread3, &t3&);&
&&&&&&& t1.start();&
&&&&&&& t2.start();&
&&&&&&& t3.start();&
public class StaticTest {
&&& public static void main(String[] args) {
&&&&&&& TestStaticThread testStaticThread1 = new TestStaticThread(& 15:15:15&);
&&&&&&& TestStaticThread testStaticThread2 = new TestStaticThread(& 18:45:30&);
&&&&&&& TestStaticThread testStaticThread3 = new TestStaticThread(& 18:45:30&);
&&&&&&& Thread t1 = new Thread(testStaticThread1, &t1&);
&&&&&&& Thread t2 = new Thread(testStaticThread2, &t2&);
&&&&&&& Thread t3 = new Thread(testStaticThread3, &t3&);
&&&&&&& t1.start();
&&&&&&& t2.start();
&&&&&&& t3.start();
很明显,上面的getDay()和getMonth()是有问题的!什么?你说你不相信?好吧就让结果来说明问题!
线程[t2]指定日期为[ 18:45:30], 经过幸苦的计算后, 得到的天数为[36], 得到的月份为[2月]&
线程[t1]指定日期为[ 15:15:15], 经过幸苦的计算后, 得到的天数为[36], 得到的月份为[2月]&
线程[t3]指定日期为[ 18:45:30], 经过幸苦的计算后, 得到的天数为[166], 得到的月份为[6月]&
Process finished with exit code 0&
线程[t2]指定日期为[ 18:45:30], 经过幸苦的计算后, 得到的天数为[36], 得到的月份为[2月]
线程[t1]指定日期为[ 15:15:15], 经过幸苦的计算后, 得到的天数为[36], 得到的月份为[2月]
线程[t3]指定日期为[ 18:45:30], 经过幸苦的计算后, 得到的天数为[166], 得到的月份为[6月]
Process finished with exit code 0
哈哈,果断错了有木有!!
那么,要改正很简单,有两种方法:
1、把getDay()和getMonth()设置成同步方法,即改成如下
public static synchronized int getDay(Date date)&
public static synchronized int getMonth(Date date)&
public static synchronized int getDay(Date date)
public static synchronized int getMonth(Date date)
2、把上面声明的calendar放到方法体内,即如下所示
public static int getDay(Date date) {&
&&&&&&& Calendar calendar = Calendar.getInstance();&
&&&&&&& calendar.setTime(date);&
&&&&&&& return calendar.get(Calendar.DAY_OF_YEAR);&
public static synchronized int getMonth(Date date) {&
&&&&&&& Calendar calendar = Calendar.getInstance();&
&&&&&&& calendar.setTime(date);&
&&&&&&& return calendar.get(Calendar.MONTH);&
public static int getDay(Date date) {
&&&&&&& Calendar calendar = Calendar.getInstance();
&&&&&&& calendar.setTime(date);
&&&&&&& return calendar.get(Calendar.DAY_OF_YEAR);
public static synchronized int getMonth(Date date) {
&&&&&&& Calendar calendar = Calendar.getInstance();
&&&&&&& calendar.setTime(date);
&&&&&&& return calendar.get(Calendar.MONTH);
但是第一种方法其实还是存在问题的,由于静态锁锁的是这个Class,并不是锁Object,所以如果程序别处用TimeUtile tu = new TimeUtil() 去实例化一个对象,然后一个线程去调用getDay()(用TimeUtil.getDay()),另一线程调用getMonth()(用tu.getMonth() 此处需要把getMonth()改成非静态方法,如果是静态方法是安全的!),其实还是会出现问题的!当然,我们可以重写这个类的构造方法,禁止实例化来保证安全。
而方法二有个弊端,就是如果这个工具类中方法很多,每次都Calendar calendar = Calendar.getInstance();,可能会有一点小问题,和内存相关,由于我现在还不是很清楚静态方法里面GC回收对象的机制是否和非静态方法里面的对象回收机制一样,所以不好给出结论,晚上自己再写程序试一下!
另外有一个小知识点,关于多线程的,那就是wait()方法调用后,线程会立即释放锁,但是notifyAll()只会唤醒其他在等待该锁资源而阻塞的线程,并不会释放当前拥有的锁,这一点非常关键!
此外,要特别感谢一下熔岩的博客,让我学到了不少新姿势,下面是他的关于多线程方面的专题链接:
点击打开链接
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'自学java的流程以及在哪可以找到合适新手的项目积累代码量?
现在正在跟着视频自学(伯克利的cs 61b,马士兵的java基础),同时跟着做作业,但是自学没有人给project去做,所以想请教,java自学时候熟悉了语法之后是不是就可以找项目做项目了?以及在哪可以找到合适的项目?
你是要去找真实的要上线的项目做吗?我不建议这样。完全没有真实项目经验,也没有经验丰富的人带着,很容易出问题,这样对需求方有些不负责任。你可以做些你在实际生活中碰见的问题,你可以自己想想有没有通过技术能解决的事情,自己做需求,做设计,做完成。
如果英文还可以,那么推荐University of Washington的两门java入门课:CSE142和CSE143课程网站上啥都有
已有帐号?
无法登录?
社交帐号登录Java程序员从笨鸟到菜鸟之(十六)CSS基础积累总结(上)_java那些事-爱微帮
&& &&& Java程序员从笨鸟到菜鸟之(十六)CS…
一:CSS的工作原理1.基本的CSS语法比方说,我们要用红色作为网页的背景色:用HTML的话,我们可以这样:&&&&&&&&body&bgcolor=&#FF0000&&用CSS的话,我们可以这样获得同样的效果:&&&&&&&body&{background-color:&#FF0000;}上例也向你展示了基本的CSS模型:为HTML文档应用CSS,有三种方法可供选择。下面对这三种方法进行了概括。我们建议你对第三种方法(即外部样式表)予以关注。方法1:行内样式表(style属性)为HTML应用CSS的一种方法是使用HTML属性style。我们在上例的基础之上,通过行内样式表将页面背景设为红色:&&&&&&&body&style=&background-color:&#FF0000;&&方法2:内部样式表(style元素)为HTML应用CSS的另一种方法是采用HTML元素style。比如像这样:&&&&&&&&&style&type=&text/css&&&&&&&&&&&&body&{background-color:&#FF0000;}&&&&&&&&&/style&方法3:外部样式表(引用一个样式表文件)我们推荐采用这种引用外部样式表的方法。外部样式表就是一个扩展名为css的文本文件。跟其他文件一样,你可以把样式表文件放在Web服务器上或者本地硬盘上。导入语法:&&&&&link rel=&stylesheet& type=&text/css&&href=&style/style.css&&/&&&&注意要在href属性里给出样式表文件的地址。这行代码必须被插入HTML代码的头部(header),即放在标签&head&和标签&/head&之间。就像这样:&&&&&html&&&&&&&&head&&&&&&title&我的文档&/title&&&&&&&&&&link&rel=&stylesheet&&type=&text/css&&href=&style/style.css&&/&&&&&&&&/head&&&&&&&&body&&&&&&&...&&&这个链接告诉浏览器:在显示该HTML文件时,应使用给出的CSS文件进行布局。这种方法的优越之处在于:多个HTML文档可以同时引用一个样式表。换句话说,可以用一个CSS文件来控制多个HTML文档的布局。这一方法可以令你省去许多工作。例如,假设你要修改某网站的所有网页(比方说有100个网页)的背景颜色,采用外部样式表可以避免你手工一一修改这100个HTML文档的工作。采用外部样式表,这样的修改只需几秒钟即可搞定——修改外部样式表文件里的代码即可。然后,把这两个文件放在同一目录下。记得在保存文件时使用正确的扩展名(分别为“htm”和“css”)。二:颜色与背景前台页面背景和颜色主要包括下面内容:·&·&·&·&·&·&·&前景色:‘color’属性CSS属性color用于指定元素的前景色。例如,假设你要让页面中的所有标题(headline)都显示为深红色,而这些标题采用的都是h1元素,那么可以用下面的代码来实现把h1元素的前景色设为红色。&&&&&&&h1&{&&&&&&&&color:&#ff0000;&&&&}CSS属性background-color用于指定元素的背景色。因为body元素包含了HTML文档的所有内容,所以,如果要改变整个页面的背景色的话,那么为body元素应用background-color属性就行了。你也可以为其他包含标题或文本的元素单独应用背景色。在下例中,我们为body和h1元素分别应用了不同的背景色。&&&&&&&body&{&&&&&&&&background-color:&#FFCC66;&&&&}&&&&h1&{&&&&&&&&color:󱬰&&&&&&&&background-color:&#FC9804;&&&&}注意:我们为h1元素应用了两个CSS属性,它们之间以分号(“;”)分隔。CSS属性background-image用于设置背景图像。如果要把这个蝴蝶的图片作为网页的背景图像,只要在body元素上应用background-image属性、然后给出蝴蝶图片的存放位置就行了。&&&&&&&body&{&&&&&&&&background-color:&#FFCC66;&&&&&&&&background-image:&url(&butterfly.gif&);&&&&}&&&&h1&{&&&&&&&&color:󱬰&&&&&&&&background-color:&#FC9804;&&&&}注意我们指定图片存放位置的方式:url(&butterfly.gif&)。这表明图片文件和样式表存放在同一目录下。你也可以引用存放在其他目录的图片,只需给出存放路径即可(比如url(&../images/butterfly.gif&));此外,你甚至可以通过给出图片的地址来引用因特网(Internet)上的图片(比如url(&http://www.html.net/butterfly.gif&))。平铺背景图像[background-repeat]下表概括了background-repeat的四种不同取值。值描述示例background-repeat:repeat-x图像横向平铺background-repeat:repeat-y图像纵向平铺background-repeat:repeat图像横向和纵向都平铺background-repeat:no-repeat图像不平铺例如,为了避免平铺背景图像,代码应该这样:&&&&&&&body&{&&&&&&&&background-image:&url(&butterfly.gif&);&&&&&&&&background-repeat:&no-&}固定背景图像[background-attachment]CSS属性background-attachment用于指定背景图像是固定在屏幕上的、还是随着它所在的元素而滚动的。一个固定的背景图像不会随着用户滚动页面而发生滚动(它是固定在屏幕上的),而一个非固定的背景图像会随着页面的滚动而滚动。下表概括了background-attachment的两种不同取值。你可以点击示例察看二者的区别。值描述示例background-attachment:scroll图像会跟随页面滚动——非固定的background-attachment:fixed图像是固定在屏幕上的例如,下面的代码将背景图像固定在屏幕上。&&&&&&&body&{&&&&&&&&background-image:&url(&butterfly.gif&);&&&&&&&&background-repeat:&no-&&&&&&&&background-attachment:&&&&&}放置背景图像[background-position]缺省地,背景图像将被放在屏幕的左上角。但是,你可以通过CSS属性background-position来修改这一缺省设置,将背景图像摆放在屏幕上你觉得满意的地方。设置background-position属性的值有多种方式。不过,它们都是坐标的格式。举例来说,值“100px&200px”表示背景图像将被放置在位于距浏览器窗口左边100像素、顶部200像素处。坐标可以是以百分比或固定单位(比如像素、厘米等)作为单位的值,也可以是“top”、“bottom”、“center”、“left”和“right”这些值。下表给出了一些例子。值描述示例background-position:2cm&2cm图像被放置在页面内距左边2厘米、顶部2厘米的地方background-position:50%&25%图像被放置在页面内水平居中、离顶部四分之一处background-position:top&right图像被放置在页面的右上角在下例中,背景图像被放置在页面的右下角:&&&&&&&body&{&&&&&&&&background-image:&url(&butterfly.gif&);&&&&&&&&background-repeat:&no-&&&&&&&&background-attachment:&&&&&&&&&background-position:&right&&&&&}缩写[background]CSS属性background是上述所有与背景有关的属性的缩写用法。使用background属性可以减少属性的数目,因此令样式表更简短易读。比如说下面五行代码:&&&&&&&background-color:&#FFCC66;&&&&background-image:&url(&butterfly.gif&);&&&&background-repeat:&no-&&&&background-attachment:&&&&&background-position:&right&&&&&&&如果使用background属性的话,实现同样的效果只需一行代码即可搞定:&&&&&&&background:&#FFCC66&url(&butterfly.gif&)&no-repeat&fixed&right&各个值应按下列次序来写:[background-color]&|&[background-image]&|&[background-repeat]&|&[background-attachment]&|&[background-position]如果省略某个属性不写出来,那么将自动为它取缺省值。比如,如果去掉background-attachment和background-position的话:&&&&&&&background:&#FFCC66&url(&butterfly.gif&)&no-这两个未指定值的属性将被设置为缺省值:scroll和top&left。三:字体CSS字体属性主要包括下面几个:,,,,,字体族[font-family]CSS属性font-family的作用是设置一组按优先级排序的字体列表,如果该列表中的第一个字体未在访问者计算机上安装,那么就尝试列表中的下一个字体,依此类推,直到列表中的某个字体是已安装的。有两种类型的名称可用于分类字体:字体族名称(family-name)和族类名称(generic&family)。下面来解释这两个术语。字体族名称(就是我们通常所说的“字体”)的例子包括“Arial”、“Times&New&Roman”、“宋体”、“黑体”等等。一个族类是一组具有统一外观的字体族。sans-serif就是一例,它代表一组没有“脚”的字体。你在给出字体列表时,自然应把首选字体放在前面、把候选字体放在后面。建议你在列表的最后给出一个族类(generic&family),这样,当没有一个指定字体可用时,页面至少可以采用一个相同族类的字体来显示。下面是一个按优先级排列的字体列表的例子:&&&&h1&{font-family:&arial,&verdana,&sans-}&&&&h2&{font-family:&&Times&New&Roman&,&}h1标题将采用Arial字体显示。如果访问者的计算机未安装Arial,那么就使用Verdana字体。假如Verdana字体也没安装的话,那么将采用一个属于sans-serif族类的字体来显示这个h1标题。注意我们为“Times&New&Roman”采用的写法:因为其中包含空格,所以我们用引号将它括起来。字体样式[font-style]CSS属性font-style定义所选字体的显示样式:normal(正常)、italic(斜体)或oblique(倾斜)。在下例中,所有h2标题都将显示为斜体。&&h2&{font-family:&&Times&New&Roman&,&&font-style:&}字体变化[font-variant]CSS属性font-variant的值可以是:normal(正常)或small-caps(小体大写字母)。small-caps字体是一种以小尺寸显示的大写字母来代替小写字母的字体。不太明白?我们来看几个例子:如果font-variant属性被设置为small-caps,而没有可用的支持小体大写字母的字体,那么浏览器多半会将文字显示为正常尺寸(而不是小尺寸)的大写字母。&&&&h1&{font-variant:&small-}&&&&h2&{font-variant:&}字体浓淡[font-weight]CSS属性font-weight指定字体显示的浓淡程度。其值可以是normal(正常)或bold(加粗)。有些浏览器甚至支持采用100到900之间的数字(以百为单位)来衡量字体的浓淡。&&&&p&{font-family:&arial,&verdana,&sans-}&&&&td&{font-family:&arial,&verdana,&sans-&font-weight:&}字体大小[font-size]字体的大小用CSS属性font-size来设置。字体大小可通过多种不同单位(比如像素或百分比等)来设置。在本教程中,我们将关注于最常用和最合适的单位。比如:&&&&h1&{font-size:&30}&&&&h2&{font-size:&12}&&&&h3&{font-size:&120%;}&&&&p&{font-size:&1}上面四种单位有着本质的区别。‘px’和‘pt’将字体设置为固定大小,而‘%’和‘em’允许页面浏览者自行调整字体的显示尺寸缩写[font]CSS属性font是上述各有关字体的CSS属性的缩写用法。比如说下面四行应用于p元素的代码:&&&&&&&p&{&&&&&&&&font-style:&&&&&&&&&font-weight:&&&&&&&&&font-size:&30&&&&&&&&font-family:&arial,&sans-&&&&}如果用font属性的话,上述四行代码可简化为:&&&&&&&p&{font:&italic&bold&30px&arial,&sans-&}font属性的值应按以下次序书写:font-style&|&font-variant&|&font-weight&|&font-size&|&font-family四:文本文本主要包括下列CSS属性:.,,,.文本缩进[text-indent]CSS属性text-indent用于为段落设置首行缩进,以令其具有美观的格式。在下例中,我们为采用p元素的段落应用了30像素的首行缩进。&&&p&{text-indent:&30}文本对齐[text-align]CSS属性text-align与HTML属性align的功能相同。该属性的值可以是:left(左对齐)、right(右对齐)或者center(居中)。除了上面三种选择以外,你还可以将该属性的值设为justify(两端对齐),即伸缩行中的文字以左右靠齐。报刊杂志经常采用这种布局。在下例中,标题(th)中的文字被设置为右对齐,而表中数据(td)&被设置为居中。正常的文本段落被设置为两端对齐。&&&&th&{text-align:&}&&&&td&{text-align:&}&&&&p&{text-align:&&}文本装饰[text-decoration]CSS属性text-decoration令我们可以为文本增添不同的“装饰”或“效果”。例如,你可以为文本增添下划线、删除线、上划线等等。在接下来的例子中,我们为h1标题增添了下划线,为h2标题增添了上划线,为h3标题增添了删除线。&&&&h1&{text-decoration:&}&&&&h2&{text-decoration:&}&&&&h3&{text-decoration:&line-}字符间距[letter-spacing]CSS属性letter-spacing用于设置文本的水平字间距。我们可以把期望的字间距宽度作为这个属性的值。例如,假如你希望p元素里的文本段落的字间距为3个像素,而h1标题的字间距为6个像素,代码可以这样写:&&h1&{letter-spacing:&6&}&p&{letter-spacing:&3}文本转换[text-transform]CSS属性text-transform用于控制文本的大小写。无论字母本来的大小写,你可以通过该属性令它首字母大写(capitalize)、全部大写(uppercase)或者全部小写(lowercase)。比如,单词“headline”在展现给网页浏览者时,可以是“HEADLINE”或者“Headline”。text-transform属性有四个可选值:capitalize将每个单词的首字母转换为大写。uppercase所有字母都转换为大写。lowercase所有字母都转换为小写none不作任何转换——文本怎么写的就怎么显示。五:链接在前面讲到的属性也可以应用到链接上(比如修改颜色、字体、添加下划线等)。但不同的是,CSS允许你根据链接是未访问的、已访问的、活动的、是否有鼠标悬停等分别定义不同的属性。这样,我们便可为网站增添奇特而有用的效果。你需要通过伪类(pseudo-class)来控制这些效果。伪类是什么?伪类(pseudo-class)令你可以在为HTML元素定义CSS属性的时候将条件和事件考虑在内。我们来看一个例子。正如你所知道的,在HTML里,链接是通过a元素来定义的。因此,在CSS里,我们可以将a作为一个选择器&&a&{color:&}一个链接可以有不同的状态。例如,它可以是已访问过的,也可以是未访问过的。你可以通过伪类分别为访问过的链接和未访问过的链接设置不同的样式。a:link&{color:&}a:visited&{color:&}为未访问过的链接和已访问过的链接分别使用伪类a:link和a:visited。活动的链接对应的伪类为a:active,有鼠标悬停的链接对应的伪类为a:hover。伪类:&active伪类:active用于活动的链接(即获得当前焦点的链接)。a:active&{background-color:&#FFFF00;}&&&伪类:&hover用于有鼠标悬停的链接。如果你要当鼠标光标移到链接上时将链接显示为橙色斜体,那么CSS可以这样写:&&&&a:hover&{color:&&&&&&&&&font-style:&&}如何去掉链接的下划线是一个常见的问题。&&&&&&&a&{text-decoration:}六:元素的分类与标识(class和id)1.用class对元素进行分类我们希望白葡萄酒的链接全部显示为黄色,红葡萄酒的链接全部显示为红色,其余的链接显示为缺省的兰色。为了实现这一要求,我们将链接分为两类。对链接的分类是通过为链接设置HTML属性class实现的。参加如下代码:&&&&&&&&p&制造白葡萄酒的葡萄:&/p&&&&&&ul&&&&&&li&&a&href=&ri.htm&&class=&whitewine&&雷司令(Riesling)&/a&&/li&&&&&&li&&a&href=&ch.htm&&class=&whitewine&&夏敦埃(Chardonnay)&/a&&/li&&&&&&li&&a&href=&pb.htm&&class=&whitewine&&白比诺(Pinot&Blanc)&/a&&/li&&&&&&/ul&&&&&&p&制造红葡萄酒的葡萄:&/p&&&&&&ul&&&&&&li&&a&href=&cs.htm&&class=&redwine&&卡百内索维农(Cabernet&Sauvignon)&/a&&/li&&&&&&li&&a&href=&me.htm&&class=&redwine&&墨尔乐(Merlot)&/a&&/li&&&&&&li&&a&href=&pn.htm&&class=&redwine&&黑比诺(Pinot&Noir)&/a&&/li&&&&&&/ul&然后,我们就可以为白葡萄酒和红葡萄酒的链接分别应用不同的风格了。a&{color:&}a.whitewine&{color:&#FFBB00;}a.redwine&{color:󃔀&}如上例所示,你可以通过在样式表里利用.classname来为属于某一类的元素定义CSS属性。利用id标识元素除了可以对元素进行分类以外,你还可以标识单个元素。这是通过HTML属性id实现的。HTML属性id的特别之处在于,在同一HTML文档中不能有两个具有相同id值的元素。文档中的每个id值都必须是唯一的。在其他情况下,你应该使用class属性。下面,我们来看一个使用id属性的例子:&h1&id=&c1&&第1章&/h1&&...&h2&id=&c1-1&&第1.1节&/h2&&&&...&h2&id=&c1-2&&第1.2节&/h2&假如我们要求第1.2节显示为红色,那么CSS可以这样写:&&&&&&&#c1-2&{&&&&&&&&color:&&&&&}如上例所示,你可以在样式表里通过#id为特定元素定义CSS属性。顶16
点击展开全文
分享java开发中常用的技术,分享软件开发中各种新技术的应用方法。每天推送java技术相关或者互联网相关文章。关注“java那些事”,让自己做一个潮流的java技术人!《java程序员由笨鸟到菜鸟》系列文章火热更新中。
您的【关注和订阅】是作者不断前行的动力
本站文章来自网友的提交收录,如需删除可进入
删除,或发送邮件到 bang@ 联系我们,
(C)2014&&版权所有&&&|&&&
京ICP备号-2&&&&京公网安备34}

我要回帖

更多关于 java程序代码 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信