面向对象(下)
包装类
其实就是 int、char这些是C语言的老传统,不是java 面向对象的特性。
关于 装箱、拆箱:
int、char都是很基本的一个原子,但是作为面向对象的java,都是“封装包”,所以Integer、Character是一种类似于类的包。
当然,可以直接互相转化
其实当成int char用就完事了
String str="54";//这里本质是字符串
int i=Integer.ParseInt(str);//拆包成int基本类型
注意:-128~127的Integer可以对比,但是更大的就不行,这是java的缓存机制有关,一下子只存这个范围内的
处理对象
打印对象、toString()方法
先要知道,在java世界里面,所有所有的类,必定都是Object类的。
Object类里面有这个toString方法,所以 所有的类都默认有toString
这个方法决定了 返回显示 的内容
public class apple()
{
char sex;
int age;
}
apple p1 = new apple;
System.out.println(p1);
默认是 类名字 + @ +hashCode()方法的返回值(16进制的)
如果你想要显示 自己需要的内容,就得自己重载toString();
打印一个实例对象,需要年龄就在toString自己写
这就是java 面向对象的好处,想要一下子显示出一个包内容的啥玩意,都可以自 己定
任何东西后面+"" 空字符串
就可以被String接受住
equals()方法
判断是否相等,以前习惯性地觉得是判断 数值
后来学习C后,也可以对比字符(本质还是ASCII码表对于的码做比较)
字符串的就是 一样长度的内容
但是好像我们对于**“相等”**这个概念太局限了。
对于java这种 包 到处都是的语言,equal提供了很好的方法—
让我们自己定义 怎样才叫相等。
根据 实际业务需要,自己定义
final
类似于C语言的 const 定了就不可以修改 ,只能指定一次
这里面看似两次,其实只有一次 因为默认构造器、带参数的构造器顶多二选一
实例变量
final修饰变量:该变量被赋初始值之后,不能被重新赋值!
final修饰的变量【必须】被赋值,且只能赋值【一次】。
final修饰成员变量:
非final的成员变量,程序员可以不显式指定初始值,系统会为之分配默认初始值,
初始值分配规则写数组元素的初始值芬配规
final的成员变量,程序员宓频豆式指定初始值。
final实例变量,必须显式指定初始值。只能在以下3个位置的其中之一指定:-
- 定义时指定初始值。
- 实例初始化块
- 每个构造器显式指定一次初始值。
上面3个位置的本质箕实只有一个:构造器。
类变量都在实例变量前面,所以每次都是类第一次加载成功后,等于已经初始化好了,以后的实例再也改变不了了
类变量不能在普通初始化块中指定初始值,因为类变量在类初始化阶段已经被初始化了,普通初始化块不能对其重新赋值 ------《疯狂java》
final 局部变量
必须显式初始化
关于对象和引用的内容(类比结构体本身和结构体的内部某个内容)
final 宏替换
类似于#define
注意最后一行,“对于final实例变量,只有在定义该变量时指定初始值才会有宏变量效果”
final 方法
1、不可以被子类重写
如果之前有个父类中的private的,那么子类中名字一样的话
那属于完完全全重新定义了,几乎是另一个了
final 不能重写(毕竟都被private藏起来了),可以重载!
(ps:final和private有些重叠)
final 类
不可以有 子类
abstract
就是自己不管事的类,专门用来生孩子类的父类。
自己只有模板的父类。就是专门等着子类来重写。
static详解
内部类
一个类中,可以套娃 其他类
首先注意
- 内部类比外部类多三个修饰符: private\protected\static
- 非静态内部类 不能拥有static成员
非静态内部类
非静态的内部类 可以看作是外部类的一个对象
内部类可以访问外部类的 private成员
具体如下:当查找某个变量时的优先级
---------------
内部类变量 和 外部类 的关系:
非静态内部类 必须寄生在一个外部类对象里
外部类对象不一定有内部类对象,但是外部类不一定有
要想访问某个 内部类变量,必须先显式定义外部类实例,否则会编译错误
关于重名不冲突:
可以通过this、外部类名.this来区分
outer class
{
int max=45;
inner class
{
int max=30;
方法
{
int max=15;
outer.this.max;//这是最外面那个45
this.max;//这个是中间那个30
max;//这个是15
}
}
}
Java 不允许非静态内部类里定义静态成员
静态内部类
本质:属于外部类本身,而非对象。可以类比static 对象,完全伴生于类本身,不附属于任何实例存在。
静态内部类可以包含静态成员,也可以包含非静态成员。根据静态成员不能访问非静态成员的规则,,静态内部类不能访问外部类的实例成员,只能访问外部类的类成员。即使是静态内部类的实例方法也不能访问外部类的实例成员,只能访问外部类的静态成员。
哪怕是静态内部类,也顶多访问外部的类成员,而不能访问实例成员。
外部类依然不能直接访问静态内部类的成员,但可以使用静态内部类的类名作为调用者来访问静态内部类的类成员,也可以使用静态内部类对象作为调用者来访问静态内部类的实例成员。
要么用静态内部类来访问类成员
要么new一个静态内部类的对象,通过对象来访问类里面的实例成员。
使用内部类
外部类范围中使用:
唯一存在的一个区别是:不要在外部类的静态成员(包括静态方法和静态初始化块)中使用非静态内部类,因为静态成员不能访问非静态成员。
外部类外:
- 不要带private,不然访问不了
- protected ,则同一个包下面都可以(即同一个.java)
- 没有前缀:整个项目都可以
- public 都可以
外部类定义内部类的话
外部类名.内部类名字 变量名
由于非静态内部类的对象必须寄生在外部类的对象里,因此创建非静态内部类对象之前,必须先创建其外部类对象。在外部类以外的地方创建非静态内部类实例的语法如下:
外部类实例名.new 内部类构造器(参数表)