类和面向对象编程 - 初级
1、什么是面向对象编程?
意思是交个女朋友,面对女朋友编程吗?
很多程序中的概念,实际的意思跟它表面的意思会有一些不一样。
2、假如我们要开发一个坦克大战的游戏
我们这个游戏有一些属性
当前剩余多少条命(没命的话,游戏结束,开始有3条命)
当前游戏的分数(每次杀死敌人得分)
Boss是否死亡(死亡重新开始游戏,损失一条命)
我们有一个主角(坦克)它有一些属性
等级(等级越高,攻击力越强,初始1级)
当前血量
我们有一些种类的敌人
普通敌人,铜敌人,黄金敌人
不同敌人的攻击力和血量不一样
敌人可以自己移动
交互
可以控制主角移动
可以发射子弹攻击敌人
敌人会自动追踪主角,并进行攻击
在我们写的程序有很多的代码的时候,我们可以把程序中的东西进行分类,跟主角相关的是一类,跟敌人相关的是一类,跟整个游戏相关的是一类。
通过分类可以让程序变得更加有结构。在程序中可以使用类(class)对代码进行分类,当使用类编程的时候,使用创建出来的变量称之为一个对象。这就是传说中的面向对象编程。
3、面向对象和面向过程的区别。
面向过程里面没有对象,强调的开发一个功能的步骤和过程,一步一步类,面向对象我们操作处理的是一个个的对象,(详细的每个功能的步骤和过程都封装在了类里面,通过类分类划分模块)程序更加结构化。(更加适合开发大型项目,更加便于后期的维护)
如何通俗易懂地举例说明“面向对象”和“面向过程”有什么区别?
https://www.zhihu.com/question/27468564
4、面向对象(类、对象)的三个特征:
封装、继承、多态(后面慢慢理解)
一个类表示一个类别(比如上面的例子,有主角 敌人 游戏管理系统)
通过一个类管理这个类别的所有相关的东西。比如敌人,主角
我们可以定义一个人主角类,来控制主角相关的属性和行为(方法)的管理。
这里所说的属性和行为,在我们程序中叫做成员变量、成员方法。
5、怎么定义类?
class 类名{
//成员变量(这个类有的属性)
//成员方法(这个类有哪些行为,有哪些功能)
}
6、怎么声明对象
类名 对象名;
7、定义好了类,为什么要利用类定义变量(对象)?
一个类相当于一个模板,利用模板可以生产实例。
类相当于车工厂里面的车模(模具),利用车模可以生成可以实际使用的很多辆车。
类==车模 对象==车
(敌人类 和 很多个敌人)
8、对象之间的赋值(引用的赋值)
当把一个对象当做一个方法的参数的时候
因为类是引用类型,所以在方法内修改引用类型里面的数据的时候,原引用类型里面的 数据也被修改了!
9、什么是匿名对象?
如果这个对象只使用一次的时候
10、访问修饰符 private
(项目开发中,我们开发的类不止给我们自己使用也给团队中的其他人使用)
可以修饰成员变量,可以修饰成员方法
11、封装
把不需要外界访问的属性都隐藏起来
提供方法让外界访问
优点:
让代码结构更加清晰
比较安全(编写代码不容易出错,特别是大项目)
使用:
所有属性私有化
提供getter和setter方法访问
12、关于this关键字
在类定义的时候使用
this代表当前对象
优点:
通过this区分方法参数和成员变量
通过this方便IDE给出提示(后面eclipse演示)
13、构造方法(用来构造对象的)
什么是会被调用(new的时候)
默认构造方法(只有没有任何构造方法的时候,系统才会提供默认无参的构造方法)
格式:
修饰符 类名(参数){}
类和面向对象编程 - 中级
1、static关键字(静态修饰符)
可以修饰成员变量和成员方法
可以通过对象和类来调用(调用的都是同一个)
修饰成员变量表示静态变量,静态变量是所有对象公用的,在内存中只占有一份内存
修饰成员方法表示静态方法,静态方法里面只能访问静态变量
2、static应用举例
圆类(π可以设置为static)
一个游戏中的游戏管理类(负责整个游戏的状态,只需要一个对象,可以全部设置为 static)
一个班级类(每个班级有一个所属的学校)
3、static特点
随着类的加载而加载
优先于对象存在
所有对象共享(可以通过对象或者类来访问)
main方法就是静态方法
4、使用static的地方:工具类的创建
数组工具类ArrayTool
Arrays.fill(API中关于Arrays的其他方法)
查找在数组中的位置
字符串工具类StringTool
indexOf
自己动手实现
构造方法私有化
举例
Math
5、静态代码块
放在类里面,只会执行一次(加载类的时候,就执行这个类里面的静态代码块)
static{
}
6、继承案例
老师
姓名 年龄 性别 职称 教授科目 教授班级
吃饭 睡觉 教课
学生
姓名 年龄 性别 所在班级 班级排名
吃饭 睡觉 上课
怎么继承
提取公共类
子类继承公共类(子类拥有公共类所拥有的东西)
extends XXX
7、继承的特点:
Java支持单继承不支持多继承
8、继承的优点:
减少了代码量(不是很明显)
代码变得简洁
代码变得更加容易维护(后期修改)
9、继承注意事项
一、子类继承了父类里面的成员(成员变量和成员方法)
子类不能访问父类里面的私有成员
子类对象里面拥有父类里面的私有成员变量(只是不能直接访问)
二、继承中的 “是一个”关系(人 老师 学生)
三、子类和父类里面有同名的变量,就近原则(this super)
可以通过super访问父类里面的变量、方法和构造方法
10、继承中的构造
通过子类的构造方法构造子类对象的时候,都会调用父类里面的构造方法
(对父类里面的属性初始化,不指定就调用默认的无参构造方法)
如果父类没有无参构造方法,要通过下面的调用指定的有参构造方法
怎么指定调用父类里面的那个构造方法
super(xx,xx,xx,xx);
怎么在构造方法中调用其他构造方法
this(xx,xx,xx);
注意:
通过this或者super调用构造方法的时候必须在第一条语句
11、方法重写(方法覆盖)
子类中的方法名、参数和返回值和父类相同
意义:子类跟父类拥有同样的功能,但是子类有自己的特定内容和特定实现方式。可以 定义一个不同的名字方法,但是为了见名知意,保持父类名字,自己重新实现方法体。
重写注意事项
不能重写private方法
重写的时候,访问权限不能更低(最好保持权限一致)
12、重载(overload)和重写(override)
重载:
同一个类
方法名 一样 参数 不一样 返回值 不要求
重写:
子类父类
参数 返回值 方法名 都要一样
13、final(最终的、最后的)
可以修饰类、方法、变量
final类
这个类不能被继承
final方法
修饰一个方法:表示这个方法不能被子类重写
final变量(之前说过)(变量分为成员变量和局部变量)
常量
一、字面值常量 二、自定义常量
14、Java类包(package)
当我们开发的项目很大的时候,我们会写很多很多的类,这样的话不方便管理,而且容易重名。
我们可以通过包对类进行分类管理,也可以避免重名问题。一种类型的Java类放在一个包里面,或者一个模块的Java类放在一个包里面。不同包里面可以包含同名的类, 通过包来区分。
15、怎么定义包
package xx.xx.xx;
放在class前面
包名命名规则(以域名开头)
com.sikiedu.xx;
com.sikiedu.login;
com.sikiedu.register;
com.sikiedu.course;—>
com.sikiedu.courserelease
com.sikiedu.coursecreate
—>
com.sikiedu.course.release
com.sikiedu.course.create
16、怎么划分包
可以按照功能、模块(后面具体情况具体学习)
系统举例:
java.util
java.sql
17、带包的类的编译和运行
一、编译javac -d . xxx.java (编译的时候会根据你定义的包,创建对应的文件夹目录结构)
二、运行java com.sikiedu.xxx
18、带包的类的使用
第一种方式:直接在类前面加上包
xxx.xx.xxx x = new xxx.xxx.xx();
第二种方式:
import xxx.xxx.xx.xx;
import xx.xx.xx.*;
19、内部类
把一个类定义在另一个类的内部,这个被定义在内部的类称为内部类。包含内部类的叫 做外部类。
内部类比外部类多了三个访问权限:
private protected static
为什么类只有public和default两个访问权限
因为类的作用域只有两个 包内和包外,public在包外也可以访问,default只能在包 内访问。
分类
非静态内部类(是否使用static修饰)
静态内部类
局部内部类
匿名内部类
非静态内部类
不能拥有静态成员
内部类可以访问外部类的私有成员,外部类不能访问内部类的成员。
如果内部类成员和外部类成员名相同的时候,可以通过 this 外部类.this来区分
如果内部类是private的那只能在外部类内部使用
如果是public的话,那可以在外部类外部使用 外部类.内部类 对象名;
非静态内部类对象和外部类对象的关系
你可以认为内部类对象是寄生在外部类对象里面的。外部类对象里面可以有多个寄生 虫,每个寄生虫都可以访问外部类对象的private数据,而且访问到的是一样的。
在外部类外面创建内部类:
这样对吗?
外部类.内部类 对象名 = new 外部类.内部类(); // 错误
//第一种方式
外部类.内部类 对象名 = new 外部类().new 内部类();
//第二种方式
外部类 外部类对象 = new 外部类();
内部类 对象 = 外部类对象.new 内部类();
局部内部类
把类定义在方法内部,作用域只在这个方法内有效。这个用法用的比较少
匿名内部类//JDK 8
适用于只需要使用一次的类。
通过接口或者抽象类创建匿名内部类。
20、访问权限修饰符
应用的地方:类、成员变量、成员方法
类 public default 类使用的作用域有两个 包内,包外
private成员 只能在同一个类里面访问(子类,通过对象,类外,其他包里面)
public 成员,所有地方都可以访问
类和面向对象编程 - 高级
1、继承和多态
多态:多种状态,多种形态
一个人可能是老师,可能是学生。它有两种状态。
2、为什么使用多态
主角 武器
父类对象可否调用子类里面的特有方法(强制类型转换)
3、抽象类 abstract
抽象类里面可以包含正常方法和抽象方法
抽象类可以包含构造方法,但是不能被实例化
构造方法的作用是让子类对父类里面的数据进行初始化
抽象类的子类还可以是一个抽象类(不用实现抽象方法)
抽象类的子类(正常类)必须实现抽象类中的抽象方法
抽象类声明
abstract class xxx{}
抽象方法声明
Abstract void xx(); //没有方法体
抽象类练习:
需求:公司中程序员有姓名、工号、薪水、工作内容。
项目经理除了有姓名、工号、薪水、还有奖金、工作内容。
父类:雇员
程序员
属性 姓名 工号 薪水
行为 工作
项目经理
属性 姓名 工号 薪水 奖金
行为 工作
http://blog.csdn.net/china_demon/article/details/50525362
4、接口 interface implements
接口里面只能包含抽象方法(接口是完全抽象化的类,里面没有完整的方法)
我们可以通过接口定义一个功能(其他类可以实现这个接口来拥有这个功能)
用来扩展功能
接口可以被实现,不能被继承(接口里面只是定义了一些东西,并没有可以被实际继承 的数据或者方法(属性和行为))
接口可以被抽象类实现、也可以被具体类实现
单继承 多实现
接口与接口:可以多继承(一般不这么用)
接口的定义
interface xx{}
接口的实现
class xx implements xx{}
5、抽象类和接口的关系和区别
抽象类可以包含变量、常量、具体方法、抽象方法
接口可以包含 常量和抽象方法
接口一般用来做功能扩展
6、类、抽象类、接口练习题
教练和运动员案例
乒乓球运动员和篮球运动员。
乒乓球教练和篮球教练。
为了出国交流,跟乒乓球相关的人员都需要学习英语。
请用所学知识:分析这个案例中有哪些抽象类,哪些接口,哪些具体类。
https://www.cnblogs.com/LZL-student/p/5860918.html
7、匿名内部类//JDK 8
适用于只需要使用一次的类。
通过接口或者抽象类创建匿名内部类。
Eclipse的使用
1、工具的使用(记事本 notepad++)
IDE Integrated Development Environment 集成开发环境(把各种有用的功能集成到一个工具里面,便于开发)
Eclipse
MyEclipse
2、Eclipse介绍
百度介绍:https://baike.baidu.com/item/eclipse/61703?fr=aladdin
官网 www.eclipse.org
新版本(4.7)和旧版本(3.x 4.x)下载
绿色版本和安装版本的 安装、使用和卸载
Eclipse快捷键
最常用的15大Eclipse开发快捷键技巧
https://www.cnblogs.com/mfc-itblog/p/6720977.html
alt+?或alt+/:自动补全代码或者提示代码
ctrl+shift+f:格式化代码
ctrl+page down或ctrl+page up: 选项卡之间快速切换
Alt+方向键上下:上下行交换内容或把当前行内容把上或下移动
ctrl+/:自动注释当前行或者选择的多行 (再次按下取消注释)
ctrl+shift+/:自动注释掉选择的代码块 ctrl+shift+\:取消注释
ctrl+d:删除当前行
ctrl+shift+o:自动引入包和删除无用包
快速创建getter setter方法:右键Source->Generate Getters and Setters
快速创建构造方法:右键Source->Generate Construtor…
快速重写equals方法:右键Source->Generate equals…
快速重写toString方法:右键Source->Generate tostring…
Java基础类库
1、Scanner
(1) hasNextXXX nextXXX()
3、String、StringBuffer和StringBuilder
(1) String字符串的构造(一旦被赋值不能被修改)
(2) StringBuffer和StringBuilder可以创建一个可以被修改的字符串
(3) 使用起来基本相同
(4) 不同:StringBuffer线程安全,但是性能略低。StringBuilder线程不安全但是性能略高。(什么是线程安全)
(5) 字符串的存储,在内存里面JDK9之前使用char数组存储,JDK9里面使用byte数组存储。
4、Arrays数组类
(1) sort
(2) binarySearch
5、Math
(1) PI E
(2) 三角函数相关方法
(3) round(x)四舍五入
(4) sqrt平方根
(5) pow(x,y)乘方x的y次方
(6) abs(x)绝对值
(7) ceil 向上取整
(8) floor 向下取整
(9) max(x1,x2)求最大值
(10) min(x1,x2)求最小值
(11) random()生成随机数 大于等于0,小于1
6、BigDecimal类
(1) 创建
① BigDecimal f1 = new BigDecimal(“0.05”);//首推
② BigDecimal f2 = BigDecimal.valueOf(0.01);//次推
③ BigDecimal f3 = new BigDecimal(0.05);//不推
(2) 使用
① add
② subtract
③ multiply
④ divide
7、Date、Calendar 日期和时间
(1) Date d = new Date();创建一个当前时间的日期类
(2) Calendar calendar = Calendar.getInstance();
① calendar.getTime()
基本类型包装类
1、Byte byte
2、Short short
3、Integer int
4、BigInteger可以表示任意大小的整数
5、Long long
6、Float float
7、Double double
8、Character char
9、Boolean boolean
包装类常用操作
1、基本类型数据和字符串之间的转换
2、intValue 成员方法
3、parseInt 静态方法
4、toString 静态方法
5、valueOf(int i) 静态方法
6、valueOf(String s) 静态方法
自动拆箱和装箱
1、装箱
(1) Integer i = 100;
2、拆箱
(1) i+=100;
字符包装类Character
Java集合
1、集合和数组的区别
(1) 集合可以改变长度
(2) 数组长度不可变
2、ArrayList
ArrayList al = new ArrayList();
(1) add addAll
(2) remove removeAll
(3) contains containsAll
(4) retain retainAll 求交集
(5) isEmpty
(6) toArray
3、父类List拥有的方法
(1) add(int index,Object ele)
(2) get(int index)
(3) remove(int index)
4、集合的遍历
(1) 得到数组toArray
(2) 得到遍历器iterator arrays.iterator()
(3) 高级for循环遍历 for(Object o : arrays)
5、列表(List)的特点
(1) 有序的
(2) 可重复
6、Vector列表
(1) addElement
(2) elementAt
(3) 迭代器遍历
和ArrayList区别:使用几乎相同。Vector线程安全,效率低。ArrayList线程不安全,效率高
7、LinkedList列表
(1) add
(2) addFirst
(3) addLast 等同于add
和ArrayList区别:使用几乎相同。ArrayList内部使用数组存储,访问速度较快。LinkedList使用链表,插入删除数据速度较快。
8、集合中泛型的使用
使用ArrayList al = new ArrayList();时遍历数据由于数据是Object类型,每次都需要强制类型转换。可以使用ArrayList
集合里面只能存储引用类型,数组可以存储基本类型和引用类型。
集合在Add()时会自动对基本类型进行装箱操作。
9、HashSet
使用和其他集合几乎相同。
(1) 无序的(所以不能通过索引获取到某一数据),不重复(ArrayList,LinkedList,Vector可以添加重复数据,有序的)
(2) 高级for遍历
10、TreeSet
和HashSet特性,使用几乎相同。
和HashSet区别:HashSet使用哈希存储,TreeSet使用树存储。
11、Map键值对存储(HashMap、TreeMap)
(1) put(key,value) 添加key和value
(2) containsKey 是否包含某个key
(3) containsValue 是否包含某个value
(4) keySet() 得到所有的key
(5) values() 得到所有的value
(6) get(key) 根据key获取value
HashMap、TreeMap区别:类似HashSet和TreeSet
12、关于HashTable和HashMap
区别:使用几乎相同。HashTable线程安全,效率低。HashMap线程不安全,效率高
13、所有集合类总结
Collection(存储单个值)
- List(可重复,有序)
- ArrayList
- LinkedList
- Vector
- Set(不可重复,无序)
- HashSet
- TreeSet
Map(存储键值对)
public class Demo01_KeBianCanShu {
//可变参数
//1,可变是指的是个数可变
//2,在调用方法的时候,如果能够和固定参数的方法匹配,也能够与可变长参数的方法匹配,则选择固定参数的方法。
//3,一个方法最多只能有一个可变参数,可变参数必须放在最后一个参数位置
public static void main(String[] args) {
// System.out.println(add(23,23)); // System.out.println(add(23,23,89)); // System.out.println(add(23,23,89,1));
//数组参数 ,调用比较麻烦
// System.out.println(add(new int[] {23,23})); // System.out.println(add(new int[] {23,23,89})); // System.out.println(add(new int[] {23,23,89,1}));
// print(“hello”); // print(“Hello”,”World”);
print("提示");
}
//可变参数
public static void print(String str,String... args) {
System.out.print(str+":");
for (String string : args) {
System.out.print(string);
}
System.out.println();
}
//固定参数
// public static void print(String str) { // System.out.println(“固定参数”+str); // }
//我们可以传递任意数量的 int类型参数,系统会帮我们自动把传递的参数组织成 args数组
// public static int add(int… args) {
// //这里定义了一个可变参数,args,args当做数组来使用
// int result = args[0];
//
// for(int i=1;i<args.length;i++) {
// result +=args[i];
// }
//
// return result;
// }
//
public static int add(int[] args) {
int result = args[0];
for(int i=1;i<args.length;i++) {
result +=args[i];
}
return result;
}
// public static int add(int a,int b) { // return a+b; // } // public static int add(int a,int b,int c) { // return a+b+c; // } // public static int add(int a,int b,int c,int d) { // return a+b+c+d; // } }
2,单元测试<br /> 使用Junit单独运行某个方法<br />Build Path->Congigure Build Path->Libraries->Add Library选择Junit添加
```java
@Test //注解 org.junit.Test
public void testPrint() {
print("提示","程序出错");
}
右键->Run As->Junit Test即可。
5,关于转义字符
package com.sikiedu.chapter4;
public class Demo03_ZhuanyiZifu {
public static void main(String[] args) {
//转义字符 \x \" = 字符" \n 换行、回车符
// String str= "我的名字是\n\"siki\""; //一个字符串的定义,不可以放在多行
// String str= "我的名字是\n\'siki\'"; //一个字符串的定义,不可以放在多行
// String str= "我的名字是\\siki"; //一个字符串的定义,不可以放在多行
// String str= "我的名字是\bsiki"; //一个字符串的定义,不可以放在多行
// \n 回车 \r 换行
// \n \r \r\n 不同的操作系统,识别不同的换行符
String str= "我的名字是\n\rsiki"; //一个字符串的定义,不可以放在多行
//https://blog.csdn.net/twc18638942853/article/details/56830881
System.out.println(str);
}
}