Java 核心技术丛书 卷I 学习心得

2024-04-10 18:58

本文主要是介绍Java 核心技术丛书 卷I 学习心得,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1
大多数程序员使用自顶向下 和自底向上相结合的策略来解决程序设计的问题。在过程化的程序设计中,确定过程的手段和OOP中确定方法的方式基本一样,即察看问题描述中的动词或动作。而在OOP中最重要区别是 首先从项目中分离出类,然后再找出类中需要定义哪些方法。除此之外,传统的过程和OOP方法的另一个重要的区别是:在OOP中,每个方法都与负责执行这个操作的类相关联。
2
一个对象变量并没有实际包含一个对象,而仅仅是引用一个对象
3
字符串 常量既可以当作Date类和String类的实例对象,不必再使用new分配空间!
4   
Public class Math
{
Public static final double PI = 3.1415926;
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
{
如果关键字Static被省略, PI就成了Math类的一个实例域。即需要用Math类的对象来访问PI。
5
方法用于操作对象以及存取它们的实例域,所以非构造方法,包含有两个参数,第一个参数被称为隐式 参数,是出现在方法名前的类对象;第二个参数位于方法后面括号中的数值,是一个显式参数。详情请见 java 核心技术丛书系列 I.           P105
6
每一个类可以有一个 main 方法。这是对类进行单元测试时的一个常用技巧。
7
注意下面两段代码的区别:,特别是关于对象最好不要在方法中返回,应该使用克隆,
请见 java 核心技术丛书卷IP107
Class Employee
{
Public Date getHireDay()
{
Return hireday;
}
,,,,,,,,,,,,,,,,,
Private Date hireday;
}
//
Class Employee
{
Public Date getHireDay()
{
Return (Date) hireday;
}
,,,,,,,,,,,,,,,,,
Private  hireday;
}
8
Java 允许重载任何方法,而不仅仅是构造器方法。因此,要完整的描述一个方法,需指出方法名以及参数的类型和个数。这叫做方法的签名(sagnature)
9
如果在构造中没有显式地给域赋予初值,它就会被自动的默认为被自动地赋予为默认值;数值为零,布尔值为false ,对象引用为null; 然而只有缺少编程经验的人才会这样做。确实,如果没有对域进行初始化,那就会影响程序的可读性。请见P120
10
类存储在文件系统的子目录中,类的路径必须与包名(其实也是一种路径)匹配。
11
类设计技巧:
特别注意的几点是:
1         不要在类中使用过多的基本数据类型。即用其他的类替代多个相关的基本数据类型的使用。例如,用一个称为Address的类代替下面的Customer类中的实例域:
Private String street;
Private String city;
Private String state;
Private int zip;
2         使用标准格式进行类的定义
公有访问特性部分
包作用域访问特性部分
私有访问特性部分
在每一部分中,应该按照下列顺序列出:
实例方法
静态方法
实例域
静态域
       3   类名和方法要能够体现它们的职责
12
今天在调试程序的时候,犯了这样一个低级错误,T.java文件中,两个类,由于前一个类的最后边的大括号跑到了整个程序的最后,导致程序编译的时候没有发现少括号的现象,而是两个类编在了一起,编译器不能找到后面哪一个类。
13 Java 核心技术丛书卷 I   P227
为了使一个函数能够返回多个数值,使用面向对象的手段。
函数只返回一个实例对象,这个对象中已经初始化了多个实例域。当然在这个对象的类的设计中,要有能够取出这几个值得方法,就是get*( )方法。
14 Java 核心技术丛书卷 I   P241 7-2 程序  
public CenteredFrame()
{
// get screen dimensions
Toolkit kit = Toolkit.getDefaultToolkit();
Dimension screenSize = kit.getScreenSize();
int screenHeight = screenSize.height;
int screenWidth = screenSize.width;
// center frame in screen
setSize(screenWidth / 2, screenHeight / 2);
setLocation(screenWidth / 4, screenHeight / 4);
// set frame icon and title
Image img = kit.getImage("icon.gif");
setIconImage(img);
setTitle("CenteredFrame");
}
setTitle ()方法可以看出 学习使用一个新类,需要掌握它所继承的所有类的特性,包括各种public实例方法。因为这些方法就好比在这个类中一样,可以直接使用
15 Java 核心技术丛书卷 I   P245 7-3 程序  
public class NotHelloWorld
public static void main(String[] args)
NotHelloWorldFrame frame = new NotHelloWorldFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
class NotHelloWorldFrame extends JFrame
{
public NotHelloWorldFrame()
{
setTitle("NotHelloWorld");
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
// add panel to frame
NotHelloWorldPanel panel = new NotHelloWorldPanel();
add(panel);
}
public static final int DEFAULT_WIDTH = 300;
public static final int DEFAULT_HEIGHT = 200; 
}
NotHelloWorldFrame frame = new NotHelloWorldFrame(); 仅仅是定义初始化了一个NotHelloWorldFrame对象,此时就执行了类NotHelloWorldFrame的构造器,而构造器中不是仅有初始化实例域的功能,从此可以看出,构造器还可以使用自己和他所有基类的方法,来做很多事情。在事件处理的程序中,多见这种用法。
保留方法原名和参数,改动方法返回类型,算不算是方法的重载?
16 Java 核心技术丛书卷 I   P272 8-1 程序  
  yellowButton.addActionListener(yellowAction);
      blueButton.addActionListener(blueAction);
      redButton.addActionListener(redAction);
}
private class ColorAction implements ActionListener
public ColorAction(Color c)
backgroundColor = c;
}
public void actionPerformed(ActionEvent event)
setBackground(backgroundColor);
}
private Color backgroundColor;
}
}
yellowButton.addActionListener(yellowAction)是将事件监听器(或理解为事件响应器),加入到事件处理链的语句。很显然,如同第7章绘制图象中,paintComponet( ) 方法由执行程序自己调用一样,这里的actionPerformed()方法,也是由执行程序自己调用
17 Java 核心技术丛书卷 I   P274 中间匿名类的 程序  
public void makeButton(String acolor, final Color bfds)
{
JButton button = new JButton(acolor);
add(button);
button.addActionListener(new
ActionListener()
{
public void actionPerformed(ActionEvent event)
setBackground(bfds);
}
});       
}
public void makeButton(String acolor, final Color bfds),从内部类中访问局部变量,需要被声明为最终类型。在本例中,3次使用makeButton()方法,对应的final参数分别是Color.yellow、
Color.red 和Color.blue。三个参数经查证后发现都是静态最终类型。但是三次使用同一个方法,输入不同的最终静态实参,是可以的。
18 Java 核心技术丛书卷 I   P268
有这样一段话:为了实现Actionlistener接口,监听器类必须有一个被称为actionPerformed( )的方法,该方法接受一个ActionEvent对象参数,,,,,,,只要用户点击按钮,JBuuton对象就会创建一个ActionEvent对象,然后调用listener.actionPerformed(event)传递事件对象。
这段话,说明了为什么actionPerformed( )方法自行工作的部分原理
Java核心技术丛书卷I P244,
有这样一段话:不管何种原因,只要窗口需要重新绘图,事件处理器就会通知组件,从而引发执行所有组件的painComponent方法。在应用程序需要重新绘图的时候,这个方法将会被自动的调用,不要人为的干扰这个自动的处理过程。
19 Java 核心技术丛书卷 I   P296 8-4 程序  
class MousePanel extends JPanel
{
public MousePanel()
{
squares = new ArrayList<Rectangle2D>();
current = null;
 addMouseListener(new MouseHandler());
      addMouseMotionListener(new MouseMotionHandler());
}
从以上加粗 两行代码,体会消息机制;只要严格按照固定模式书写 addMouseListener等函数,监听器类,加入消息队列,那么系统消息映射机制,如同VC++,自动找到名为 MouseListener等的监听器类,并予以执行。
20 Java 核心技术丛书卷 I   P306 8-5 程序
---------------- 研究 1
add(new JButton(yellowAction));
add(new JButton(blueAction));
add(new JButton(redAction));
InputMap imap = getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
imap.put(KeyStroke.getKeyStroke("ctrl Y"), "panel.yellow");
imap.put(KeyStroke.getKeyStroke("ctrl B"), "panel.blue");
imap.put(KeyStroke.getKeyStroke("ctrl R"), "panel.red");
// associate the names with actions
ActionMap amap = getActionMap();
amap.put("panel.yellow", yellowAction);
amap.put("panel.blue", blueAction);
amap.put("panel.red", redAction);
// associate the names with actions 告诉我们,纠正一下,将事件源 与事件响应,在这里是动作响应相关联,是add( ), amap.put( ), addMouseListener( )等方法的初衷,一种绑定机制!!
 
20 Java 核心技术丛书卷 I   P306 8-5 程序
                                  ---------------- 研究 2
makeButton("Yellow",Color.YELLOW);
makeButton("Red",Color.red);
makeButton("Blue",Color.blue);
/*********************************************
add(new JButton(yellowAction));
add(new JButton(blueAction));
add(new JButton(redAction));
**************************************************/
两段代码实现了同样的功能。但是第二种做法的原因是:
Swing提供了一种非常实用的机制来封装命令,并将它们 连接到多个事件源,这就是Action接口,,,,,,,,Action接口扩展于ActuinListener接口,因此可以在任何需要使用ActionListener对象的地方使用Action对象。
21 Java 核心技术丛书卷 I   P310 8-6 程序
                                 
仔细解读前后两个监听器的作用,和相互间的关联!在监听器中还可以继续实例对象,而通过实例对象,相当于执行了某个构造方法,那么在这个构造方法中,还可以继续写入代码,在本例中,继续将此新打开的框架和它的监听器绑定。
这就实现了,多个事件源都绑定一个事件监听器的效果,可以同时关闭所有的窗口。
22 Java 核心技术丛书卷 I   P326 9-1 程序
采用,start lastCommand两个实例域,协调InsertAction 和CommandAction之间相互影响,牵制的关系;从而实现,计算器的功能算法。这种方法是值得借鉴的。
23 Java 核心技术丛书卷 I   P332 9-2 程序
public TextTestFrame()
setTitle("TextTest");
DocumentListener listener = new ClockFieldListener();
JPanel panel = new JPanel();
panel.add(new JLabel("Hours:"));
hourField = new JTextField("12", 3);
panel.add(hourField);
hourField.getDocument().addDocumentListener(listener);
panel.add(new JLabel("Minutes:"));
minuteField = new JTextField("00", 3);
panel.add(minuteField);
minuteField.getDocument().addDocumentListener(listener);
add(panel, BorderLayout.SOUTH);
clock = new ClockPanel();
add(clock, BorderLayout.CENTER);
pack();
}
仔细研究,所有的add 或add 家族函数的作用
 panel.add(new JLabel("Hours:"));
 panel.add(hourField);
