1.什么叫面向对象?
写程序的时候围绕一个对象的功能来编写。
1.1面向对象的主要特点:继承、多态、封装(以及抽象)
1.1.1继承extends:子类共享父类成员变量和方法的一种模式,单继承或者多层继承,不能多重继承(只能一个父类)
1.1.2多态:对象在运行期和编译期具有的两种状态
1.1.3封装:对一件物品的描述信息是这个物品所特有的,不能让外界看到的一些成员变量和方法,需要特有的方法访问
1.1.4抽象:定义类时确定的一些行为和动作。
2.面向过程VS面向对象:
通过方法一步步解决问题,看重解决问题的过程 VS 通过把问题分解成各自独立功能的类,看重功能
面向过程是具体化的,流程化的,解决一个问题,你需要一步一步的分析,一步一步的实现。
面向对象是模型化的,你只需抽象出一个类,这是一个封闭的盒子,在这里你拥有数据也拥有解决问题的方法。
3.什么是类?
类是抽象的东西,描述的是一个物品的完整信息
3.1定义一个类:class 类的名称 { //类的成员变量 //类的方法}
类的成员变量描述的是对象的属性,成员方法描述的是对象的行为
3.2.什么是对象?
类的实例即对象;用new来创建对象:new 类的名称();
3.3使用现有类:
同目录下的类,直接使用
不同目录下的类需要导包
3.4成员变量:描述的这个类的一些属性或状态,在类里面创建。可以被public、protected、default、private、static、final修饰;在堆里面创建;系统默认值。
3.5局部变量:方法体内创建,只在局部有效,方法体外是访问不到的。只能被final修饰;在栈里面创建;没有系统默认值,手动赋值。
//基本类型和对象引用的例子
public class test1 {
// 基本类型的成员变量
int size;
boolean b;
String s;// String类为一个封装类,s为一个对象引用
public static void main(String[] args) {
test1 t = new test1();
//成员变量系统赋初值
System.out.println(t.size);
System.out.println(t.b);
System.out.println(t.s);
t.size = 12;
t.b = true;
t.s = "为一个对象引用类型";
System.out.println(t.size);
System.out.println(t.b);
System.out.println(t.s);
}
}
*对象引用:用new关键字创建对象test1,这个对象在内存中存在,用 t 表示在内存中对这个test1类的对象的引用.
4.方法
4.1什么是方法:好似动作,用来完成一系列操作的。
4.2创建方法:
方法修饰符 方法的返回类型 方法名称(方法参数) {
方法体
}
例子:
//基本类型和对象引用的例子
public class test1 {
// 基本类型的成员变量
int add1 = 123;
int add2 = 222;
// 创建一个方法,参数有两个,都为int类型
public void add(int i, int n) {
System.out.print(i + n);
}
public static void main(String[] args) {
test1 t = new test1();//创建实例对象
t.add(t.add1, t.add2);//传入参数
}
}
4.3方法的返回类型多种,主要为
(1)void ,无返回值
(2)返回值可以是任意类型,如String、Boolean、int,但需要加return返回值
(3)可以是null,但必须是对象类型(非基本类型),基本类型不能返回null
(4)返回值为基本类型的时候,只要能够自动转换就可返回。
4.4方法的参数:
(1)可以是基本数据类型,也可以是对象引用类型。
(2)每个参数都有完整的声明改变量的形式
(3)参数可以多个
(4)main为一个方法,参数为String[] args,特殊的方法
*方法的调用问题:方法定义在对象里,只能通过其对象引用来调用,通过对象引用名称,加上“.",再加上方法名称来访问
4.5方法参数的传递
传递类型为基本类型,传递的是该类型的值
public class test1{
public void add(int i) {
i=i+1;
System.out.println(i);
}
public static void main(String[] args) {
int size=44;
test1 t=new test1();
System.out.println(size);
t.add(size);
System.out.println(size);
}
}
在参数为基本数据类型进行传递到时候,是传递的这个值的备份,无论方法怎么改变这个备份,都不是操作原来的数据,所以原来的值是不会改变的。
传递的参数为对象引用类型的时候,也是利用传值的方式进行。
public class test1 {
public static void changeString(String str) {
str = new String("hi");
str = str + "china!";
}
public static void main(String[] args) {
// 创建一个对象类型
String s = new String("hello");
System.out.println("before:" + s);
changeString(s);
System.out.println("changeString:" + s);
System.out.println("after:" + s);
}
}
当把对象引用传递到一个方法后,这个方法可以改变这个对象的属性,并能够返回相应的改变。但这个对象引用指向这个字符串s是永远不会改变的。这里传递对象引用后,又通过这个引用创建了一个新的String类型的字符串,这两个字符串在内存中当然不是同一个。
思考一下这个:
public class test1{
public int i = 1;
public void add(int j) {
this.i=this.i+j;
System.out.println(this.i);
}
public void add(test1 test1) {
test1=new test1();
test1.i = test1.i + 1;
System.out.println(test1.i);
test1.i = test1.i - 1;
}
public static void main(String[] args) {
int size=44;
test1 t=new test1();
System.out.println(t.i);
t.add(1);
System.out.println(t.i);
// t.i = 5;
t.add(t);
System.out.println(t.i);
}
}
5.对象引用的使用:
什么是对象引用?——该引用名称指向内存中的一个对象,通过调用该引用即可完成对该对象的操作。
如果使用不当,会在通过引用进行调用时出现问题:不存在对象、空引用、对象间的比较......
5.1调用不存在的对象或者成员变量:
如果调用的对象或成员变量没有创建,那么该编译的时候编译器将出现错误——声明
5.2调用对象为null的引用:
空指针错误:NullPointException:任何操作的对象的值为null的时候都将出现空指针错误。该错误是运行期的错误,编译时不会进行提示。
成员变量和方法是属于对象的,即new出来的,如果使用空引用进行调用,只要所调用的成员变量或方法已经在代码中进行声明,编译就不会报错。
*在声明一个对象引用后尽量为其赋值一个初值。
5.3对象引用间的比较:比较的是这两个对象的引用(内存中的一个地址)
6.this:表示自己、本身的意思,当前对象的本身;
在方法中用于指代/调用这个方法的对象。this只能在方法中使用,不能在修饰为static的方法里使用。