Java学习笔记之面向对象、static关键字

Wesley13
• 阅读 495

一周Java学习总结

今天就总结理清一下关于面向对象和面向过程的程序设计的一些不同特点,以及讲下static关键字。

面向对象

  • 现在接触的Java是面向对象的,现在的程序开发几乎都是以面向对象为基础的。我现在不看书,光靠回忆去想这个特性的解释性语言,只能想到看书时很深刻的一句话,面向对象就是一个更加具体描述一个事件的一种设计方法,就像在公司里面吃饭,面向对象的话就是一个总负责人即类似大厨准备好菜谱什么的,分工下去给下属,每个人负责一个菜,每个人按照自己的秘方去完成,最后总的做出来形成一桌满汉全席。哪一个菜不好吃了,直接可以找到那个负责的进行检查。这样的设计就可以具备通用性和标准模块化,效率有时会更高点。
  • 关于面向对象的程序设计三个特点:封装性、继承性、多态性。首先封装性是把对象属性、行为看成一个密不可分的整体封装在独立单位中,一种信息隐蔽的特性其次是继承性:父类与子类的表达与描述就是一种继承性,拥有反映事物一般特性的类,在其基础上派生出反映特殊事物的类。(类是由属性和方法组成)最后是多态性,包括方法重载和对象多态。子类与父类可以相互转换,根据其使用的子类不同完成的功能也不同。
  • 类和对象是支撑起整个Java面向对象开发的基本概念单元。类实际上是对象操作的模板,不能直接使用,要通过实例来使用。就像头发(类)借助人(对象)来实现各式各样的装扮。

static关键字

_“static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。”_——《Java编程思想》

  • 先讲static关键字并不会影响变量或者方法的作用域。与c/c++的static不同。在C/C++中static是可以作用域局部变量的,但是在Java中切记:static是不允许用来修饰局部变量。

  • Java中的变量分为成员变量和局部变量;局部变量还分为三种:形参、方法内的局部变量、代码块内的局部变量(作用范围看名字就可以明白,如代码块内的,代码块结束后就开始失效消亡)。成员变量:类体内定义的变量,包括了非静态变量又称实例变量,和静态变量又称类变量。

  • static字面意思是静态;但是在Java程序中,它是一个标志,作用是将实例成员变为类成员。而且只能修饰在类里定义的成员部分,包括成员变量、方法,内部类、初始化块。不用static去修饰类里的这些成员,它们就属于该类的实例。
    eg:static int num2 = 20;(这是一个类变量)
    eg: int num1 = 238;(实例变量)

  • static修饰的成员属于类,类变量会随着类初始化得到初始化;而没有static修饰的成员变量则属于实例,实例变量随着对象的初始化而初始化。因为在初始化之前一个对象之前,肯定得先初始化该对象所属的类,所以static修饰的时机肯定较实例变量早。

  • static方法一般称作静态方法,不依赖任何对象就可以进行访问,因此对于静态方法来说,没有this的。注意在静态方法中不能访问非静态成员方法和成员变量。如下图

这里的printIn方法中调用getInfo()会出错,因为静态不能调用非静态。里面会报错“Cannot make a static reference to the non-static method getInfo() from the type BookJava(603979977)”,这英文也很好理解。

Java学习笔记之面向对象、static关键字

下面插入一个例子,更好得去理解static

 public class statictest {//考察这个代码的打印情况    
 //3 第三步    
 Person person = new Person("Test");    
 //这里是第一个person参数:test 5运行完4后就开始通过构造器来生成对象,这里Person没有加载过,去找Person   
  static {    
  //3有static块,直接运行这一步。所以一开始打印这一句        
          System.out.println("test static");    }
    public statictest() { 
                System.out.println("test constructor");
               //7打印第五句    }
    public static void main(String[] args) {
        //1主方法入口,第一先读取这里 
               new MyClass();  
               }
       }
class Person { 
         //6过来就运行static块,打印第三句 
      static {  
               System.out.println("person static");
                }
    public Person(String str) {
            //6打印第一个参数test,第四句
                System.out.println("person " + str);
                    }}
class MyClass extends statictest { 
           //2继承的是statictest类,所以先看上面的statictest
       Person person = new Person("MyClass");
                //8运行完stasictest,开始打印这里的person
       static{ 
                //4加载statictest完,回来加载MyClass,发现static,直接第二步打印
               System.out.println("myclass static"); 
                }  
       public MyClass() {  
                System.out.println("myclass constructor"); 
               //9最后运行到这一步,打印出最后一句  
                 }
           }
/*答案
test static
myclass static
person static
person Testtest 
constructorperson 
MyClassmyclass constructor
*/

借鉴网站/博客

博客园一位大佬

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Karen110 Karen110
2年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
从一个 10 年程序员的角度告诉你:搞懂 Java 面向对象有多容易?
前言:1)java面向对象语言,面向过程围绕过程(解决问题步骤),面向对象围绕实体(名词,特性(属性),行为(动作、方法))。它们设计思想区别在于关心核心不同的。主流都是面向对象的。实际开发,先按面向对象思想进行设计,具体实现时面向过程(人习惯)2)java怎么支持面向对象呢?a.万物皆对象,所有的类都是Object子类b.java中支
Wesley13 Wesley13
2年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
2年前
JAVA面向对象
一、java面向对象的特征?答:java面向对象的特征:封装、继承、多态、抽象。如果问java面向对象的三大特征是什么?那就是封装、继承、多态,但说到面向对象,还有一个很主要的特征就是抽象。1、封装a)铺垫:Java把真实世界中某些具有共同特征的实体抽象成Java中的类,类的实例就是一个对象,而对象和真实世界的实体是一一
Wesley13 Wesley13
2年前
JAVA 基础知识
JAVA纯面向对象语言,有平台无关性,一次编译到处运行,编辑器会把java代码变成中间代码,然后在JVM上解释执行。拥有很多内置的类库,提供了对Web应用开发的支持,具有较好的安全和健壮性。JAVA和C的异同都是面向对象语言使用了面向对象的思想(封装,继承,多态),面向对象的特性(继承和组合)  面向对象有以下特点:  (1
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
4个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这