目录
this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。
注意:this引用的是调用成员方法的对象
- public static void main(String[] args) {
- int a;
- System.out.println(a);
- }
- // Error:(26, 28) java: 可能尚未初始化变量a
构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。
特性
问题:为什么局部变量在使用时必须要初始化,而成员变量可以不用呢?
要搞清楚这个过程,就需要知道 new 关键字背后所发生的一些事情:
在程序层面只是简单的一条语句,在JVM层面需要做好多事情,下面简单介绍下:
注意:代码编译完成后,编译器会将所有给成员初始化的这些语句添加到各个构造函数中
static修饰的成员变量,称为静态成员变量,静态成员变量最大的特性:不属于某个具体的对象,是所有对象所共享的。
【静态成员变量特性】
被static修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的
【静态方法特性】
注意:静态成员变量一般不会放在构造方法中来初始化,构造方法中初始化的是与对象相关的实例属性
静态成员变量的初始化分为两种:就地初始化 和 静态代码块初始化。
使用 {} 定义的一段代码称为代码块。根据代码块定义的位置以及关键字,又可分为以下四种:
普通代码块:定义在方法中的代码块。
- public class Main{
- public static void main(String[] args) {
- { //直接使用{}定义,普通方法块
- int x = 10 ;
- System.out.println("x1 = " +x);
- }
- int x = 100 ;
- System.out.println("x2 = " +x);
- }
- }
这种用法较少见
构造块:定义在类中的代码块(不加修饰符)。也叫:实例代码块。构造代码块一般用于初始化实例成员变量。
-
- class Student {
- //实例成员变量
- private String name;
- private String gender;
- private String sex;
- private int age;
- private double score;
-
- public Student() {
- System.out.println("I am Student init()!");
- }
-
- //实例代码块
- {
- this.name = "bit";
- this.age = 12;
- this.sex = "man";
- System.out.println("I am instance init()!");
- }
-
- public void show() {
- System.out.println("name: " + name + " age: " + age + " sex: " + sex);
- }
- }
-
- public class Main {
- public static void main(String[] args) {
- Student stu = new Student();
- stu.show();
- }
- }
- // 运行结果
- I am instance init()!
- I am Student init()!
- name: bit age: 12 sex: man
使用static定义的代码块称为静态代码块。一般用于初始化静态成员变量。
- public class Student{
- private String name;
- private String gender;
- private int age;
- private double score;
- private static String classRoom;
- //实例代码块
- {
- this.name = "bit";
- this.age = 12;
- this.gender = "man";
- System.out.println("I am instance init()!");
- }
- // 静态代码块
- static {
- classRoom = "bit306";
- System.out.println("I am static init()!");
- }
- public Student(){
- System.out.println("I am Student init()!");
- }
- public static void main(String[] args) {
- Student s1 = new Student();
- Student s2 = new Student();
- }
- }
注意事项
内部类出现的意义
当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么这个内部的完整结构最好使用内部类。
内部类的定义
在 Java 中,可以将一个类定义在另一个类或者一个方法的内部,前者称为内部类,后者称为外部类。内部类也是封装的一种体现。
【注意事项】
根据内部类定义的位置不同,一般可以分为以下几种形式:
注意:内部类其实日常开发中使用并不是非常多,大家在看一些库中的代码时候可能会遇到的比较多,日常开始中使用最多的是匿名内部类。
即未被static修饰的成员内部类。
注意事项:
被static修饰的内部成员类称为静态内部类。
【注意事项】
【注意事项】
- public class Person {
- String name;
- String gender;
- int age;
-
- public Person(String name, String gender, int age) {
- this.name = name;
- this.gender = gender;
- this.age = age;
- }
-
- public static void main(String[] args) {
- Person person = new Person("Jim", "男", 18);
- System.out.println(person);
- }
- }
- // 打印结果:day20210829.Person@1b6d3586
如果想要默认打印对象中的属性该如何处理呢?答案:重写toString方法即可。
- public class Person {
- String name;
- String gender;
- int age;
- public Person(String name, String gender, int age) {
- this.name = name;
- this.gender = gender;
- this.age = age;
- }
- @Override
- public String toString() {
- return "[" + name + "," + gender + "," + age + "]";
- }
- public static void main(String[] args) {
- Person person = new Person("Jim","男", 18);
- System.out.println(person);
- }
- }
- // 输出结果:[Jim,男,18]
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行 交互
作用:访问权限用来控制方法或者字段能否直接在类外使用
【Java提供的四个访问限定符号如下】
【说明】
为了更好的管理类,把多个类收集在一起成为一组,称为软件包。
比如:为了更好的管理电脑中的歌曲,一种好的方式就是将相同属性的歌曲放在相同文件下,也可以对某个文件夹下的音乐进行更详细的分类。
基本规则
面向对象思想中提出了继承的概念,专门用来进行共性抽取,实现代码复用。
继承(inheritance)机制:是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特 性的基础上进行扩展,增加新功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构, 体现了由简单到复杂的认知过程。继承主要解决的问题是:共性的抽取,实现代码复用。
Java继承语法
在Java中如果要表示类之间的继承关系,需要借助extends关键字,具体如下:
- 修饰符 class 子类 extends 父类 {
- // ...
- }
子类中访问父类的成员变量
【注意】
父子父子,先有父再有子,即:子类对象构造时,需要先调用基类构造方法,然后执行子类的构造方法。
super和this
【相同点】
【不同点】
不同包的子类访问protected成员
一般我们不希望出现超过三层的继承关系
final关键可以用来修饰变量、成员方法以及类。
修饰变量或字段,表示常量(即不能修改) -- 和C++中的const关键字类似
修饰类:表示此类不能被继承
修饰方法:表示该方法不能被重写
具体点就是去完成某个行为,当不同的对象去完成时会产生出不同 的状态。
【不能重写的场景】
【方法重写规则】