文章目录
系列文章目录
第一章 认识类与对象(一)
第二章 认识类与对象(二)
前言
上一篇初步介绍和认识了什么是类,什么是对象,this的用法和构造方法的使用。这一篇继续讲类和对象,加深对类和对象的理解。
一、封装
1.1封装的概念
面向对象程序的三大特性:封装,继承,多态。首先理解何为封装。
简单来讲,封装就是给复杂的代码套上一个简单的壳子,将内部复杂的方法实现和对象属性隐藏起来,仅通过接口来和对象交互。
1.2访问限定符
java共有4种访问限定符:public,private,protected 和 default。
范围 | public | protected | default | private |
同一包中同一类 | √ | √ | √ | √ |
同一包中不同类 | √ | √ | √ | |
不同包中的子类 | √ | √ | ||
不同包中的非子类 | √ |
public , 公共的,大家都可以用。
default , 默认的,属于隐藏字符,什么都不写的默认权限。
private , 私密的,只有自己可以用。
封装从语法上将就是被private 修饰的成员变量或成员方法,只能在当前类中使用。如果想要调用被private 修饰的成员变量或成员方法,可以使用setter 和 getter。
代码如下:
import java.util.Scanner; public class Student { private String name = "zhangsan"; public String getName() { return name; } public void setName(String name) { this.name = name; } public void test1() { System.out.println("名字是"+name); } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String a = scanner.next(); Student student = new Student(); System.out.println(student.getName()); student.test1(); } }
快捷键是: 鼠标右键——>Generate——>Getter and setter ——>Ctrl或shift选中——>OK
1.3 包和包的概念
1. 类似于文件夹的作用,目的是更好的管理和组织类。在不同的包中可以创建同名的类。
2.使用不同包中的类,需要导包。在导包时可以使用import语句导入包。
3.除此之外,使用 * 也可以导入包,例如
import java.util.*;
* 是通配符,此时可以使用 util 中的所有类。但不建议使用,因为存在不同包中有同名类的情况,如果使用 * ,会出现冲突。
4.我们在定义包时,尽量指定成唯一的名字,通常使用公司域名的颠倒顺序,例如 com.baidu.www,注意全小写。
5.访问权限修饰限定符 :ALT + 回车 导包
1.4 常见的包
1.java.lang:系统常用基础类
2.java.lang.reflect:java反射编程包
3.java.net:网络编程开发包
4.java.sql:进行数据库开发的支持包
5.java.util:java提供的工具程序包
6.java.io:I/O编程开发包
二、static成员
2.1 认识static
1.如果在不同的对象中有一个相同的,大家都会用到的成员变量,我们可以将这个变量用static修饰,这种被static修饰的变量叫做静态成员变量,也可以叫做类成员变量,顾名思义,只能在类中使用。它不属于某个具体的对象是所有对象共享的。静态成员不通过对象访问,通过类访问就可以了。
2.被static修饰的方法称为静态成员方法,静态成员是靠静态方法来访问的。静态方法当中,不能调用非静态的成员变量或非静态的成员方法。
代码如下:
public class Student { public static String classroom = "1101"; public static String getClassroom() { return classroom; } public static void main(String[] args) { System.out.println(getClassroom()); } }
3.静态方法不包含this ,因为this作为非静态方法中的参数,无法被静态方法调用,所以在静态方法中也无法传递this的引用。
4.静态方法可以通过类名(...)的方式调用。
2.2 static成员变量初始化
我们知道,普通成员变量一般使用构造方法来初始化,但构造方法初始化的是与对象相关的实例属性,静态成员变量自然无法使用构造方法。而静态成员变量的初始化分为两种:就地初始化和静态代码块初始化。
1.就地初始化 :在定义时直接给初始值
public class Student { public static String classroom = "1101"; }
2.静态代码块初始化
三.代码块
3.1 认识代码块
使用{}定义的一段代码被称为代码块。代码块可分为四种:
1.普通代码块
2.构造块
3.静态代码块
4.同步代码块
3.2 普通代码块
定义在方法中的代码块,不常见
public static void main(String[] args) { { int a = 1; System.out.println("a = "+a); } int b = 10; System.out.println("b = "+b); } }
3.3 构造代码块
定义在类中的代码块,也叫实例代码块,构造代码块一般用于初始化实例成员变量。
public class Student { private String name ; public int age; public static String classroom; public Student() { System.out.println("这是构造方法"); } //构造代码块 { this.name = "zhangsan"; this.age = 18; } public void test1() { System.out.println("名字是"+name+" 年龄"+age); } public static void main(String[] args) { Student student = new Student(); student.test1(); } }
位置在类的里面,方法的外面,也被叫做实例化代码块。当实例化对象时,构造代码块被执行。当第二次实例化一个对象时,静态代码块不再执行。
3.4 静态代码块
使用static定义的代码块称为静态代码块,一般用于初始化静态成员变量,类加载的时候被调用。
public class Student { private String name ; public int age; public static String classroom; //静态代码块 static { classroom = "build 110"; System.out.println("启动静态代码块"); } public static void main(String[] args) { Student student = new Student(); } }
执行顺序:
1.静态的先执行
2.然后执行构造代码块
3.在执行对应的构造方法
注意:静态代码块只执行一次。
四.对象的打印
public class Student { private String name ; public int age; public Student(String name, int age) { this.name = name; this.age = age; } public static void main(String[] args) { Student student = new Student("zhangsan",18); System.out.println(student); } }打印结果:
我们发现 程序最终打印了个地址,这个地址是如何得到的呢?
我们通过打印的底层代码,发现:
是因为 toSrting方法,程序最终得到一个地址。换言之,我们只要重写toString方法,最终就能得到我们想要的结果。
public class Student { private String name ; public int age; public Student(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } public static void main(String[] args) { Student student = new Student("zhangsan",18); System.out.println(student); } }
重写toString方法快捷键:
鼠标右键——>Generate——>toString ——>Ctrl或shift选中——>OK