DAY1-类和对象
对象是现实生活中看得见,摸得着的具体事物。
类是对象的模板或蓝图,类是对象的抽象化,对象是类的实例化。
把具有相同属性和方法的对象归为一个类(class)
定义步骤:
①定义类名 ②编写类的属性 ③编写类的方法
创建对象
类名 对象名 = new 类名()
引用对象成员:使用“.”进行以下操作
引用类的属性:对象名.属性
引用类的方法:对象名.方法名()
面向对象思想(OOP)
只关注参与这个事件的对象,不关心具体过程,具体过程打散到多个对象,在main函数中可以组合出具体过程。
关于自定义类
用户自定义类就是一种数据类型
对象数组 UserInfo[ ]users = new UserInfo[50];
在Java中需要判定一个对象是否为空,和null进行比较;
两个静态串可以直接通过==比较,但一个静态一个输入,不可用==比较,使用equals()进行比较;
DAY2-类的方法
定义一个方法就是定义一个功能。也就是类可以有说明能力,可以做到什么事情
定义方法五要素:
①访问修饰符②返回值类型③方法名④参数列表⑤方法体
关于方法返回值
如果一个方法没有返回值,返回值类型不能省略,得写成void,代表没有返回值。
关于方法调用
如果两个方法不在同一个类中,我们要先实例化对象,然后通过对象名.方法名()调度。
如果两个方法在同一个类中,直接通过方法名称调用。
成员变量和局部变量
变量声明的位置决定变量作用域
全局变量指定义在任何函数之外的变量,也就是不被任何{函数体}所包含,作用域(有效范围)是从定义变量的位置开始到源文件(整个程序)结束。
局部变量指在一个函数(包括main函数)内部定义的变量,只在本函数内部有效,其他函数不能使用这些变量,函数的参数也是局部变量【方法结束,内部空间释放】
类的方法
①带参方法【数组、对象都可以做为参数】
分为无参无返回值、无参带返回值、带参带返回值
<访问修饰符>返回类型<方法名>(<形式参数列表>){
//方法主体
}
形参有类型,实参就是真实值
带多个参数方法调用时需注意:
(1)函数定义和函数调用参数名称不用一样
(2)参数个数、类型、顺序必须一致
② 递归方法
方法自己调用自己,这种调用称为“递归方法”
使用递归解决问题两个条件:
(1)把问题转化成一个新问题,而新问题的解决解法和原问题解法相同,只是问题规模变小。
(2)必须要有一个明确的递归结束条件(即递归边界)。
DAY3-抽象和封装
类的提炼过程
从现实生活中归纳总结出多种相同物种,具有的相同的特征(属性+行为)提炼到一个容器里,给这个容器起一个名字,就是类。
步骤:①发现类 ②发现类的属性 ③发现类的方法
ps:在开发过程中,先设计类图,然后定义类(需求在需求文档中,需求文档一般已文字描述),使用类图描述类更加形象和直观。
构造方法
构造方法没有返回值类型(主要完成对象的创建工作)
访问修饰符 构造方法名(){
//初始化代码
}
系统提供默认无参构造方法
自定义构造方法:
①构造方法和类名相同
②没有返回值
③一旦自定义构造方法,系统将不再提供默认的构造方法
方法重载
有多个方法,他们实现的功能相同,方法名称相同,但是参数列表不同;
有3层含义:1、参数的个数不同 2、参数的类型不同 3、参数的顺序不同
与返回值和访问修饰符无关。
普通方法可以实现重载,构造方法也可以重载
关于static
静态成员占用的内存是静态存储区,而且成员一旦变成静态,它就是类本身所有,只有一份,和对象没有关系,会一直生存到程序结束,占用空间大,不能将所有变量定义成静态。
JVM加载类时,加载静态代码块(由于类只被加载一次,所以静态成员也只被加载一次)
——如果有多个静态块,按顺序加载 ——每个静态代码块只会被执行一次
static变量
类成员变量:
①类变量(静态变量)
(1)被static修饰的变量,在内存中只有一个拷贝
(2)类内部,可在任何方法内直接访问静态变量
(3)其他类中,可以直接通过类名访问
②实例变量
(1)没有被static修饰的变量
(2)每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响。
static方法
①静态方法(可以直接通过类名访问)
不能访问非静态成员
——不能直接访问所属类的实例变量和实例方法
——可直接访问类的静态变量和静态方法
②实例方法(通过实例访问)
——可直接访问所属类的静态变量、静态方法、实例变量和实例方法
面向对象三大特征
(1)封装
封装指将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
优点:①隐藏类的实现细节 ②只能通过规定方法访问数据
DAY4-类的继承
继承的用法
继承是代码重用的一种方式
class Pet {
//公共的属性和方法
}
编写子类,继承父类
class Dog extends Pet {
//子类特有的属性和方法
}
继承可以实现代码复用
在idea中,如何查看类的继承关系:对着要查看的类点击【右键】,点击【diagrams菜单】然后点击子菜单【show diagrams】即可。
在Java中,继承用的是extends关键字。
继承注意事项
①Java中类只支持单继承,不支持多继承
——一个类只能有一个直接父类
符合is-a关系的场景下我们使用继承
子类不能继承父类的如下内容:
private成员
子类与父类不在同包,使用默认访问修饰符的成员
构造方法
断点跟踪初始化过程
初始化顺序为:
1、父类属性
2、父类构造
3、子类属性
4、子类构造
子类重写父类的方法
重写规则:
——方法名相同
——参数列表相同
——返回值类型相同或者是其子类
——访问权限不能严于父类
重载VS重写
方法重载(overload)是同一个类中的多个方法,方法名称相同,参数列表不同,和返回值没有半毛钱关系。
方法重写(overwrite):在不同的类中,有继承关系,有命名方法。子类的方法可以覆盖父类的同名方法,这个现象就称为方法重写。
名词 | 位置 | 方法名 | 参数列表 | 返回值 | 访问修饰符 |
方法重写 | 子类 | 相同 | 相同 | 相同或是其子类 | 不能比父类更严格 |
方法重载 | 同类 | 相同 | 不相同 | 无关 | 无关 |
super的使用
在Java中,使用super访问父类成员
——super不能访问父类私有成员
——super调用构造方法时,只能是第一句
this和super
this是当前类的对象,super指的是父类对象
Object类
必须记住:Object类是所有类的父类,任何类默认都继承自Object类。
以下方法经常被子类重写
toString() | 返回当前对象本身的有关信息,按字符串对象返回 |
equals() | 比较两个对象是否是同一个对象,是则返回true |
Object是所有类的父类,Object类在Java。lang包中;Object有一个常用方法,toString().任何对象直接打印名字,就会自动调用它的toString()方法。Object的toString()主要打印的信息内容为类的全名称以及地址。我们自己可以重写Object的toString()。
Object的==和equals()是一样的,都是比较两个对象的地址是否相同。
String类改成了equals()方法。内容是否相等,而不仅仅是地址是否相同。
equals()方法
之前我们提到过,两个字符串是否相等的判定得用equals,不能用==,接下来我们来揭秘:
Object类的equals()方法:(alt+7)
——比较两个对象是否是同一个对象,是则返回true
——操作符==
1、简单数据类型,直接比较值。如1==2
2、引用类型,比较两者是否为同一对象
==运算符,对于简单类型,就是比较真实值。对于引用类型,比较的是地址
equals说明
(1)Object类的equals()方法与==没区别
(2)当有特殊需求,如认为属性相同即为同一对象时,需要重写equals()
(3)Java.lang.String重写了equals()方法,把equals()方法的判断变为了判断其值
抽象类和抽象方法
Java中抽象类使用abstract修饰
抽象方法也使用abstrcat修饰
注意点:
——抽象方法没有方法体
——抽象方法必须在抽象类里
——抽象方法必须在子类中被实现,除非子类是抽象类
——抽象类中可以有非抽象方法
final关键字
使用final修饰的类不能有子类
使用final修饰的方法不能被重写
使用final修饰的变量会变成常量