1、常用名词
关键字包括:this、super、final static abstact implement
修饰符分别为:public、protectd、default、private
基本数据类型8 个 :byte、short、int、long、float、double、char、boolean
引用数据类型:String、类、数组、接口
2、final:用于修饰类、属性和方法;
被final修饰的类不可以被继承
被final修饰的方法不可以被重写
被final修饰的变量不可以被改变,
被final修饰不可变的是变量的引用,而不是引用指向的内容,引用指向的内容是可以改变的
3、static:静态,它是一个修饰符,用于修饰成员(成员变量,成员方法)
随着类的加载而加载,静态先于对象存在,被所有的对象共享,可以直接被类名调用,也可以被对象调用。
①静态方法只能访问静态成员(属性和方法),不能访问非静态成员。因为静态在的时候非静态的还没在呢
②非静态方法可以访问静态成员,也可以访问非静态成员
③因为静态先于对象的存在而存在,所以静态方法中不可以出现this、super关键字。
4、面向对象三大特征:封装、继承、多态
5、封装:
【特点】①可以对成员进行更精确的控制 ②隐藏信息,实现细节 ③减少耦合
【如何实现封装】通过权限控制对封装好的类加上权限,4中修饰符分别为public、protectd、default、private
访问权限 本类 本包 子类 其他包
public ∨ ∨ ∨ ∨
protect ∨ ∨ ∨ ×
default ∨ ∨ × ×
private ∨ × × ×
6、继承 :class 子类名 extends 父类名{}
【特点】
①一个子类只能有一个父类,一个父可以有多个子类。单继承。
②提高了代码的复用性。
③子类可以直接访问父类中的非私有的属性和方法。(注意private私有属性不可以访问)
④子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
⑤子类可以用自己的方式实现父类的方法。(重写)
⑥继承使用关键字extends来表示继承关系。
7、多态:实现多态有三个必要条件:继承、重写、向上转型。
8、重写:
①发生在父子类中,(重点)
②方法名、参数列表必须相同,
③访问修饰符大于等于父类(里氏代换原则);
④如果父类方法访问修饰符为private则子类中就不是重写。
9、重载:
①发生在同一个类中,(重点)
②方法名相同参数列表不同(参数类型不同、个数不同、顺序不同),
③与方法返回值和访问修饰符无关,即重载的方法不能根据返回类型进行区分
10、成员变量、局部变量、静态变量、实例变量
成员变量:方法外部,类内部定义的变量
局部变量:类的方法中的变量。
静态变量: static变量也称作静态变量,静态变量由于不属于任何实例对象,属于类的,也叫类变量
实例变量: 每次创建对象,都会为每个对象分配成员变量内存空间,实例变量是属于实例对象的,在内存中,创建几次对象,就有几份成员变量。
11、构造函数
【特点】
①构造方法名称必须与类名一致
②构造方法不具有任何返回值典型,即没有返回值,关键字 void 也不能加入,加入后就不是构造方法了,就成了普进的方法了
③任何类都有构造方法,如果没有显示的定义,则系统会为该类定义一个默认的构造器,这个构造器不含任何参数。如果显示的定义了构造器,系统就不会创建默认的不含参数的构造器了。
【语法结构】
[修饰符列表] 构造方法名(形式参数列表) {
构造方法体;
}
12、抽象类与接口的区别
【抽象类】
①抽象类使用abstract关键字声明
②子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现
③抽象类可以有构造器
④抽象类中的方法可以是任意访问修饰符
⑤一个类最多只能继承一个抽象类
⑥抽象类的字段声明可以是任意的
注意:
(1)抽象类不能使用 final 修饰;定义抽象类就是让其他类继承的,如果定义为 final 该类就不能被继承
(2)普通类和抽象类的区别区别:
①普通类不能包含抽象方法,抽象类可以包含抽象方法。
②抽象类不能直接实例化,普通类可以直接实例化。
【接口】
①接口使用interface关键字声明
②子类使用implements关键字来实现接口。它需要提供接口中所有声明的方法的实现
③接口不能有构造器
④接口中的方法为 public abstract;变量为 public static final
⑤一个类可以实现多个接口
13、== 和 equals 的区别
①== : 它的作用是判断两个对象的地址是不是相等。基本数据类型 == 比较的是值,引用数据类型 == 比较的是内存地址
②equals() : 它的作用也是判断两个对象是否相等
public class test1 {
public static void main(String[] args) {
String a = new String("ab"); // a 为一个引用
String b = new String("ab"); // b为另一个引用,对象的内容一样
String aa = "ab"; // 放在常量池中
String bb = "ab"; // 从常量池中查找
if (aa == bb) // true
System.out.println("aa==bb");
if (a == b) // false,非同一对象
System.out.println("a==b");
if (a.equals(b)) // true
System.out.println("aEQb");
if (42 == 42.0) { // true
System.out.println("true");
}
}
}
14、值传递
【例2】
public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4, 5 };
System.out.println(arr[0]);
change(arr);
System.out.println(arr[0]);
}
public static void change(int[] array) {
// 将数组的第一个元素变为0
array[0] = 0;
}
结果:1 0
原因:array 被初始化 arr 的拷贝也就是一个对象的引用,也就是说 array 和 arr 指向的时同一个数组对象。
因此,外部对引用对象的改变会反映到所对应的对象上。
【例3】
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Student s1 = new Student("小张");
Student s2 = new Student("小李");
Test.swap(s1, s2);
System.out.println("s1:" + s1.getName());
System.out.println("s2:" + s2.getName());
}
public static void swap(Student x, Student y) {
Student temp = x;
x = y;
y = temp;
System.out.println("x:" + x.getName());
System.out.println("y:" + y.getName());
}
}
结果:x:小李 y:小张 s1:小张 s2:小李
原因:方法并没有改变存储在变量 s1 和 s2 中的对象引用。
swap方法的参数x和y被初始化为两个对象引用的拷贝,这个方法交换的是这两个拷贝
15、String不可变但不代表引用不可以变
String str = "Hello";
str = str + " World";
System.out.println("str=" + str);
结果:str=Hello World
16、ArrayList和LinkedList的区别
ArrayList基于数组的数据机构,LinkedList是基于链表的数据结构,所以有以下几种特性:
①对于随机查询,ArrayList比LinkedList快
②对于插入或者删除,LinkedList由于是链表,所以是比ArrayList性能更好。
未完待续~~