1、类和对象的概念
-
对象,万物皆对象。指的是生活中可见的任意的实体都可以看作对象。对象是具体的。
-
对象的描述:属性,指的是固有的一些特性。方法,指的是动态的一些特性。
-
类,具有相同属性和方法的对象的集合。抽象的。
-
类和对象的关系:类规定了对象要有的属性和方法,可以看成是一个模板。
-
对象就是类的具体实现。
-
-
生活中的一个实体,应该对应程序中的一个对象。
2、构造方法
-
构造方法的作用
-
创建对象
-
给属性赋初值
-
-
语法
-
访问修饰符一般为public
-
方法名和类名相同,包括大小写
-
没有返回值,也没有void
-
可以有参数
-
方法体中一般只用于给属性赋值
-
-
调用
-
通过new关键字调用构造方法,不可以通过对象去调用
-
new操作就是申请空间创建对象的过程
-
-
特点
-
可以有多个,通过参数列表区分
-
java类本身会提供一个无参的构造方法,隐藏的方法
-
一旦我们手动编辑了一个构造方法,java类不再提供。
-
建议给每个类加一个无参构造方法
-
3、方法重载
-
指的是在一个类中,出现多个重名的方法overload
-
方法名相同
-
参数列表必须不同,个数、类型或者顺序不同,跟参数名称没有任何关系,和方法体没有任何关系
-
与返回值没有关系,和访问修饰符也没有关系
-
调用时根据参数来区分
-
4、静态的static
-
用于修饰类的成员的,比如方法和属性
-
被static修饰的成员,称为类级别的成员随着类的加载而加载,优于对象存在的
-
静态成员只有一份,属于整个类,属于所有的对象,共享
-
我们可以通过类名.形式访问,也可以通过属性.的形式访问,访问的都是同一个变量
-
静态方法中只能访问静态变量,不能访问普通变量
-
普通方法中可以访问静态变量
public class Student { //属于对象的属性 String name; double score; // 静态变量,类级别的变量 static double avg; public void showInfo(){ System.out.println(avg); System.out.println(name + ":" + score); } //静态方法,类级别的方法 public static void showAvg(){ System.out.println("平均分是" + avg); //静态变量随着类的加载而加载 //System.out.println(name); } public static void main(String[] args) { Student s1 = new Student(); s1.name = "张三"; s1.score = 100; Student s2 = new Student(); s2.name = "李四"; s2.score = 95; //可以通过类名.的形式直接访问静态变量 Student.avg = (s1.score + s2.score) /2; System.out.println(Student.avg); //也可以通过对象的形式去访问 访问的是同一个值 System.out.println(s1.avg); System.out.println(s2.avg); Student.showAvg(); s1.showAvg(); } }
5、最终的final
-
final可以修饰变量
-
修饰基本数据类型,值不可改变
-
修饰引用数据类型,地址不可以改变
//修饰基本数据类型 代表值不可更改 final int num = 1; final Student s3 = new Student(); s3.name = "张三"; s3.name = "李四"; //修饰引用数据类型,代表地址不可更改 //s3 = new Student();
-
-
final修饰方法,代表方法不可以被重写
-
final修饰方法,方法不可以被继承
-
final的常用场景,和static关键字一起修饰常量
//常量,常量的名称全大写,多个单词用下划线区分 public static final double PI = 3.14;
6、this关键字
-
指向当前对象,可以用于区分同名的局部变量和成员变量
-
局部变量和成员变量可以重名,局部变量优先级较高
-
当局部变量和成员变量重名时,如果想要调用成员变量,可以使用this关键字
-
public Student(String name) { this.name = name; }
-
-
this()可以调用本类的其他构造方法,如果要使用this()调用构造方法,必须放在方法的第一句话
-
public Student(String name) { this.name = name; } public Student(String name,int age){ this(name); //使用this调用构造方法 this.age = age; } public Student(String name,int age,String sex){ this(name,age); this.sex = sex; }
-
-
在能区分成员变量和局部变量时this可以省略,否则一定不能省。
7、封装
-
什么是封装:将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对信息的操作和访问
-
为什么使用封装:
-
我们在类中定义的成员变量可以直接使用”对象名.属性“的形式访问,不合理的值无法做出限制或者限制比较麻烦,这样是不安全的
-
我们在类中定义的属性和方法可以随便被其他类或对象访问,这样也是不安全的
-
-
封装的实现
-
包:为了更好的管理类,对封装提供支持,可见度控制机制
-
访问修饰符
-
public : 所有类都可以访问
-
protected:同包中的类和其他包中的子类可以访问
-
默认的(缺省的):同包才访问
-
private:只有自己可以访问
-
-
方法:把具体的实现业务逻辑封装起来
-
-
属性封装步骤:
-
属性私有化private
-
生成get/set方法,get取值,set赋值
-
按照需求在方法中加入控制语句
public void setName(String name){ if (name.length() > 10){ System.out.println("请输入合理的姓名"); return; } this.name = name; } public String getName(){ return name; } public void setAge(int age){ if (age < 0){ this.age = 0; }else { this.age = age; } } public int getAge() { return age; }
-
8、初始化块
-
初始化块是java类中出现的第四类成员(前面有成员变量、成员方法、构造方法)
-
其功能与构造方法类似,可以对java对象进行初始化操作
-
public class Dog{ private String name; // 名字 { name = "大黄"; } }
-
执行顺序:(创建成员变量,执行初始化块)——>执行构造方法
-
初始化块特点:
-
可以包含任何可执行语句,包括变量定义、调用方法、访问成员变量、分支、循环等
-
一个类中可以出现多个初始化块(如果有多个,按书写顺序从上到下执行)
-
创建对象时,系统默认调用,无法显示调用
-
-
初始化块和构造方法的比较
-
在某种程度上,初始化块可以看成是构造方法的补充,都是针对对象进行初始化操作
-
不同的是,初始化块是一段固定的代码,不接受参数,也没有返回值,对所有对象的处理完全相同
-
如果有一段代码无需接收任何参数,对所有对象的处理完全相同,就可以将其放入初始化块
-
-
静态初始化块
-
使用static修饰的初始化块
-
类初始化块与其他静态成员一样,随着类的加载而加载,比普通初始化块先执行
-
类加载就是在编译之后,代码(main方法)执行之前
-
-
静态初始化块、静态方法等只能访问静态成员(因为静态成员初始化时,普通属性和方法还没有被初始化)
-
-
执行顺序
-
(静态变量、静态初始化块)>(成员变量,初始化块)>构造方法
-
静态变量和静态初始化块的执行顺序取决于他们的书写顺序
-
(成员变量,初始化块)的执行顺序取决于他们的书写顺序
-
-
静态成员(被static修饰的)在类被编译时随着类的加载而加载;普通成员(没有被static修饰,属于对象),在创建对象时被创建