一、面向对象(OPP)
关注对象与对象之间如何协助完成这件事。
对象:属性+行为
类:对一个实体对象进行描述。类名(大驼峰)
类:字段/成员变量/成员属性(定义在类中方法外)+方法
通常1个java文件一个类。
每一个类对应一个.class文件(字节码文件)。类里面的方法不加static。
引用指向对象,实例化对象。类的实例化·。可以使用new关键字实例化创建多个对象。每一个对象都有相同的属性和方法。用.访问属性·和方法。类是一个自定义类型。
局部变量使用·必须·要初始化。
成员变量可以无,在没有初始化时都有一个默认值,引用类型为null,int为0,char:‘\u0000’;
boolean:false
成员变量在定义时初始化为就地初始化。不好。
this
用this解决局部变量给自己赋值,成员变量没被赋值的情况。
谁调用了类的实例化对象方法,这个this就是谁。当前对象的引用。this只能在成员方法中使用。
this.属性
this.方法名:在一个方法中调用另一个成员方法。
this()调用构造方法,必须第一行。不能形成环。
构造方法
实现成员变量初始化。
方法名{参数列表}{方法体}
没有返回值,方法名必须与类名一致。可以有多个。
没有写构造,编译器生成不带参数。有就不写。
Student student1 = new Student();
Student student2=new Student(23);
写带参数构造方法,用this对成员变量赋值。
一个对象的产生至少有两部:
1.为对象分配内存
2.调用合适的构造方法。(至少一个)
自动构建构造方法,鼠标右键-》generate->constructor->然后选中所需要构建的构造方法。
修改类名:鼠标右键-》
构造方法不能自己调用自己。this(参数)只能在构造方法中才可以调用。而且只能放在构造方法的第一行。
public Student() {
this(34,"sdh");//先调带2个参数的构造方法,然后再往下运行。
System.out.println("hdsgdsgh");
}
二、封装
default默认权限,什么都不写的时候。
protected受保护的。
privite是私有的,一般来做封装。把类的细节封装,只有统一包中同一类才可访问。
用set和get方法提供公开的接口。
自动生成set和Get调用私有属性的方法。generate->选中如下即可
包
java中组织类的一种方法。
导包:
import java.util.Arrays;
import java.util.Date;
Date date =new Date();
int[] arr={1,3,4,5,6,2,52};
Arrays.sort(arr);
可以将以上的导包简化为:
*是通配符,可以充当任何类。不是导util下所有类,而是用到哪个类导哪个类。(最好还是自己指定,不用通配符,否则如果两个使用了通配符都有同一个包不好搞)
import java.util.*;
Date date =new Date();
int[] arr={1,3,4,5,6,2,52};
Arrays.sort(arr);
注意如果导入的两个包通配符底下都有相同的包,如Data(),这时就必须自己指定是要用哪个包中的Date()。
必须自己指定:
package:声明当前java文件在哪个包当中。
自定义包:包名必须小写,而且与路径匹配。
包访问权限:
如果是同一个包下面调用对象的属性或方法不会报错(同一包中的类的访问权限)。如果是不同的包,权限不是public调用属性或方法就要报错。
有public
无:
static
在方法当中定义的变量是局部变量,而静态的变量属于类变量。随着类的加载而被创建,而局部变量是调用该方法的时候,才创建的。
所以,此时两种变量的性质是冲突的。Java当中不允许定义局部的静态变量。
1.修饰成员变量
- private int age;//普通成员变量,每个对象都有一份(方法外,类里)
- public static String classRoom=“3784”;//静态成员变量,所有对象共用一份。直接初始化。
静态成员的访问直接用类名.的方式进行访问。(静态成员变量不属于对象)
它存储在方法区,生命周期伴随类的一生。
- 局部变量:方法内部定义的方法。
引用只能指向对象,不能指向引用。一个引用不可以指向多个对象,只能指向一个。
输出:教室号,不会空指针异常。因为classRoom不在对象中,不属于对象。
student2=null代表不指向任何对象。
2.修饰方法
方法:
用类名调用:或是直接调:
静态方法内部不能调用非静态方法。因为静态方法不依赖对象但是非静态方法依赖。因此静态方法内部不能够使用this。静态方法里不能用成员变量,静态方法只能用静态属性。
静态的在加载时就初始化。静态的是最先被执行的。
初始化
就地初始化和静态代码块初始化
static{
classRoom="3773";//静态变量初始化
}
静态代码初始化在就地初始化前,按就地初始化的值。之后,按静态代码块初始化的值。
结果为:3784
static{
classRoom="89888";
System.out.println("静态代码块");
}
public static String classRoom="3784";//静态成员变量,所有对象共用一份。
结果为89888
public static String classRoom="3784";//静态成员变量,所有对象共用一份。
static{
classRoom="89888";
System.out.println("静态代码块");
}
有继承的初始化
代码块
代码块调用顺序:静态代码块-》构造代码块-》构造方法
注意:如果是调用带参数的构造方法,由于构造代码块一定比构造方法更先执行,所以,最后调用对象的值是带参数构造方法所赋值的。
构造代码块必须在实例化对象的时候才能执行,没有实例化对象只执行静态代码块。没有调用类(加载类)就啥也没有。
对象的打印
Student student1 = new Student(88,"李四");
System.out.println(student1);//打印为Student@4eec7777
在类里面写toString:
public String toString(){
return "lixi";
}
然后打印为lixi
编译器可以生成:generate->tostring即可
重写tostring,对象的打印。
@Override//注解
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
继承和多态
继承:对共性进行抽取,把抽取出来的共性放到父类中。好处:达到了代码的复用。
在子类中时,如果子类和父类有相同的属性,this关键字优先指子类,用super指父类。
方法的重载可以不在同一个类中。
子类继承父类,子类需要先帮助父类进行初始化成员构造。
子类在完成构造之前,必须先完成父类的构造。
然后可以在构造方法中初始化自己的成员。super构造方法必须第一行。
在调用有参数的子类构造方法。
静态的不会被执行第二次
final关键字
用其修饰,使变量变为常量。定义的时候可以不初始化,后面初始化也可。但是只能初始化一次。被其修饰的不能够被继承。
java不支持多继承。
总结
出来混,迟早要还的!!!
实习的面试是很简单的,不要觉得自己很自律,从每一天找借口不完成每一天的任务时,你就不是一个自律的人!!!
除非是不可抗力的因素。