面向对象:
一、什么是对象?
特征和行为:
特征(属性):称为属性,一般为名词,代表对象有什么。
行为(方法):称为方法,一般为动词,代表对象能做什么。
二、什么是类
类的抽取:在一组相同或类似的对象中,抽取出共性的特征和行为,保留所关注的部分。
类属于引用类型。
- 类:定义了对象应具有的特征和行为,类是对象的模板。
- 对象:拥有多个特征和行为的实体,对象是类的实例。
三、类的组成
public class Dog{
String breed;//品种
int age;//年龄
String furColor;//颜色
String sex;//性别
//方法
//吃
public void eat(){
System.out.println("狗狗吃屎!");
}
//睡
public void sleep(){
System.out.println("狗狗开始睡觉...");
}
}
public class TestDog{
public static void main(String[] args){
//类是对象的模拟
//创建对象
Dog xiaohei = new Dog();
//int num = 10;
//属性赋值
xiaohei.breed="哈士奇";
xiaohei.sex="公";
xiaohei.age=2;
xioahie.fuColor="黑色";
xiaohei.eat();
xiaohei.sleep();
}
}
new:开辟空间,属性默认值
drop:复制地址
ivokespecial:执行构造方法
astore_1:把地址赋值给变量
public class Student{
String name;
int numb;
int age;
String sex;
public void hello() {
System.out.println(name+numb+age+sex);
}
}
public class TextSayHi {
public static void main(String[] args) {
Student stu1 = new Student();
Student stu2 = new Student();
stu1.name = "zhangsan";
stu1.age = 12;
stu1.sex = "男";
stu1.numb = 123456;
stu2.name ="lisi";
stu2.age = 15;
stu2.sex = "女";
stu2.numb = 789456;
stu1.hello();
stu2.hello();
//将stu1和stu2存入studens
Student[] students = new Student[] {stu1,stu2};
//for增强
for (Student student : students) {
System.out.println(student.name + student.age + student.numb +student.sex);
}
}
}
四、方法重载(Overload)
在同一个类中,方法名相同,参数列表不同(类型、个数、顺序不同)
//方法的重载和返回值无关。
public class Calculator{
//类型
public int add(int num1,int num2){
int sum = num1 + num2;
return sum;
}
public double add(double d1,double d2){
double sum = d1+d2;
return sum;
}
//顺序
public double add(int num1,double num2){
double sum = num1+num2;
return sum;
}
public double add(double num1,int num2){
double sum = num1+num2;
return sum;
}
//个数
public int add(){
int n1 = 100;
int n2 = 200;
return n1+n2;
}
public int add(int num1){
int num2 = 200;
return num1+num2;
}
//和名字无关
//和返回值类型无关
}
public class CalTest {
public static void main(String[] args) {
//类是对象的模型,对象是类的实现。
Calculator calculator = new Calculator();
System.out.println(calculator.add(1,2));
System.out.println(calculator.add(1,1.2));
System.out.println(calculator.add(2.2,10));
System.out.println(calculator.add());
System.out.println(calculator.add(100));
}
}
五、构造方法
构造方法:
类中的特殊方法,主要用于创建对象。
如果是已经添加了构造方法,编译器不会再添加无参构造方法。
特点:
• 名称与类名完全相同。
• 没有返回值类型。
• 创建对象时,触发构造方法的调用,不可通过句点手动调用
class xxx{
public xxx {
}
}
对象的创建过程:
public class TestConstructors{
public static void main(String[] args){
//内存中开辟空间
Student s =new Student();//通过创建对象调用,无法通过句点手动调用
}
}
class Student{//类名
//为各个属性赋予默认值
String name;
int age;
String sex;
double score;
}
public Student(){//构造方法,1.名称和类名相同 2.没有返回值类型
//执行构造方法中的代码
System.out.println("Student() Executed");
}
对象的创建过程:
• 内存中开辟对象空间属性赋予初始值
• new
• dup
• 执行构造方法中的代码
• invokeSpecial
• 将对象的地址赋值给变量 //=
• astore_1
默认构造方法:
- 编译错误:无参构造方法未定义
- 在类中,如果没有显示定义构造方法, 则编译器默认提供无参构造方法。
- 如已手动添加有参构造方法,则无参 构造方法不再默认提供,可根据需求 自行添加。(所以需要有参构造和无参构造一起进行。)
六、this关键字
类是模板,可服务于此类的所有对象; this是类中的默认引用,代表当前实例; 当类服务于某个对象时,this则指向这个对象
当创建s1对象时,this指向0x0000A001, 访问的name属性即是0x0000A001地址中的name空间; 当创建s2对象时,this指向0x0000B002, 访问的name属性即是0x0000B002地址中的name空间;
//alt+insert
有参构造
无参构造
//getter setter 可以用来对private私有变量进行修改、约束。
第一种用法:
调用实例属性、实例方法。如:this.name、this.sayHi()。
当实例变量和局部变量重名时,**优先访问局部变量**; 此时,如需访问实例变量,需要增加this.前缀。 不存在重名时,则可省略this.
public class TestThisKeyword{
public static void main(String[] args){
Student s1 = new Student();
s1.sayHi();
}
}
class Student{
String name = "tom";//实例变量
public void sayHi(){
String name ="jack";//局部变量
System.out.println(name);
System.out.println(this.name);
}
}
运行结果:
jack
tom
第二种用法:
this第二种用法:调用本类中的其他构造方法。如:this()、this(实参)//必须在构造方法的首行
class Student{
String name;
int age;
String sex;
double score;//一个类中可以有多个构造方法
public Student(String name,int age,String sex){
this.name = name;//当局部变量和实例变量重名时,优先使用局部变量,要想使用实例变量,需要用到this
this.age = age;
this.sex = sex;
}
public Student(String name,int age,String sex,double score){
//减少了代码的冗余
this(name,age,sex);//**必须在构造方法的首行**
this.score = score;
}
}
- 在构造方法中,调用本类的 其他构造方法,即可复用构 造方法中的逻辑代码.
- 两个构造方法当中, 包含多条冗余代码
- this():调用无参构造 this(实参):调用有参构造 注:必须在构造方法的首行
- 四参构造将接收到的实参直接 传递给三参构造进行属性赋值。
this();//调用无参方法?在哪调用,在自身的类吗
this(“xxx”,xx);//调用有参
注意:必须是构造方法的第一条语句,只能调用一次。
public class Car {
String color;
String brand;
double price;
public void run() {
System.out.println("go...go...go");
}
public void show() {
System.out.println(this.color+this.brand+this.price);
}
}
public class TestCar {
public static void main(String[] args) {
Car car1 = new Car();
Car car2 = new Car();
car1.brand = "110";
car1.color = "yellow";
car1.price = 20.0;
car2.brand = "221";
car2.color = "red";
car2.price = 30.0;
car1.show();
car2.show();
Car[] car = new Car [2];
for (Car i : car) {
System.out.println(i);
}
}
}
七 、JVM虚拟机
getstatic:从类中获取静态字段
new:创建一个对象并将地址放入虚拟机栈
dug:复制一个对象地址放入虚拟机栈
invokespecial:用于调用私有方法及final方法
aload_0:aload_0 is supposed to push 'this' on to the stack
getfield:从对象中获取字段
八、局部变量和实例变量区别
局部变量 | 实例变量 | |
---|---|---|
定义位置 | 方法或方法内的结构当中 | 类的内部,方法的外部 |
默认值 | 无默认值 | 字面值(与数组相同) |
使用范围 | 从定义行到包含其结构结束 | 本类有效 |
命名冲突 | 不允许与局部变量重名 | 不允许与实例变量重名可与局部变量重名,局部变量优先 |
实例变量:
属性:通过变量表示,又称实例变量。
语法:数据类型 属性名;
位置:类的内部,方法的外部
方法:通过方法表示,又称实例方法。
语法: public 返回值类型 方法名(形参){ //方法的主体 }
注意:不再书写static,后续详解
public class Sample {
private int a = 1; // 实例变量
public void b() {
int a = 2; // 局部变量
System.out.println("局部变量:a=" + a);
System.out.println("实例变量:a=" + this.a);// 局部变量的作用域内引用实例变量:this.变量名
}
public static void main(String[] args)
{
new Sample().b();
}
}
运行输出:
局部变量:2
实例变量;1
九、文档注释:
API文档就是用来说明这些程序的入口的。
9.1 cmd生成文档注释:
cmd:cdjava项目中,
javadoc -d doc -encoding utf-8 -charset utf-8 *.java
9.2 使用idea工具生成文档注释:
tools
generate javaDoc
Other command:
-encoding utf-8 -charset utf-8
文档注释:
/**
*
*/
可以给自己生成doc文件,也可以为后面的API和方法的引用提供注释。
标签 | 含义 |
---|---|
@author | 类的作者 |
@version | 类的版本 |
@see | 指定参考的链接或内容 |
@param | 说明一个方法的参数 |
@since | 指定从哪个JDK版本开始提供支持 |
@return | 说明返回值类型 |
十、四个关键字作用域
作用域 | 当前类 | 同一包内 | 子孙包 | 其他包 |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
[default] | √ | √ | × | × |
private | √ | × | × | × |
十一、调试
Debug:
先打断点
再Debug
下一步 深入 上一步
• 使用调试技巧,帮助开发人员理解程序执行过程,从而发现问题,解决问题。
• 使用IDEA调试程序需要两个步骤:
• 添加断点
• 单步执行
• 快捷键:
-
F8单步跳过 Step Over
-
F7单步进入 Step Into
-
alt+shift+f7 强制进入
-
F9继续执行 Resume
十二、javap
看运行过程,等同于javap -v .class文件
安装:setting →plugins→搜索并在库中下载jclasslib
打开:重启→view→Show Bytecode With jclasslib
使用:main code
使用edit++查看16进制
十三、IDEA快捷键
1.生成source
//alt+insert
2.Debug
3.do while
//ctrl+alt+t
Ctrl+/ 单行注释
Ctrl+shift+/ 多行注释
Ctrl+D 复制行
Ctrl+X 或 Ctrl+Y 删除行
Alt+Enter 快速修正
Alt+/ 代码补全
Ctr+Shift+U 大小写转化
Ctrl+Alt+O 优化导入的类和包
Alt+Insert 生成代码(如get,set方法,构造函数等)
Ctrl+P 方法参数提示
Ctrl+H 显示类结构图
Ctrl+Q 显示注释文档
CTRL+AlT+M 抽取方法 Shift+Enter,向下插入新行 Ctrl+Alt+Enter 向上插一行
Ctrl+ 鼠标左键点击 查看源码
Double Shift 全局搜索
idea查看类中所有方法快捷键:
Ctil+F12
Alt+7
Ctrl+Alt+B:查找接口的实现类
Ctrl+Alt+shift+U:查看类继承关系图
Ctr+Alt+L 格式化代码
Ctrl+Shift+Up/Down 代码向上/下移动。
CTRL+AlT+T 把选中的代码放在 try{} if{} else{}里
ctrl+alt+v 自动补全返回值,自动补全变量名称和属性名称
十四 、idea代码补全
/*
*psvm sout (soutm、soutv、soutp、xxx.sout)
* fori (iter、数组或集合.fori)
* inn (ifn 、xxx.nn、xxx.null)
* prsf:可生成 private static final
* 类似的:
* psf:可生成 public static final
* psfi:可生成 public static final int
* psfs:可生成 public static final String
*/
//fori
//iter
//syso
//main
再比如说,想遍历某个list,可以直接list.for 回车就可以自动生成for (XXX xxx : lsit)的代码结构了。
再比如说,想输出1 + 2 的结果,可以直接1 + 2.sout 回车就可以自动生成System.out.println(1+2)
再比如说,new A(),想要声明一下, 直接new A().var,就会生成 A a = new A()
十五、Int类型不可用length查出长度
String 可以。
public static void main(String[] args){
String numb1 = "123456";
int b = numb1.length();
System.out.println(b);
}
十六、double比较
double.compare
十七、传递地址
public class TestConstractors{
public static void main(String[] args){
Student s1 = new Student();//实参列表
System.out.println(s1);//直接打印s1,打印的是地址
}
}
class Student{
String name;
int age;
String sex;
double score;
//没有给构造方法
public void sayHi(){}
public void study(){}
public void exam(){}
}
十八、Label打break断点
案例:
//Label打break断点
Label:do {
System.out.println("=====1.添加动物 2.查询动物 3.遍历动物0退出====");
System.out.println("请选择");
int choice = input.nextInt();
switch (choice) {
case 1:
//获得Animal类中的对象中的方法
Animal animal = getAnimal();
manager.add(animal);
System.out.println("添加成功");
break;
case 2:
System.out.println("请输入动物的昵称");
System.out.println("====");
String nickname = input.next();
Animal query = manager.query(nickname);
if (query!=null) {
query.show();
}else {
System.out.println("没有找到");
}
break;
case 3:
manager.list();
break;
case 0:
System.out.println("欢迎下次光临...");
break Label;
default:
System.out.println("输出有误,请重新输入:");
break;
}
}
while(true);
}
十九、设置size
//用户的个数
private int size;
二十、面向对象
Table[] array = new Table[2];
class Table {
private String name;
private Integer numbs;
}