目录
1.static成员
1.1static修饰变量
1.2static修饰方法
1.3static成员变量的初始化
2.代码块
2.1普通代码块
2.2构造代码块
2.3静态代码块
3.内部类
3.1实例内部类
内部类对象的创建
3.2静态内部类
静态内部类对象的创建
3.3局部内部类
3.4匿名内部类
4.对象的打印
1.static成员
1.1static修饰变量
static可以用来修饰变量,这种变量叫做静态变量,它处于静态区,不属于某个对象,可以称之为类变量,可以不依赖对象用类名直接调用
比如
class Student{
int num;
static int age;
}
public class Main {
public static void main(String[] args) {
Student.age = 10;
}
}
在这里我们给age进行了赋值操作,可以看到并没有创建对象,直接用类名进行访问
注意:静态变量在内存中的存储只有一份,一个位置修改后,另外一个位置也会做出相应的改动
1.2static修饰方法
这个和static修饰成员变量类似,对于类中用static修饰的方法,我们称之为类方法,同样,他也是不属于任何对象的,可以通过类名调用,处于方法区
比如:
class Student{
int num;
static int age;
public static void goClass(){
}
}
public class Main {
public static void main(String[] args) {
Student.age = 10;
Student.goClass();
}
}
1.3static成员变量的初始化
static成员变量可以就地初始化,也可以通过静态代码块进行初始化,那什么是静态代码块呢?后面回讲到
2.代码块
代码块就是用{}包裹起来的内容
2.1普通代码块
比较少见,是定义在方法内部的代码
比如
public static void goClass(){
{
int x = 10;
System.out.println(x);
}
int x = 123
System.out.println(x);
}
注意:这里再{}中定义的x在{}外将不能够使用,我们在IDEA上尝试,会报错
2.2构造代码块
构造代码块也叫实例代码块,是定义在类内部的代码块,一般用于初始化实例成员变量
比如
class Student{
int num;
static int age;
{
this.num = 10213;
}
}
2.3静态代码块
一般用于初始化静态的成员变量
比如
class Student{
int num;
static int age;
static {
age = 100;
}
}
注意:静态代码块不论你生成多少个对象,只会执行一次,并且会优先于示例代码块和构造方法,因为静态代码块并不依赖于对象,可用上面的静态成员变量理解,静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的
3.内部类
内部类其实就可以理解为在类的内部再创建一个类
3.1实例内部类
还是延续用上面的代码
class Student{
int num;
static int age;
static {
age = 100;
}
{
num = 10213;
}
public static void goClass(){
{
int x = 10;
System.out.println(x);
}
System.out.println(x);
}
class inStudent{
public void a(){
num = 100;
System.out.println(num);
}
//访问外部类中的同名成员变量
int num = 10;
public void b(){
System.out.println(Student.this.num);
}
}
}
在这里面我们定义了一个内部类,我们可以看到内部类中可以直接访问外部类的成员变量,当内部类和外部类变量同名时,可以同外部类名.this.变量名来达到访问外部类目的
内部类对象的创建
Student.inStudent is1= new Student().new inStudent();
//另外一种定义方法
Student s2 = new Student();
Student.inStudent is2 = s2.new inStudent();
这里我们就是创建了一个内部类的对象取名is1 和is2,两种对象的创建方法没用本质上的区别
3.2静态内部类
class Student{
int num;
static int age;
static {
age = 100;
}
{
num = 10213;
}
public static void goClass(){
{
int x = 10;
System.out.println(x);
}
int x = 100;
System.out.println(x);
}
static class sIStudent{
static int age ;
public static void a(){
age = 10;
System.out.println(age);
}
public static void b(){
//System.out.println(Student.this.age);
//这里编译会报错,因为静态方法中不存在this
}
}
}
注意:静态内部类中,只能访问外部类中的静态成员变量(类变量),遵循局部优先,没有this!没有this!!没有this!!!
静态内部类对象的创建
Student.sIStudent is = new Student.sIStudent();
3.3局部内部类
就是定义在外部类的方法或者代码块中的类,一般很少使用
class Student{
int num;
static int age;
static {
age = 100;
}
{
num = 10213;
}
public static void goClass(){
{
int x = 10;
System.out.println(x);
}
int x = 100;
System.out.println(x);
}
public void a(){
class inStudent{
int num ;
public void b(){
num = 10;
System.out.println(num);
System.out.println(this.num);
}
}
}
}
这一段和上面的内部类几乎同理,但是出了这个方法,类中的内容则会无效,并且局部内部类不能被修饰符修饰
3.4匿名内部类
匿名内部类会在接口的时候详细讲解
其实就是类创建的没有名字的一次性使用的对象
4.对象的打印
我们如果对对象直接打印,会得到一串地址,因为对象村的就是一块地址,那我们想直接打印对象中的常量属性,那么应该怎么做呢?答案是:重新toString方法
class Student{
int num = 20;
String name = "123";
static int age = 100;
@Override
public String toString() {
return "Student{" +
"num=" + num +
", name='" + name + ''' +
'}';
}
}
public class Main {
public static void main(String[] args) {
Student student = new Student();
System.out.println(student);
}
}
这里不仅仅可以用这种输出格式,你也可以按照自己的需求,在return中进行修改即可



