一、第一章
1.新建一个项目
2.新建一个包
命名规则:反转域名命名法
3.新建一个类
4.代码编写
5.编译运行
注意:
一个项目有若干个包组成;
一个包有若干个类组成;(类分为:自定义类、系统提供类)
一个类由若干个方法组成;(仅有一个主方法)
一个方法有若干个语句组成;
6.输入语句
Scanner scanner=new Scanner(System.in);
7.Unicode字符集
8.字面值
字符的字面值:‘a’
字符串的字面值:“abc”
整形的字面值:5
9.变量
- 局部变量需初始化或赋值后才能使用;
- 实例变量可与局部变量同名;
- 局部变量中不可出现同名变量;
-
- final 数据类型 变量名 =初值
10.数组
(1).输出100以内的随机数
int[][] a=new int[3][4];
int [][]b;
for(int i=0;i<a.length;i++){
for(int j=0;j<a[i].length;j++){
a[i][j]=(int) (Math.random()*100);
}
}
b=a;for(int i=0;i<a.length;i++){ for(int j=0;j<a[i].length;j++){ System.out.print(a[i][j]+" "); } System.out.println(" "); }
//(2)
char [][] s={
{'白','日','依','山','尽'},
{'黄','河','入','海','流'},
{'欲','穷','千','里','目'},
{'更','上','一','层','楼'}
};
for(int i=0;i<4;i++){
for(int j=0;j<5;j++){
System.out.print(s[i][j]);
}
System.out.println(" ");
}
System.out.println(" ");
for(int i=0;i<5;i++){
for(int j=3;j>=0;j--){
System.out.print(s[j][i]);
}
System.out.println(" ");
}
}
/*黄河入海流
欲穷千里目
更上一层楼
更欲黄白
上穷河日
一千入依
层里海山
楼目流尽 */
11.String 字符串
String s=“abc”; 字符串引用类型等价于String s=new String (“abc”); String 类的引用
注:java数据类型两大类:八个基本数据类型,其余都是引用类型
方法是实现某种功能的代码集合
public static void get(){
.
}
二、第二章·类与对象
1.相关概念
类:描述一组具有相同属性和行为的对象。
对象:分为两个特征:状态(state)和行为(behavior)。
对象为类的模板形式
状态:描述其所具有的属性,由变量实现,定义在类中没有被static修饰的变量称为成员变量或实例变量。
行为:描述相同事物特征发生的动作,由方法实现,定义在类中没有被static修饰的方法称为成员方法或实例方法。
2.面向对象思路
- 一个问题中,涉及到哪些类,抽象出类。
- 根据类的属性和行为,设计每个类——用变量描述属性,用方法描述行为——一个类里只有两样东西:变量定义和方法定义。
- 用类生成对象。
- 用对象调用类的方法实现程序功能。
3.构造方法
- 特殊的方法——方法名和类名一致,没有返回值。
- 作用是生成对象,初始化对象。
- 构造方法可以有多个,构成重载,目的是生成多样化的对象。
- 类结构中还包含 构造代码块、静态代码块、内部类
4.对象生成的过程
Student s1=new Student( );
step1: 加载类——把Student类加载到内存,类变量、类方法进入内存
2.定义s1变量
3.new开辟空间,放入实例变量,并赋默认值
4.Student(),调用构造方法
5.赋值,右边赋值给左边,即空间首地址赋值给s1
6.s1叫做引用,空间叫做被引用对象,一般,简化说s1对象
7.当对象调用实例方法时,才会为实例方法分配入口(进入内存)
8.类变量和类方法通过类调用
9.实例方法通过对象调用
10.实例变量通过对象调用——但是,不这样做一般,所有实例变量一律私有化(private),然后提供set、get方法——封装性
5.类方法(静态方法)
静态方法只能调用静态方法与静态变量
6.数据类型分类
7.类与类库
因为系统类非常多,开发者也不同,所以造成了很多类重名
为了重名问题,设计了包的概念,把重名的类放入不同的包,所以不同包的同名的类相符不受影响
import关键字导入包
import java.util.Scanner;
import java.util.*;
java.lang这个包是默认导入的,System类属于这个包,所以用它时不用导入
8.访问修饰符
9.
- 一个文件中可以有多个类,但是只能有一个是public的。文件名必须和public的类名一致,如果都没有public,文件名可以和任何一个类名一致
- 一个类的修饰符,可以用public和默认,不可用private和protected,只有内部类可以用这两个
- 每个类编译之后,都会生成一个class字节码文件
-
10.继承
-子类是父类功能的扩展
-子类是父类的代码复用
11.抽象类及其子类
- 包含一些共有的属性和行为与子类都有但具体实现不同的方法(称为抽象方法) 所组成的类,称为抽象类。
- 父类抽象的方法必须要求所继承它的子类来实现
- 抽象父类是一个管理者,负责统一管理子类。
- 若当所有的子类已经部署完毕后,发现某属性遗漏,可直接通过在其抽象父类中添加后,所有子类都会被继承。
- 抽象类的特点: 抽象类和抽象方法必须用abstract修饰、抽象类不能被实例化、抽象类中有构造方法用于子类实例化使用、如果一个类继承了抽象类,那个继承它的子类要么是抽象类,要么实现所有抽象方法。
12.多态
必要条件:1.有继承关系 2.子类覆盖父类的方法 3.父类指向子类
**上转型:**
Weapon[] weapons={new Tank("坦克",100),new Plane("飞机",500),new QianTing("潜水艇",1000,6000)};
for(int i=0;i<weapons.length;i++)
{
weapons[i].attack();
weapons[i].move();
}
**向下转型:**
if(weapons[0] instanceof Tank){
Tank tank=(Tank) weapons[0];
tank.attack(60);
}
- 常见问题汇总
1.抽象类必须要有抽象方法吗?
不需要,抽象类不一定非要有抽象方法。
2.普通类和抽象类有哪些区别?
普通类不能包含抽象方法,抽象类可以包含抽象方法。
抽象类不能直接实例化,普通类可以直接实例化。
13.接口
- 地位与类同级
- 为了弥补单继问题,支持多重实现
- 接口中的变量都为常量,方法都为抽象方法
- 接口是提供某种服务或者功能的,一个类实现了这个接口,就代表具备了某种功能或者服务(如:一个人拿到了证书就具备了某种能力;银行开通某种服务等 )。
- 一个类实现了某个接口就表示具备有这个接口所描述的方法,若不实现则可定义为抽象类;
- 接口与实现接口的类没有直接关系,但父类与子类是有关系的,必须为同类;
14.
//一、
btnNewButton.addMouseListener(new listener());
> class listener implements MouseListener{
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
}`
//二、
btnNewButton.addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
});//生成匿名内部类
//三、
btnNewButton.addMouseListener(new MouseAdapter() {//生成匿名对象
@Override
public void mouseClicked(MouseEvent e) {
JOptionPane.showMessageDialog(null, "bbbbb", "a", HEIGHT);
}
});
15.IO输入输出流
1、数据流
硬盘和内存之间 ,10数据像流水一样来回流动
站在程序角度看 ,从内存到硬盘叫做输出 , 反之输入
2、字节流 1个字节
把数据流八位一分割 , 就形成了字节流 ,以字节为单位对文件进行读写叫做字节
FileInputStream 和FileOutputStream 以字节单位读写
BufferedInputStream 和 BufferedOutputStream 带缓冲区的读写
DateInputStream 和DateOutputStream 以数据类型为单位读写
ObjectInputStream 和 ObjectOutputStream 以对象为单位读写
3、字符流 1-3个自己 文本文件
把数据流按照字符编码格式分割 , 形成了字符流
字符编码: ACSii编码—— 8位,一个字节
unicode编码 ——统一码 2个字节 utf-8
gb2312—— 汉字编码 2个字节
编码 就是把计算机不认识的字符 ,比如字母 、数字 、汉字等用二进制表示
解码 上述编码的反过程
FileReader和 FileWriter 读写字符流文件的 会自动解码编码
16集合框架与泛型
1、集合
数组的作用是什么? 存储一组数据 int[] a = new int[5] 引用
数组缺点:必须事先指定数组大小 对象
很多情况是无法事先指定大小的——子弹的数量是无法事先指定的
集合: 存储一组数据,存储的是对象(不能存储基本数据类型) 存储的是对象的引用
2、种类
set集合 里面存放的对象是无序不重复
list集合 有序可重复
map集合 存放的是键值对
3、集合的用法
A 生成集合对象
B 往集合容器中添加对象add方法
C 需要时才能够集合容器中取出对象
Iterator it = set.iterator(); iterator叫做迭代器,专门负责从集合中取数据
List LinkedList 是用链表实现的 数据结构链表和数组的区别 list.get(1)
ArrayList 使用数组实现的 线性表和链表
Set HashSet 没有顺序
TreeSet 有顺序
这四个类都是集合容器,都可以存放对象,用法也基本相同都是collection的实现类
区别:先分出是list和set,在细分
A list集合有get方法 set没有
B java.util.ConcurrentModificationException
删除集合中的元素(对象),有两个方法:collection和iterator中都有remove方法
这两个方法都可以,但是注意,用了迭代器后,就不能再用collection的
C 集合只能存放对象的引用,如果存放基本数据类型,将会启动自动装箱,存放基本类型的包装类
java中都是类和对象,只有八个基本数据类型除外
int Integer 八种基本类型和对应的类可以实现自动转换,自动装箱、拆箱
double Double
D 集合可以存储不同类型,但是,一般不能这么做,一个集合只存储一类对象
泛型约束
ArrayList list = new ArrayList();
定义集合时一般都要加上泛型约束,控制一个集合只能存放一类对象
集合是一个容器,用来存放对象的引用——引用和对象的关系
第一,生成集合对象,设置好泛型
第二,用add方法添加对象
第三,用迭代器遍历集合
- 对自己定义的对象使用集合时如HashSet,要在类中覆盖Object类中的三个方法;
Map的使用时,可以用其keySet()方法生成其键对应的Set集合,用其可进行遍历;
17.线程
- 实现Runnable接口的线程类不能直接使用Thread类的start方法,必须把它包装成Thread类才可以,比如:
Thread t =new Thread(new MyRunnable());
t.start();
而继承Thread类的线程类可以直接调用start方法。
t.start()会导致run()方法被调用,run()方法中的内容称为线程体,它就是这个线程需要执行的工作。
用start()来启动线程,实现了真正意义上的启动线程,此时会出现异步执行的效果,即在线程的创建和启动中所述的随机性。
而如果使用run()来启动线程,就不是异步执行了,而是同步执行,不会达到使用线程的意义
————————————————
版权声明:本文为CSDN博主「smileTimLi」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_35275233/article/details/87896475