一、类与对象
1.创建类
类体 变量 成员变量
静态变量
方法 构造方法
成员方法
静态方法
修饰符 访问修饰符 public private protected 缺省
非访问修饰符 static final
作用域
关键字 this super
运算符 instanceOf
2.实例化对象
class Student{
String name;
int age;
public Student(){
}
public Student(String name,int age){
//方法体
this.name = name;
this.age = age;
}
}
Student zhangShan = new Student("张三",23);
二、面向对象三大特性
1.封装
2.继承
子类继承父类
super
Object equals String
String a = new String("hello");
String b = new String("hello");
a.equals(b) true
a == b false
int a = 10;
int b = 10;
a == b
3.多态
父类变量引用父类实例,也可以引用子类实例
eg:
三、集合
数组
ArrayList<Student> lists = new ArrayList<Student>();
lists.add(zhangshan);
lists.get(0);
lists.remove(0);
lists.remove(zhangshan);
对象类型转换
在继承链中,我们将子类向父类转换称为“向上转型”,将父类向子类转换称为“向下转型”。
eg:
变量的作用域分为四个级别:类级、对象实例级、方法级、块级。
包装类:
每个包装类的对象可以封装一个相应的基本类型的数据,并提供了其它一些有用的方法。包装类对象一经创建,其内容(所封装的基本类型数据值)不可改变。
基本类型和对应的包装类可以相互装换:
由基本类型向对应的包装类转换称为装箱,例如把 int 包装成 Integer 类的对象;
包装类向对应的基本类型转换称为拆箱,例如把 Integer 类的对象重新简化为 int。
eg:
方法覆盖和方法重载:
覆盖:
在类继承中,子类可以修改从父类继承来的方法,也就是说子类能创建一个与父类方法有不同功能的方法,但具有相同的名称、返回值类型、参数列表。
如果在新类中定义一个方法,其名称、返回值类型和参数列表正好与父类中的相同,那么,新方法被称做覆盖旧方法。
参数列表又叫参数签名,包括参数的类型、参数的个数和参数的顺序,只要有一个不同就叫做参数列表不同。
被覆盖的方法在子类中只能通过super调用。
eg:
重载:
注意:Java父类和子类中的方法都会参与重载,例如,父类中有一个方法是 func(){ … },子类中有一个方法是 func(int i){ … },就构成了方法的重载。
eg:
覆盖和重载的不同:
方法覆盖要求参数列表必须一致,而方法重载要求参数列表必须不一致。
方法覆盖要求返回类型必须一致,方法重载对此没有要求。
方法覆盖只能用于子类覆盖父类的方法,方法重载用于同一个类中的所有方法(包括从父类中继承而来的方法)。
方法覆盖对方法的访问权限和抛出的异常有特殊的要求,而方法重载在这方面没有任何限制。
父类的一个方法只能被子类覆盖一次,而一个方法可以在所有的类中可以被重载多次。
运算符:
构造方法
内部类:
内部类和外层封装它的类之间存在逻辑上的所属关系,一般只用在定义它的类或语句块之内,实现一些没有通用意义的功能逻辑,在外部引用它时必须给出完整的名称。
使用内部类的主要原因有:
内部类可以访问外部类中的数据,包括私有的数据。
内部类可以对同一个包中的其他类隐藏起来。
当想要定义一个回调函数且不想编写大量代码时,使用匿名(anonymous)内部类比较便捷。
减少类的命名冲突。
静态方法 静态类
静态方法是一种不能向对象实施操作的方法。例如,Math 类的 pow() 方法就是一个静态方法,语法为 Math.pow(x, a),用来计算 x 的 a 次幂,在使用时无需创建任何 Math 对象。
关于静态变量和静态方法的总结:
一个类的静态方法只能访问静态变量;
一个类的静态方法不能够直接调用非静态方法;
如访问控制权限允许,静态变量和静态方法也可以通过对象来访问,但是不被推荐;
静态方法中不存在当前对象,因而不能使用 this,当然也不能使用 super;
静态方法不能被非静态方法覆盖;
构造方法不允许声明为 static 的;
局部变量不能使用static修饰。
eg: