35.this关键字
对象的打印,打印出来的结果是逻辑地址,对对象来说是唯一的
对象方法:不带static的类的方法
this只能存在于对象方法中使用
this就是调用这个方法的对象的引用(this也可以不写)
对于类的对象来说,属性是每个对象都有一份,是数据隔离的,但是方法是多个对象共享,不同的对象调用这个方法的时候用this来区分不同对象的数据,this是可隐藏的
本类的对象方法中可以直接调用对象方法,this就是调用对象方法的对象
this在封装中的使用,用于区分同名的属性和局部变量的名字。
class Student{
private String name; private int age; public void sleep(){ //this表示调用对象方法的对象的引用 System.out.println(this.name+"在睡觉"); } public void setName(String name){ this.name=name; } public void setAge(int age){ this.age=age; } public void playGame(){ System.out.println(this.name+"在玩游戏"); //本类对象方法中调用对象方法,this表示调用对象方法的对象的引用,this都可以省略 this.sleep(); } } public class TestStudent{ public static void main(String[] args){ Student a=new Student(); a.setName("Bob"); a.setAge(13); a.sleep(); a.playGame(); } }36.构造器
用于创建对象的方法叫做构造器
语法:
/**
权限修饰符 类名(数据类型1 变量名1,....){ } */ public Student(){ }构造器本身是一个方法,没有返回值,没有void,构造器的方法名必须和类名一致,在方法中定义要初始化的参数列表
特点:
(1)有参数的构造器可以给属性初始化,可以允许方法重载
(2)一个类存在参数的构造器那么默认构造器就别覆盖,如果向使用默认构造器,需要显示的定义(写出来)
(3)构造器之间的调用(减少代码的重复性),同一个类中构造器可以互相调用,如果在构造器中调用其他构造器来创建对象,只初始化,需要用this(....)l来调用;注意this(....)必须放在构造器的第一行
class Student{
String name; int age; int gender; /** 权限修饰符 类名(数据类型1 变量名1,....){ } */ //显示的定义默认构造器 public Student(){ } //有参数的构造器那么默认构造器就被覆盖,如果想使用默认构造器需要显示的定义 public Student(String name){ this.name=name; } public Student(String name,int age){ this.name=name; this.age=age; System.out.println(this.name+this.age+"岁了"); } public Student(String name,int age,int gender){ this(name,age);//构造器内调用构造器方法只初始化,需要用this(...)来调用 this.gender=gender; System.out.println(this.name+this.age+"岁了性别"+this.gender); } } public class TestStudent1{ public static void main(String[] args){ Student a=new Student("Bob",13); Student b=new Student(); System.out.println(b); Student c=new Student("Alex",10,1); } }37.static静态关键字
(1)static修饰在属性上
语法:static 数据类型 变量名
使用static修饰的属性我们认为是类的属性,静态属性,不带static修饰的属性是对象的属性
特点:类的属性访问:第一种方式:类名.类属性(推荐使用)
第二种方式:对象实例.类属性
类属性的当前的class文件加载进入jvm类属性就被初始化了,jvm执行完毕才销毁,class文件除了jvm,类属性也就消失了
类属性可以被每一个对象共享
class Student{
String name; int age; //static 数据类型 变量名 static int sCount; public Student(){ } public Student(String name){ this.name=name; } public Student(String name,int age){ this(name); this.age=age; } } public class TestStudent2{ public static void main(String[] args){ Student a=new Student("Bob",13); // 第二种方式:对象实例.类属性 a.sCount++; Student b=new Student(); b.sCount++; Student c=new Student("Alex",10); c.sCount++; //类的属性访问:第一种方式:类名.类属性(推荐使用) System.out.println(Student.sCount); } }(2)static修饰在方法上
语法:
public static 返回值(void) 方法名(数据类型 变量名,...){
方法体; [return 结果;] }static修饰在方法上就是类方法,类方法的特点:类方法的访问可以通过类名.类方法,还可以通过对象访问;类方法当前的class文件加载进入jvm类方法就被初始化了,jvm执行完毕,class文件除了jvm,类方法也就消失了;类方法和对象方法都是被对象共享的,类方法初始化很早,jvm加载这个类的时候,这个方法就初始化了,对象方法也是早早地进入了jvm,但是不一定被启用了,只有先创建了对象,才有可能使用这个方法;类方法不能访问对象属性和对象方法。只能访问类属性和类方法;对象方法可以调用对象属性、对象方法、类属性、类方法
类方法最常见的用法就是工具类的定义
class Student{
String name; int age; //static 数据类型 变量名 static int scount; /** static修饰方法,就是类方法,语法: public static 返回值(void) 方法名(数据类型 变量名,...){ 方法体; [return 结果;] } */ public void learn(){ System.out.println(this.name+"在学习"); } public static int getScount(){ return scount; } } public class TestStudent3{ public static void main(String[] args){ //访问类方法的第一种方式:类名.方法名() System.out.println(Student.getScount()); Student a=new Student(); //访问类方法:对象实例.方法名() int scount=a.getScount(); System.out.println(scount); } }(3)静态代码块
语法
class A{
static{ } }特点:静态代码块主要用于初始化资源;静态代码块在main之前执行;静态代码块不能访问对象属性和方法,可以访问范围内的类属性(必须先定义)或类方法
public class TestStudent4{
String name; int age; static int scount; /*静态代码块;用于初始化资源,在main的前面,可以访问范围内的类方法和先定义的类属性,不能访问对象属性和对象方法 class A{ static{ } } */ static{ System.out.println(scount); } public static void main(String[] args){ System.out.println("静态代码块"); } }38.单例模式
设计模式:一共有23种设计模式,设计模式就是有经验的前人通过时间总结下来被大家公认的代码设计思想
步骤:
(1)私有化构造器
(2)定义一个类方法用于获得单例的对象,返回值是这个类的类型
(3)在类种提供一个Singleton类型的类属性
(4)实现getinstance这个类方法
懒汉模式/饿汉模式
class Singleton{
/** static Singleton s; private Singleton(){ } //懒汉模式 public static Singleton getInstance(){ if(s==null){ s=new Singleton; } return s; } */ static Singleton s=new Singleton(); private Singleton(){ } //饿汉模式 public static Singleton getInstance(){ return s; } } public class TestSingleton{ public static void main(String[] args){ Singleton s=Singleton.getInstance(); System.out.println(s); Singleton s1=Singleton.getInstance(); System.out.println(s1); } }