zoukankan      html  css  js  c++  java
  • 重踏学习Java路上_Day07(成员与局部变量,形参,匿名对象,封装,private,this,构造与成员方法,static)

    1:成员变量和局部变量的区别(理解)
    (1)在类中的位置不同
    成员变量:类中方法外
    局部变量:方法定义中或者方法声明上, 注意:权限修饰符修饰局部变量是没有任何意义的
    (2)在内存中的位置不同
    成员变量:在堆中
    局部变量:在栈中
    (3)生命周期不同
    成员变量:随着对象的创建而存在,随着对象的消失而消失
    局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
    (4)初始化值不同
    成员变量:有默认值,int,byte,short为0,char为"u0000",应用类型为null,布尔类型为false
    局部变量:没有默认值,必须定义,赋值,然后才能使用

    局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则。


    2:类作为形式参数的问题?(理解)
    (1)如果你看到一个方法需要的参数是一个类名,就应该知道这里实际需要的是一个具体的对象。

    3:匿名对象(理解)
    (1)没有名字的对象
    (2)应用场景
    A:调用方法,仅仅只调用一次的时候。
    b:可以作为实际参数传递。

    (3)匿名调用的好处?有,匿名对象调用完毕就是垃圾,可以被垃圾回收器回收。

    /*
    匿名对象:就是没有名字的对象
    */

    class Student {
    public void show() {
    System.out.println("我爱学习");
    }
    }

    class StudentDemo {
    public void method(Student s) {
    s.show();
    }
    }

    class NoNameDemo {
    public static void main(String[] args) {
    //带名字的调用
    Student s = new Student();
    s.show();
    s.show();
    System.out.println("--------------");

    //匿名对象
    //new Student();
    //匿名对象调用方法
    new Student().show();
    new Student().show(); //这里其实是重新创建了一个新的对象
    System.out.println("--------------");


    //匿名对象作为实际参数传递
    StudentDemo sd = new StudentDemo();
    //Student ss = new Student();
    //sd.method(ss); //这里的s是一个实际参数
    //匿名对象
    sd.method(new Student());

    //在来一个
    new StudentDemo().method(new Student());
    }
    }

     


    4:封装(理解)
    (1)隐藏实现细节,提供公共的访问方式
    (2)好处:
    A:隐藏实现细节,提供公共的访问方式
    B:提高代码的复用性(重用性)
    C:提高代码的安全性
    (3)设计原则
    将不需要对外提供的内容都隐藏起来。把属性隐藏,提供公共方法对其进行访问。
    (4)private是封装的一种体现。
    封装:类,方法,private修饰成员变量

    /*
    定义一个学生类:
    成员变量:name,age
    成员方法:show()方法

    我们在使用这个案例的过程中,发现了一个问题:
    通过对象去给成员变量赋值,可以赋值一些非法的数据。
    这是不合理的。
    应该是这个样子的:在赋值之前,先对数据进行判断。
    判断到底在哪里做比较合适呢?
    StudentDemo类是一个测试类,测试类一般只创建对象,调用方法。
    所以,这个判断应该定义在Student类中。
    而我们在成员变量的位置可不可以进行数据判断呢?
    是不可以的,因为做数据校验,必须要依靠一些逻辑语句。
    逻辑语句是应该定义在方法中的,所以,我们最终决定在Student类中提供一个方法
    来对数据进行校验。

    按照我们前面的分析,我们给出了一个方法进行校验。
    但是呢,它偏偏不调用方法来赋值,还是直接赋值了,
    这样我们的方法就没有起到作用。
    我就应该要求你必须使用我的方法,而不能直接调用成员变量赋值。
    怎么去强制要求不能直接使用成员变量呢?
    针对这种情况,Java就提供了一个关键字 private

    private:私有的。可以修饰成员变量和成员方法。
    注意:被private修饰的成员只能在本类中访问。

    其实我讲到现在讲解的是一个封装的思想。
    封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
    */
    class Student {
    //姓名
    String name;
    //年龄
    private int age;

    //写一个方法对数据进行校验
    /*
    返回值类型:void
    参数列表:int a
    */
    public void setAge(int a) {
    if(a < 0 || age > 120) {
    System.out.println("你给的年龄有问题");
    }else {
    age = a;
    }
    }


    //show()方法,显示所有成员变量值
    public void show() {
    System.out.println("姓名:"+name);
    System.out.println("年龄:"+age);
    }
    }

    class StudentDemo {
    public static void main(String[] args) {
    //创建学生对象
    Student s = new Student();
    s.show();
    System.out.println("--------------");

    //给成员变量赋值
    s.name = "林青霞";
    //s.age = 27;
    s.setAge(27);
    s.show();
    System.out.println("--------------");

    //给age赋值
    //s.age = -27; //这个数据是不合理的
    //通过方法给值
    s.setAge(-27);
    s.show();
    System.out.println("--------------");
    }
    }

    5:private关键字(掌握)
    (1)私有的意义,可以修饰成员变量和成员方法
    (2)特点:
    被private修饰的后的成员只能在本类中被访问
    (3)private的应用:
    以后再写一个类的时候:
    把所有的成员变量给private了
    提供对应的getXxx()/setXxx()方法

    6:this关键字(掌握)
    (1)代表当前类的引用对象
    记住:哪个对象调用方法,该方法内部的this就代表那个对象
    (2)this的应用场景:
    A:解决了局部变量隐藏成员变量的问题
    B:其实this还有其他的应用,明天讲解。

    7:构造方法(掌握)

    学习完这个之后,类的组成变为:

       1.成员变量  
       2.构造方法
            无参构造方法
            带参构造方法
       3.成员方法

          根据返回值:
                  void类型;
                  非void类型;
          形式参数:
                  空参方法;
                  非空参方法;

       注意:给成员变量赋值的方式
             无参构造方法+setXxx()
             带参构造方法

    (1)作用:用于对对象的数据进行初始化,其实Student s = new Student();中的Student()就是一个方法,因为有括号就是调用方法,没括号就是变量。所以Student()就是一个构造方法,但它是没有一个需要设定默认参数的构造方法。
    (2)格式:
    A:方法名和类名相同
    B:没有返回值类型,连void都不能有
    C:没有返回值

    (3) Hibernate实体为什么要提供一个无参的构造函数?

    当查询的时候返回的实体类是一个对象实例,是hibernate动态通过反射生成的
    反射的Class.forName("className").newInstance();需要对应的类提供一个无参构造函数;

    System.out.print(Class.forName("java.lang.String").newInstance().getClass().getName());这个需要无参构造函数



    思考题:构造方法中可不可以有return语句呢?
    可以。而是我们写成这个样子就OK了:return;
    其实,在任何的void类型的方法的最后你都可以写上:return;

    (3)构造方法的注意事项
    A:如果我们没写构造方法,系统将提供一个默认的无参构造方法
    B:如果我们给出了构造方法,系统将不再提供默认构造方法
    如果这个时候,我们要使用无参构造方法,就必须自己给出。
    推荐:永远手动自己给出无参构造方法。

    (4)给成员变量赋值的方式
    A:setXxx()
    B:带参构造方法

    (5)标准案例 (一个基本类的标准代码写法)
    class Student {
    private String name;
    private int age;

    public Student(){}

    public Student(String name,int age) {
    this.name = name;
    this.age = age;
    }

    public String getName() {
    return name;
    }

    public void setName(String name) {
    this.name = name;
    }

    public int getAge() {
    return age;
    }

    public void setAge(int age) {
    this.age = age;
    }
    }

    测试:
    class StudentDemo {
    public static void main(String[] args) {
    //方式1
    Student s1 = new Student();
    s1.setName("林青霞");
    s1.setAge(27);
    System.out.println(s1.getName()+"---"+s1.getAge());

    //方式2
    Student s2 = new Student("刘意",30);
    System.out.println(s2.getName()+"---"+s2.getAge());
    }
    }

    8:代码:Student s = new Student();做了哪些事情?(理解)
    (1)把Student.class文件加载到内存
    (2)在栈内存为s开辟空间
    (3)在堆内存为学生对象申请空间
    (4)给学生的成员变量进行默认初始化。null,0
    (5)给学生的成员变量进行显示初始化。林青霞,27
    (6)通过构造方法给成员变量进行初始化。刘意,30
    (7)对象构造完毕,把地址赋值给s变量



    9:面向对象的练习题(掌握)
    (1)标准的手机类的定义和测试
    (2)Demo类有求和方法,Test类进行测试。
    什么时候定义成员变量?
    当该变量是用来描述一个类的时候。
    (3)长方形案例
    (4)员工案例
    (5)MyMath案例(自己提供加减乘除并测试)

    10:static关键字(理解)
    (1)静态的意思。可以修饰成员变量成员方法

    静态修饰的内容一般被我们称其为:与类相关,类成员,而非静态修饰的内容我们一般称为对象成员。
    (2)静态的特点:
    A:随着类的加载而加载
    B:优先于对象存在,所谓优先就是说静态比创建的对象先存在。
    C:被类的所有对象共享,只有一份拷贝,被类的所有对象所共享。如果某个成员变量是被所有共享的,那么它就应该定义为静态的。
    这其实也是我们判断该不该使用静态的依据。
    举例:饮水机和水杯的问题思考
    D:可以通过类名调用
    既可以通过对象名调用,也可以通过类名调用,建议通过类名调用。
    (3)静态的内存图
    静态的内容在方法区的静态区,专门有一个静态区,main()方法不需要创建对象才加载到栈区域,静态修饰可以直接通过类名调用,所以不需要创建对象,main方法就能进入栈内存,开辟内存空间。


    (4)静态的注意事项

    对象方法是调用才执行,而静态是类加载就加在
    A:在静态方法中没有this对象,静态是随着类的加载而加载,this是随着对象的创建而存在。静态比对象先存在。
    B:静态只能访问静态(代码测试过),静态方法只能访问静态成员变量和静态成员方法

    C:静态方法:

           成员变量:只能访问静态变量

           成员方法:只能访问静态成员方法

       非静态方法:

           成员变量:可以是静态,也可以是非静态。

           成员方法:可以使静态成员的方法,也可以是非静态的成员方法。

    (5)静态变量和成员变量的区别
    A:所属不同
    静态变量:属于类,类变量
    成员变量:属于对象,对象变量,实例变量
    B:内存位置不同
    静态变量:方法区的静态区
    成员变量:堆内存
    C:生命周期不同
    静态变量:静态变量是随着类的加载而加载,随着类的消失而消失
    成员变量:成员变量是随着对象的创建而存在,随着对象的消失而消失
    D:调用不同
    静态变量:可以通过对象名调用,也可以通过类名调用
    成员变量:只能通过对象名调用
    (6)main方法是静态的
    public:公共的,访问权限是最大的。由于main方法是被JVM调用,所以权限要足够大。
    static:静态的,不需要创建对象,通过类名就可以访问,方便JVM的调用
    void:方法的返回值是返回给调用者的,而main方法是被jvm调用的,返回值给jvm没有意义
    main:就是一个常见的名称。
    String[] args:可以接收数据,提供程序的灵活性,这个东西早期是为了接收键盘录入的数据的。
    格式:java MainDemo hello world java
    java MainDemo 10 20 30

    为什么在main方法中可以访问非静态的变量??

    main()方法是程序的入口,你在main方法里定义了一个变量,那当然这个变量在main方法里是可见的,当然可以直接访问的
    静态上下文只能访问静态成员或静态方法,但我们是在main方法下定义对象与使用方法,所以不会违背上面的话,同一个类下,如果在main方法外面定义方法来调用,该方法必须是static。
  • 相关阅读:
    sitemap怎么制作才适合蜘蛛抓取?
    网站高并发优化性能调优总结
    圆柱模板行业B2B站点打造MIP推送+熊掌号推送+历史普通推送插件
    a href="javascript:void(0)" 是什么意思?加不加上有什么区别?
    <a href="#" onclick="history.back();"></a>这样写为什么是对的? -(转)
    form 表单 enctype 属性-(转自w3c)
    关于submit与document.form1.submit();这2个提交的区别
    zf-表单填写以及相关业务流程
    zf-关于把某个地址的svn项目移动到另一个上面的步骤
    zf-关于即将过期提示字符串的修改
  • 原文地址:https://www.cnblogs.com/canceler/p/4593697.html
Copyright © 2011-2022 走看看