- 使用new操作符,可以创建一个类的实例/对象
- 使用new创建一个类的实例之后,类中定义的每一种变量都可以被赋予其类型的初始值
- 这个和数组也是一样的
- 使用一个同类型的对象变量,可以指向并操作这个实例,这两点和数组都很类似
- 点操作符,是用来访问/操作前面实体的属性,类似于"的"
引用数据类型
-
java中的数据类型分为基本数据类型和引用数据类型
-
一个类型的引用,只能指向该类型的实例
-
引用数据类型包含两部分信息:类型和实例
-
每一个引用数据类型的变量,都是指向某个类的一个实例或者对象,不同类型的- - 引用在java的世界里都是引用
-
引用的类型信息在创建时就已经确定,可以通过给引用赋值,让其指向不同的实例,
引用数据类型和基本数据类型
引用数据类型和基本数据类型的相同点
- 都可以用来创建变量,可以赋值和使用其中的值
- 本身都是一个地址
引用数据类型和基本数据类型的不同点
- 基本数据变量的值,就是地址对应的值,引用数据类型的值还是一个地址,还需要通过下一步操作来找到实例
- 引用数据类型是java中的一种内部类型,是对所有的自定义类型和数据引用的统称,并非特指某种类型
使用new操作符可以创建某一个类的一个实例,在java程序运行的时候,所有这些创建出阿里的实例都被java放在内存里面一个叫做堆的类似公告板的地方
类对象和引用的关系
类,对象和引用的关系
-
类是对象的模版,对象是类的一个实例
-
一个java程序或者中类名相同的类只能有一个,也就是类型不会重名
-
一个类可以有很多的对象
-
一个对象只能根据一个类来创建对象
引用和类以及对象的关系 -
引用必须,只能是一个类的引用
-
引用只能指向其所属的类型的类的对象
-
相同类型的引用之间可以赋值
-
只能通过指向一个对象的引用,来操作一个对象,比如访问某个成员变量
认识数组类型
数组是一种特殊的类
- 数组的类型就是类型带上中括号
- 同一个类型的数组,每个数组对象的大小可以不一样,也就是每个数组对象占用的内存可以不一样,这点和类的对象不同
- 可以用引用指向类型相同大小不同的数组,因为他们属于同一种类型
引用的数组
可以把类名当成自定义类型,定义引用的数组,甚至多维数组
像自定义类型一样使用类
类就是一种自定义类型
- 在类定义中可以使用类,创建类的引用
- 在类定义中,甚至可以使用类自己的类创建引用
- 引用类型的缺省值是null,一个类定义中如果有引用,创建出的实例,其缺省值是null
参数和返回值的传递
参数的传递,其实就是赋值
方法的重载
- 方法签名:方法名+依次参数类型,注意返回值不属于方法签名,方法签名是一个方法在一个类中的唯一标识
- 同一个类中方法可以重名,但是签名不可以重复,一个类中如果定义了名字相同,签名不同的方法,就叫做方法的重载
构造方法:
- 构造方法的方法名需要与类名一样,而且构造方法没有返回值,这样的方法才是构造方法
- 构造方法可以有参数,规则和语法与普通的方法一样使用时,方法传递给new语句后类名的括号后面
- 如果没有显示的添加一个构造方法,java会给每个都会默认自带一个无参数的构造方法
- 如果我们添加类的构造方法,java不会再添加无参数的构造方法,这时候就不能直接new一个对象不传递参数
- 所以我们一直都在使用构造方法,这也是为什么创建一个对象的时候类名后面要有一个括号的原因了
- 构造方法无法被点操作符调用,只能通过new语句在创建对象的时候间接调用
- 为什么构造方法不能有返回值,因为有返回值也没有意义,new语句永远返回的是创建出来的对象的引用
- 如果我们添加类构造方法,java就不会再添加无参数的构造方法
这时候我们就不能直接new一个对象不传递参数了
构造方法的重载和相互调用
9. 在构造方法里面才能调用重载的构造方法,语法为this(实参列表)
10. 构造方法不能自己调用自己,这会是一个死循环
11. 在调用重载的构造方法时,不可以使用成员变量,因为用语意上讲,对象还没有被初始化完成处于一个中间状态
12. 在构造方法里才能调用重载的构造方法,必须是方法的第一行,后面才可以继续有代码
静态方法的重载
- 静态方法的重载和普通方法的重载是一样的,方法签名不同即可:方法名+参数类型
- 判断调用哪个方法,也是根据调用时参数匹配决定的
String
String对象最重要的特点:不可变.String用来存储字符的数据是private的,而且不提供任何修改内容的方法,所以String对象一旦生成,其内容就是完全不可能被修改的,在String提供的源码中就是new一个新的String对象
//两个String对象对于比较是否相等,一定要用equals方法
场景中如果用户不注意多敲了空格,那么我们可以用trim方法进行空格的去除
main方法:
- main是一个静态的,有String[] 做参数的,没有返回值的方法而已,它的特殊性在于jav- 可以把main方法作为程序入口
- 给main方法传递参数
- 自己试着调用main方法.在设置中可以添加真实的参数
String类的兄弟
-
StringBuilder是一个非常方便的用来拼接和处理字符串的类
-
和String不同的是,它是可变的
-
继承,其实表达的是一种is-a的关系,也就是说,在你用类构造的世界中,子类是父类的一种特殊类别
-
组合,和继承是拿到了一个问题,设计相应的java类的时候.不得不面对的来自灵魂的拷问
-
xx到底是YY我的一种,还是只是组合了YY,手机到底是手电筒的一种,还是组合了一个可以手电的闪光灯
在组合的情况下,怎么限制一次只能买五个手机呢
通过子类覆盖掉父类的方法
也就是说子类并不是只能把父类的方法拿过来,而是可以通过覆盖来替换其中不适合子类的方法
idea覆盖了父类的话,那就会有一个小圆点指向覆盖的父类
返回值必须一样,不是类型兼容,而是必须一模一样
如果签名一样,但是返回值不一样,会是错误
覆盖可以覆盖掉父类的方法,同一个方法,不同的行为,这就是多态
super是子类和父类交流的桥梁,但是并不是父类的引用
所以super和this自引用是不一样的,不是简单可以模拟的
多态:到底调用的哪一个方法?
- 可以调用哪些方法,取决于引用类型,具体调用哪个方法,取决于实例所属的类是什么
- 覆盖是多态里面最重要的一种形式
- 从this自引用的角度,理解覆盖
无论一个方法是使用哪个引用被调用的他都是实际的对象上执行的,执行的任何一个方法,都是这个对象所属的类的方法
重载调用哪个方法,和参数的引用类型有关,和引用实际指向的类型无关
重载总结:静态多态调用的方法和参数实际指向的对象无关只和引用本身的类型相关
因为调用时参数类型是确定的,所以在编译期间就可以明确的知道哪个方法会被调用,如果有多种可能,则会有编译出错
如果没有类型完全匹配的候选,则根据类型的继承关系向下找,找到最贴近参数类型的那个方法
无论是静态方法,还是成员方法,重载寻找方法的顺序是一样的
protected:不同包里面的代码,不可以访问缺省值和protected
子类覆盖父类的方法,不可以在子类里用一个比父类中更低的修饰符
protected对同一个包下的类是可见的
final不能修饰构造方法