是默认流布局模式,一行中加入组件,
 hourField.getDocument().addDocumentListener(listener);
是将文本变化域组件和事件监听器绑定
add(panel, BorderLayout.SOUTH);
/是将流布局模式中一行的全部组件作为整体,加入到边界布局模式中的SOUTH。
 add(clock, BorderLayout.CENTER);
/将时钟绘图,作为一个部分,加入到BorLayout.CENTER。
24 Java 核心技术丛书卷 I   P372 9-10 程序
class PermutationSpinnerModel extends AbstractSpinnerModel
{
/**
Constructs the model.
@param w the word to permute
*/
public PermutationSpinnerModel(String w)
{
word = w;
}
public Object getValue()
{
return word;
}
public void setValue(Object value)
{
if (!(value instanceof String))
throw new IllegalArgumentException();
word = (String) value;
fireStateChanged();
}
public Object getNextValue()
{,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
JSpinner组件,在增减及显示文本框内的字符,是怎样自动调用getValue( ),setValue( )等方法的,还需要以后慢慢体会学习底层机制!!
25 Java 核心技术丛书卷 I   P360 9-7 程序
setLayout(new GridLayout(2, 1));
add(panel);
add(pane2);
class ColorAction extends AbstractAction
public ColorAction(String name, Icon icon, Color c)
{ ,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,
这是我自己将setLayout(new GridLayout(2, 1)); add(panel); add(pane2);这三条语句从方法体中转移出来,结果编译出来了很多错误!
看似简单,实则深刻,我并没有吃透最基本的面向对象的基本编程模式!!!!
这样做,编译器把这三种方法,当成是重新定义的,所以产生需要 标志符,返回类型等编译错误!切记,在类体中不允许使用方法,使用实例域,只能 在特定的方法体中进行!
 在类体中的行为,两大模式,就是定义方法,定义实例域, 注意全部是定义行为
26 最终的布局还是有 LayoutManager (布局管理器)来做
setSize ()没用是因为最终的布局还是有 LayoutManager 来做,你可以看一下 LayouManager 中的布局方法。  
 
对于此类问题简单的做法:(你可以试试)  
 
setPreferedSize() 方法,如果不行,再加上 setMaximumSize() setMinimumSize(), 这几个方法的参数都是你想要的那个 size 值。
经调试, setPreferedSize() 方法是可行的,可以适当控制面板的大小,将组件加入面板中,也就实现了避免因插入图片太大导致的界面缩放严重!!
27 用网格组布局,组件横跨两列一行,不能设置setFill(GBC.BOTH),这样的话就冲突了,导致横跨无效!
diTiePanel.add(jingCheng, new GBC(0, 0, 2, 1).setWeight(100, 100).setInsets(2,2,2,2));
28
1         java怎样调用单个文件 ?
2         内部类和子类是完全不同的两个概念,一种是继承,一种是封装
内部类好比方法一样,可以直接访问外围类的实例域,而子类就不行了!!!!
经多次实验证明,只有这种方法可用:比如A文件调用 B文件(以下简称A或 B) 。
只有当将B package到一个包(即文件夹)下,并且A和此文件夹是同一级别,就是说A和B不在同一文件夹;
这样,才能使用 import 文件夹。B
29 将当前类作为监听器,需要实现 ActionListener( 接口 )
button1.addActionListener(this);
就是把当前的类设成button1的Listener;
那么就可以在当前的类中添加方法以响应button1的点击,比如:
void actionPerformed(ActionEvent e)
{
//响应button1的点击的代码;
}
public void actionPerformed(ActionEvent e) 是在ActionListener(接口)中定义的方法,框架都不能动;
而你的那个类(this)应该是有实现了ActionListener这个接口的吧;
所以方法的框架Java都帮你写好了,你只要在这个方法中加进你要实现的代码就可以了,现在lz不用太去深入他的机制,等你学深了之后就会慢慢明白的了;
30 不要方法中定义内布类,除非是匿名内部类,否则系统不予识别
 
 
31
    private class HireListener implements ListSelectionListener{
       public void valueChanged( ListSelectionEvent e){
             if (!e.getValueIsAdjusting()){
                 JList cb = (JList) e.getSource();
                 String newSelection = (String) cb.getSelectedValue();
                shouArray.add(newSelection);
                 vv.addElement(newSelection);
                 list4 = new JList(vv);
                 scrollPane22.setViewportView(list4)
             }
         }
    }
scrollPane22.setViewportView(list4) ,可以看出, Jcompoent组件中的,属性方法凡是以“set”开头的,似乎都可以调用窗口重画的功能,这样就可以实现监听器的动作能够及时显示出来。
 
32
   因为已经在环境变量里设置了java开发环境路径,那么在电脑所有的硬盘所有的目录下,都可以使用javac ,java 等编译命令!
  那么,我可以在DOS命令行里 cd进入,eclipse设置的工作空间,在这里是 L:/workspace。编译任何一个想编译的文件。
好处:可以通过测试 在命令行中,System.put.print()与否有输出,测试是否执行某段语句!

这篇关于Java 核心技术丛书 卷I 学习心得的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/891867

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定