Java学习
数据类型
-
基本类型
1)数值类型(byte 1字节,short 2字节,int 4字节,long 8字节,float 4字节,double 8字节,char 2字节)//java.lang.Byte //java.lang.Short //java.lang.Integer //java.lang.Long //java.lang.Float //java.lang.Double //java.lang.Character public class StudyTest {public static void main(String[] args) {System.out.println("基本类型:byte 二进制位数:" + Byte.SIZE);System.out.println("包装类:java.lang.Byte");System.out.println("最小值:Byte.MIN_VALUE=" + Byte.MIN_VALUE);System.out.println("最大值:Byte.MAX_VALUE=" + Byte.MAX_VALUE);} }
2)布尔类型(true,false 占1位)
-
引用类型(统一 4字节)
1)类
2)接口
3)数组
类型转换
低 ------------------------------------> 高
byte,short,char—> int —> long—> float —> double
- 自动类型转换(隐式转换):容量小的数据类型可以自动转换为容量大的数据类型
- 强制类型转换(显式转换):在有可能丢失信息的情况下进行的转换 格式:(数据类型)变量
变量命名规范
- 所有变量、方法、类名:见名知意
- 类成员变量:首字母小写和驼峰原则 : monthSalary
- 局部变量:首字母小写和驼峰原则
- 常量:大写字母和下划线:MAX_VALUE
- 类名:首字母大写和驼峰原则: Man, GoodMan
- 方法名:首字母小写和驼峰原则: run(), runRun()
运算符
位运算符,右移一位相当于除2取商,左移一位相当于乘2
【常见面试题:int a=2*8怎样运算效率最快?】
public static void main(String[] args) { System.out.println(2 << 3);
}
流程控制
交互Scanner
Scanner scanner = new Scanner(System.in);
//凡是属于IO流的类如果不关闭会一直占用资源.要养成好习惯用完就关掉
scanner.close();
顺序结构
选择结构
if...else if...else
switch...case
循环语句
while
do...while //循环体至少执行一次
for(注重增强for循环)
break && continue
break 主要用在循环语句或者 switch 语句中,用来跳出整个语句块。
continue 适用于任何循环控制结构中。作用是让程序立刻跳转到下一次循环的迭代
方法
方法定义
修饰符 返回值类型 方法名(参数类型 参数名){ ... 方法体 ... return 返回值;
}
Java中只有值传递!
方法重载
1.方法名必须相同
2.参数列表必须不同(个数不同,或类型不同,参数排列顺序不同)
可变参数
//在指定参数类型后加一个省略号(...)
//一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。
public static void printMax( double... numbers) { if (numbers.length == 0) { System.out.println("No argument passed"); return; }
递归
递归就是:A方法调用A方法!就是自己调用自己,因此我们在设计递归算法时,一定要指明什么时候自
己不调用自己。否则,就是个死循环!
数组
数组的基本特点:
- 长度是确定的。数组一旦被创建,它的大小就是不可以改变的。
- 元素必须是相同类型,不允许出现混合类型。
- 数组中的元素可以是任何数据类型,包括基本类型和引用类型。
Java内存:
- 堆:存放new的对象和数组
- 栈:存放基本变量类型,引用对象的变量
- 方法区:包含了所有的class和static变量
三种初始化
//静态初始化(定义数组的同时分配空间和赋值)
int[] a={1,2,3};
//动态初始化(定义数组并分配空间)
int[] b=new int[2];
//默认初始化
数组下标合法区间:[0,length-1],ArrayIndexOutOfBoundsException : 数组下标越界异常!
Arrays类
数组的工具类java.util.Arrays
具有以下常用功能:给数组赋值:通过 fill 方法。对数组排序:通过 sort 方法,按升序。比较数组:通过 equals 方法比较数组中元素值是否相等。查找数组元素:通过 binarySearch 方法能对排序好的数组进行二分查找法操作。
面向对象
OOP详解
1.面向对象编程的本质就是:以类的方式组织代码,以对象的组织(封装)数据。
2.面向对象的思维模式说白了就是分类思维模式。
break和return的区别:
return 语句的作用
(1) return 从当前的方法中退出,返回到该调用的方法的语句处,继续执行。
(2) return 返回一个值给调用该方法的语句,返回值的数据类型必须与方法的声明中的返回值的类型一致。
(3) return后面也可以不带参数,不带参数就是返回空,其实主要目的就是用于想中断函数执行,返回调用函数处。
break 语句的作用
(1)break在循环体内,强行结束循环的执行,也就是结束整个循环过程,不在判断执行循环的条件是否成立,直接转向循环语句下面的语句。
(2)当break出现在循环体中的switch语句体内时,其作用只是跳出该switch语句体
!!!静态方法不能调用非静态方法
构造器
特点:
1.必须和类的名字相同
2.必须没有返回类型,也不能写void
作用:
1. 使用new创建对象的时候必须使用类的构造器
2. 构造器中的代码执行后,可以给对象中的属性初始化赋值
注意:默认存在无参构造,当定义了有参构造之后,要使用无参构造必须显示定义
快捷键: Alt+Insert
创建对象内存分析
封装、继承、多态
高内聚:类的内部数据操作细节自己完成,不允许外部干涉;、
低耦合:仅暴露少量的方法给外部使用。
//封装的步骤
1.使用private 修饰需要封装的成员变量。
2.提供一个公开的方法设置或者访问私有的属性(get和set方法)。
快捷键:Alt+Insert
//继承的步骤
继承:一个子类(派生类),一个父类(基类)。子类继承父类,使用关键字extends来表示
public class student extends Person{
}
查看继承关系快捷键:Ctrl+Hjava中的每一个类都是"直接" 或者 "间接"的继承了Object类。
子类继承父类之后,在子类中可以使用this来表示访问或调用子类中的属性或方法,使用super就表示访问或调用父类中的属性和方法。
不管是显式还是隐式的父类的构造器,super语句一定要出现在子类构造器中第一行代码。重写的语法(静态方法不能重写)
1. 方法名必须相同。
2. 参数列表必须相同。
3. 访问控制修饰符可以被扩大,但是不能被缩小: public protected default private。
4. 抛出异常类型的范围可以被缩小,但是不能被扩大 ClassNotFoundException ---> Exception。
5. 返回类型可以相同,也可以不同,如果不同的话,子类重写后的方法返回类型必须是父类方法返回类型的子类型。
//多态的步骤
1. 有继承关系。
2. 子类重写父类方法。
3. 父类引用指向子类对象。
static修饰符
{System.out.println("匿名代码块");}static {System.out.println("静态代码块");}public Person(){System.out.println("构造器");}
//执行顺序:静态代码块-匿名代码块-构造器(静态代码块只执行一次,匿名代码块和构造器在每次创建对象的时候都执行)
【Student类之前没有进行类加载】
1. 类加载,同时初始化类中静态的属性
2. 执行静态代码块
3. 分配内存空间,同时初始化非静态的属性(赋默认值,0/false/null)
4. 调用Student的父类构造器
5. 对Student中的属性进行显示赋值(如果有的话)
6. 执行匿名代码块
7. 执行构造器
8. 返回内存地址
abstract修饰符
public abstract class Action{ public abstract void doSomething();
}
抽象类,不能使用new关键字来创建对象,它是用来让子类继承的。
抽象方法,只有方法的声明,没有方法的实现,它是用来让子类实现的
接口
接口的作用:1.约束,只有规范2.定义一些方法,让不同的人实现(子类必须重写方法)3.声明类的关键字是class,声明接口的关键字是interface4.接口不能实例话,没有构造方法5.implements可以实现多个接口6.接口中的变量都是静态常量public interface Action{ public abstract void run(); //默认就是public abstract修饰的 void test();
}
内部类
1. 成员内部类(在A类中创建了B类)
2. 静态内部类(使用static修饰的内部类)
3. 局部内部类(在方法内部声明的类)
4. 匿名内部类new Object().method()创建的对象不需要保存到变量中
异常
异常的超类:java.lang.Throwable
Error:由Java虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关。
Exception:它表示用户程序可能捕捉的异常情况或者说是程序可以处理的异常。
StackOverflowError:当栈深度超过虚拟机分配给线程的栈大小时就会出现此error
OutOfMemoryError:JVM不再有继续执行操作所需的内存资源
ArithmeticException:算术异常
MissingResourceException:丢失资源
ClassNotFoundException:找不到类
NullPointerException:空指针异常
IllegalArgumentException:向方法传递了一个不合法或不正确的参数
ArrayIndexOutOfBoundsException:数组下标越界
UnkownTypeException:未知类型异常
java异常处理本质:抛出异常和捕获异常
//抛出异常
if(stu == null){ throw new NullPointerException();
}
//捕获异常
异常处理器 快捷键:Ctrl+Alt+Ttry -- 用于监听catch -- 用于捕获异常finally -- finally语句块总是会被执行throw -- 用于抛出异常throws -- 用在方法签名中,用于声明该方法可能抛出的异常
IO流
输入输出流分类
- 按数据流的方向不同可以分为输入流和输出流(输入流和输出流都是站在程序的角度上)
- 按照处理数据单位不同可以分为字节流(8位)和字符流(2字节)
- 按照功能不同可以分为节点流和处理流
输入流:InputStream(字节流),Reader(字符流)
输出流:OutPutStream(字节流),Writer(字符流)
节点流:可以从一个特定的数据源节点读取数据(文件、内存)
处理流:连接在已存在的流上,通过对数据的处理为程序提供更强大的读写功能
节点流类型
处理流类型
InputStream(输入流)
//读一个字节,处理一个字节。如果返回-1就说明已经到了输入流的末尾
int read() throws IOException
//读取一系列字节并存储到一个数组buffer
//返回实际读取的字节数,如果读取前已到输入流的末尾,则返回-1
int read(byte[] buffer) throws IOException
//读取length个字节,并存储到一个字节数组buffer
//返回实际读取的字节数,如果读取前以到输入流的末尾返回-1.
int read(byte[] buffer,int offset,int length) throws IOException
//关闭流释放内存资源
void close() throws IOException
IO流需要注重使用try/catch
OutputStream(输出流)
//向输出流中写入一个字节数据,该字节数据为参数b的低8位
void write(int b) throws IOException
//将一个字节类型的数组中的数据写入输出流
void write(byte[] b) throws IOException
//将一个字节类型的数组中的从指定位置(off)开始的len个字节写入到输出流
void write(byte[] b,int off,int len) throws IOException
//关闭流释放内存资源
void close() throws IOException
Reader和Writer
FileReader和FileWriter都是字符流,是以一个字符为单位进行输入和输出的,可针对中文字符在Java里面占两个字节
网络编程
网络编程的目的:直接或间接地通过网络协议与其他计算机实现数据交换,进行通讯。
网络通信协议:
-
OSI 参考模型(应用层、表示层、会话层、传输层、网络层、数据链路层、物理层)
-
TCP/IP 参考模型(应用层、传输层、网络层、数据链路层)
网络编程的两个要素:
- 提供IP和端口号
- 提供网络通信协议
IP
//InetAddress类,代表IP,代码中需要使用try/catch捕获异常
InetAddress byName2 = InetAddress.getByName("www.baidu.com"); //获得IP地址
端口号
//TCP 和 UDP 各有 65535个端口,单个协议下端口不能冲突。
//端口号与IP地址的组合,得出一个网络套接字:Socket,所以说一些网络编程也被称为Socket编程。
new InetSocketAddress("127.0.0.1",8080);
socketAddress.getHostName()
socketAddress.getAddress() //返回地址
socketAddress.getPort() //返回端口
网络通信协议
TCP/IP协议簇:
-
传输层:
用户传输协议TCP:三次握手,四次挥手,建立连接,稳定(打电话)
用户数据报协议UDP:将数据,源,目的封装成数据包,不需要建立连接,不可靠(发短信)
-
网络层:IP
GUI编程
Swing和AWT 是java开发GUI常用的技术。AWT依赖于本地系统平台,当把AWT组件开发的应用程序移植到其他平台上运行时,不能保证其外观风格;Swing开发的Java应用程序移植到其他平台上时,界面外观不改变。
AWT
使用AWT所涉及的类一般在Java.AWT包及其子包中。
Container(容器)和 Component(组件)是AWT中的两个核心类。
Frame
frame.setBackground(Color.blue); //设置窗体的背景颜色
frame.setVisible(true); //设置窗体是否可见
frame.setSize(400,400); //设置窗体的初始大小
frame.setLocation(200,200); //设置窗体出现时的位置
frame.setBounds(x,y,w,h) //设置窗体位置和大小
frame.setResizable(false); //设置窗体能否被改变大小
frame.setLayout(); //添加参数,设置布局
frame.addWindowListener //添加窗体的监听事件
frame.pack(); //将窗口调整到最佳大小
frame()使用默认的BorderLayout类布局管理器初始化,也可指定布局管理器初始化
Panel
Panel()使用默认的FlowLayout类布局管理器初始化,也可指定布局管理器初始化
布局管理器
frame.setLayout(new FlowLayout(FlowLayout.LEFT)); //FlowLayout:从左到右,流式布局(默认居中)
frame.add(buttonEast,BorderLayout.EAST); //BorderLayout:东西南北中(默认中部)
frame.setLayout(new GridLayout(3,2)); //GridLayout:表格布局
组件
(1).Button button1 = new Button("button1"); //创建按钮
(2).ScrollPane scrollPane = new ScrollPane(ScrollPane.SCROLLBARS_ALWAYS);//创建带滚动条的容器
(3).Label label = new Label("Hello JAVA");//创建一个标签
事件监听
//一个类要想成为监听类,那么必须实现ActionListener接口
class MyActionListener implements ActionListener{//重写ActionListener接口里面的actionPerformed(ActionEvent e)方法 @Override public void actionPerformed(ActionEvent e) { System.out.println("A Button has been Pressed"); }
}
输入框TextField监听
//在文本框中敲回车,TextField对象会触发Action事件
//获取文本框输入的内容
TextField tf=(TextField)e.getSource();
tf.getText()
Graphics类
//在main()方法里面并没有显示调用paint(Graphics g)方法,因为在创建Frame窗体时会自动隐式调用
鼠标事件适配器
windows事件
this.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}
});
键盘响应事件
//使用getKeyCode()方法获取按键的虚拟码,类名.静态常量名
public void keyPressed(KeyEvent e) {int keycode = e.getKeyCode();if(keycode==KeyEvent.VK_UP){System.out.println("你按下了上键");}
}
Swing
JFrame(窗体)
JFrame jf = new JFrame(title);
//在开发中通过继承java.swing.JFrame类创建一个窗体,通过this关键字调用其方法。
//在JFrame对象创建后,需要调用getContentPane()方法将窗体转换为容器,然后在容器中添加组件或设置布局管理器
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
常用的窗体关闭方式有四种:
“DO_NOTHING_ON_CLOSE”:当窗口关闭时,不做任何处理;
“DISPOSE_ON_CLOSE”:当窗口关闭时,隐藏并dispose这个窗口;
“HIDE_ON_CLOSE”:当窗口关闭时,隐藏这个窗口;
“EXIT_ON_CLOSE”:当窗口关闭时,退出程序;
JDialog(弹窗)
//弹窗默认有关闭事件,可以不写
class MyDialog1 extends JDialog{public MyDialog1() {}
}
标签
JLabel jl = new JLabel();
//获取图片地址
URL resource = ImageIconDemo.class.getResource("tx.jpg");
面板
Swing中常用面板有JPanel面板(普通面板)和JScrollPane面板(带滚动条的面板)
//如果需要在JScrollPane面板中放置多个组件,需将这多个组件放置在JPanel面板上,然后将JPanel面板作为一个整体组件添加在JScrollPane面板上
按钮
1.普通按钮(JButton) JButton jb = new JButton();
2.单选按钮(JRadioButton) ButtonGroup group = new ButtonGroup();JRadioButton jr1 = new JRadioButton("JRadioButton1");group.add(jr1);
//单选按钮是一个圆形图标,在其旁放置一些说明性文字。当用户选中某个单选按钮后,按钮组中其它按钮将被自动取消,这时就需要按钮组(ButtonGroup)来放置按钮,按钮组中的按钮只能选择一个。
3.复选框(JCheckBox) JCheckBox jrb = new JCheckBox("abc");
//复选框是一个方块图标,外加一段描述性文字。每一个复选框都提供“选中”与“不选中”两种状态
列表
1.下拉列表(JComboBox) JComboBox jComboBox = new JComboBox();jComboBox.addItem("正在热映");
2.列表框(JList) String[] name={"1","2","3"}; //静态设置Vector name = new Vector(); name.add("1"); //动态设置JList jList = new JList(name);
//列表框只是在窗体上占据固定的大小,如果要使列表框具有滚动效果,可以将列表框放入滚动面板中。
文本组件
1.文本框JTextField jt = new JTextField("aaa"); jt.setText("");
2.密码框JPasswordField jp = new JPasswordField();jp.setEchoChar('#'); // 设置回显符号
3.文本域JTextArea tArea = new JTextArea(20, 50);tArea.setText("欢迎来到西部开源学Java");
注解和反射
什么是注解
注解可以对程序做出解释,也可以被其他程序读取。格式:"@注释名",还可以添加一些参数值
内置注解
@Override 定义在java.lang.Override中,重写超类中的一个方法
@Deprecated 定义在java.lang.Deprecated中,表示不鼓励程序员使用这样的元素
@SuppressWarnings 定义在java.lang.SuppressWarnings中,用来抑制编译时的警告信息(镇压警告,需要传参)
元注解
//元注解的作用就是负责注解其他注解
@Target:用于描述注解的使用范围
@Retention:用于描述注解的生命周期 (SOURCE < CLASS < RUNTIME)
@Documented:说明该注解将被包含在javadoc中
@Inherited:说明子类可以继承父类中的注解
自定义注解
//使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口
// 格式:参数类型 参数名称();
String value();