实例方法与静态方法区别

182 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第27天,点击查看活动详情

哈喽,大家好!我是Why,一名在读学生,目前刚刚开始进入自己的编程学习生涯。虽然学习起步较晚,但我坚信做了才有0或1的可能。学了一段时间以后也是选择在掘金上分享自己的日常笔记,也希望能够在众多道友的大家庭中打成一片。 本文主要讲解* 实例方法与静态方法区别*,如果大家读后觉得有用的话,还请大家多多支持博主:欢迎 ❤️点赞👍、收藏⭐、留言💬 ✨✨✨个人主页:JinHuan

实例方法与静态方法区别
 /*
     关于方法来说,什么时候定义为实例方法?什么时候定义为静态方法?
         有没有参考标准。
 ​
         此方法一般都是描述了一个行为,如果说该行为必须由对象去触发。
         那么该方法定义为实例方法。
 ​
         参考标准:
             当这个方法体当中,直接访问了实例变量,这个方法一定是实例方法。
 ​
             我们以后开发中,大部分情况下,如果是工具类的话,工具类当中的方法
             一般都是静态的。(静态方法有一个优点,是不需要new对象,直接采用类名
             调用,极其方便。工具类就是为了方便,所以工具类中的方法一般都是static的。)
 ​
             什么是工具类?????
                 以后讲。(工具类就是为了方便编程而开发的一些类。)
     
     类 = 属性 + 方法
         属性描述的是:状态
         方法描述的是:行为动作
     
     一个方法代表了一个动作。
 ​
     什么时候方法定义为实例方法?
         张三考试,得分90
         李四考试,得分100
         不同的对象参加考试的结果不同。
         我们可以认定“考试”这个行为是与对象相关的行为。
         建议将“考试”这个方法定义为实例方法。
 */
 public class StaticTest05{
     public static void main(String[] args){
         User u = new User();
         System.out.println(u.getId()); //0
 ​
         //User.getId();
 ​
         User.printName2();
 ​
         User x = new User();
         x.printName1();
 ​
         // 访问T的id怎么访问
         /*
         T t = new T();
         System.out.println(t.id);
         */
 ​
         User y = new User();
         y.printName1();
     }
 }
 ​
 class T{
     // 实例变量
     int id;
 }
 ​
 // 实例变量访问的语法机制是什么?
 // 语法:引用.实例变量名
 class User{
 ​
     // 实例变量,需要对象
     private int id;
 ​
     // 实例变量
     private String name; // 首先先分析的是,这个name是对象级别的,一个对象一份。
 ​
     //分析这个方法应该定义为实例方法还是静态方法呢?
     // 打印用户的名字这样的一个方法。
     public void printName1(){ 
         System.out.println(name);
     }
 ​
     public static void printName2(){
         // 输出的是一个对象的name
         //System.out.println(name);
     }
 ​
     public void setId(int i){
         id = i;
     }
 ​
     public int getId(){
         return id;
     }
 ​
     /*
     public static int getId(){
         return id;
     }
     */
 }
静态代码块
 ​
 /*
     1、使用static关键字可以定义:静态代码块
     2、什么是静态代码块,语法是什么?
         static {
             java语句;
             java语句;
         }
     3、static静态代码块在什么时候执行呢?
         类加载时执行。并且只执行一次。
         静态代码块有这样的特征/特点。
 ​
     4、注意:静态代码块在类加载时执行,并且在main方法执行之前执行。
 ​
     5、静态代码块一般是按照自上而下的顺序执行。
 ​
     6、静态代码块有啥作用,有什么用?
         第一:静态代码块不是那么常用。(不是每一个类当中都要写的东西。)
         第二:静态代码块这种语法机制实际上是SUN公司给我们java程序员的一个特殊的时刻/时机。
         这个时机叫做:类加载时机。
 ​
     具体的业务:
         项目经理说了:大家注意了,所有我们编写的程序中,只要是类加载了,请记录一下
         类加载的日志信息(在哪年哪月哪日几时几分几秒,哪个类加载到JVM当中了)。
         思考:这些记录日志的代码写到哪里呢?
             写到静态代码块当中。
         
 */
 public class StaticTest06{
 ​
     // 静态代码块(特殊的时机:类加载时机。)
     static {
         System.out.println("A");
     }
 ​
     // 一个类当中可以编写多个静态代码块
     static {
         System.out.println("B");
     }
 ​
     // 入口
     public static void main(String[] args){
         System.out.println("Hello World!");
     }
 ​
     // 编写一个静态代码块
     static{
         System.out.println("C");
     }
 }
 ​
 /*
 运行结果:
 A
 B
 C
 Hello World!
 */
实例语句块
 /*
 1、除了静态代码块之外,还有一种语句块叫做:实例语句块
 2、实例语句在类加载是并没有执行。
 3、实例语句语法?
     {
         java语句;
         java语句;
         java语句;
     }
 4、实例语句块在什么时候执行?
     只要是构造方法执行,必然在构造方法执行之前,自动执行“实例语句块”中的代码。
     实际上这也是SUN公司为java程序员准备一个特殊的时机,叫做对象构建时机。
 */
 public class InstanceCode{
 ​
     //入口
     public static void main(String[] args){
         System.out.println("main begin");
         new InstanceCode();
         new InstanceCode();
 ​
         new InstanceCode("abc");
         new InstanceCode("xyz");
     }
 ​
 ​
     //实例语句块
     {
         System.out.println("实例语句块执行!"); 
     }
 ​
     // Constructor
     public InstanceCode(){
         System.out.println("无参数构造方法");
     }
 ​
     // Constructor
     public InstanceCode(String name){
         System.out.println("有参数的构造方法");
     }
 ​
 }