认识类和对象(二)

文章目录

系列文章目录

第一章 认识类与对象(一)

第二章 认识类与对象(二) 

前言

一、封装

1.1封装的概念

1.2访问限定符

1.3 包和包的概念 

1.4 常见的包 

二、static成员

2.1 认识static

2.2 static成员变量初始化

三.代码块

3.1 认识代码块

3.2 普通代码块

3.3 构造代码块

 3.4 静态代码块

四.对象的打印


系列文章目录


第一章 认识类与对象(一)

第二章 认识类与对象(二) 


前言

  上一篇初步介绍和认识了什么是类,什么是对象,this的用法和构造方法的使用。这一篇继续讲类和对象,加深对类和对象的理解。


一、封装

1.1封装的概念

   面向对象程序的三大特性:封装,继承,多态。首先理解何为封装。

   简单来讲,封装就是给复杂的代码套上一个简单的壳子,将内部复杂的方法实现和对象属性隐藏起来,仅通过接口来和对象交互。

1.2访问限定符

   java共有4种访问限定符:public,private,protected 和 default。

范围publicprotecteddefaultprivate
同一包中同一类
同一包中不同类
不同包中的子类
不同包中的非子类

 public , 公共的,大家都可以用。

default , 默认的,属于隐藏字符,什么都不写的默认权限。

private , 私密的,只有自己可以用。

   

    封装从语法上将就是被private 修饰的成员变量或成员方法,只能在当前类中使用。如果想要调用被private 修饰的成员变量或成员方法,可以使用setter 和 getter。

代码如下:

import java.util.Scanner;
public class Student {
    private String name = "zhangsan";
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    public void test1() {
        System.out.println("名字是"+name);
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String a = scanner.next();
        Student student = new Student();
        System.out.println(student.getName());
        student.test1();
    }
}

  快捷键是: 鼠标右键——>Generate——>Getter and setter ——>Ctrl或shift选中——>OK

1.3 包和包的概念 

   1. 类似于文件夹的作用,目的是更好的管理和组织类。在不同的包中可以创建同名的类。

   2.使用不同包中的类,需要导包。在导包时可以使用import语句导入包。

   3.除此之外,使用 * 也可以导入包,例如

import java.util.*;

 * 是通配符,此时可以使用 util 中的所有类。但不建议使用,因为存在不同包中有同名类的情况,如果使用 * ,会出现冲突。

   4.我们在定义包时,尽量指定成唯一的名字,通常使用公司域名的颠倒顺序,例如 com.baidu.www,注意全小写。

   5.访问权限修饰限定符 :ALT + 回车    导包

1.4 常见的包 

   1.java.lang:系统常用基础类

   2.java.lang.reflect:java反射编程包

   3.java.net:网络编程开发包

   4.java.sql:进行数据库开发的支持包

   5.java.util:java提供的工具程序包

   6.java.io:I/O编程开发包

二、static成员

2.1 认识static

   1.如果在不同的对象中有一个相同的,大家都会用到的成员变量,我们可以将这个变量用static修饰,这种被static修饰的变量叫做静态成员变量,也可以叫做类成员变量,顾名思义,只能在类中使用。它不属于某个具体的对象是所有对象共享的。静态成员不通过对象访问,通过类访问就可以了。

    2.被static修饰的方法称为静态成员方法,静态成员是靠静态方法来访问的。静态方法当中,不能调用非静态的成员变量或非静态的成员方法。

代码如下:

public class Student {
    public static String classroom = "1101";

    public static String getClassroom() {
        return classroom;
    }

    public static void main(String[] args) {
        System.out.println(getClassroom());
    }
}

   3.静态方法不包含this ,因为this作为非静态方法中的参数,无法被静态方法调用,所以在静态方法中也无法传递this的引用。

   4.静态方法可以通过类名(...)的方式调用。

2.2 static成员变量初始化

   我们知道,普通成员变量一般使用构造方法来初始化,但构造方法初始化的是与对象相关的实例属性,静态成员变量自然无法使用构造方法。而静态成员变量的初始化分为两种:就地初始化和静态代码块初始化。

   1.就地初始化 :在定义时直接给初始值

public class Student {
    public static String classroom = "1101";
}

    2.静态代码块初始化

三.代码块

3.1 认识代码块

使用{}定义的一段代码被称为代码块。代码块可分为四种:

1.普通代码块

2.构造块

3.静态代码块

4.同步代码块

3.2 普通代码块

定义在方法中的代码块,不常见

 public static void main(String[] args) {
        {
            int a = 1;
            System.out.println("a = "+a);
        }
        int b = 10;
        System.out.println("b = "+b);
    }
}

3.3 构造代码块

定义在类中的代码块,也叫实例代码块,构造代码块一般用于初始化实例成员变量。

public class Student {
    private String name ;
    public int age;
    public static String classroom;


    public Student() {
        System.out.println("这是构造方法");
    }
    //构造代码块
    {
        this.name = "zhangsan";
        this.age = 18;
    }
    public void test1() {
        System.out.println("名字是"+name+" 年龄"+age);
    }
    public static void main(String[] args) {
        Student student = new Student();
        student.test1();
    }
}

   位置在类的里面,方法的外面,也被叫做实例化代码块。当实例化对象时,构造代码块被执行。当第二次实例化一个对象时,静态代码块不再执行。 

 3.4 静态代码块

   使用static定义的代码块称为静态代码块,一般用于初始化静态成员变量,类加载的时候被调用。

public class Student {
    private String name ;
    public int age;
    public static String classroom;
    
    //静态代码块
    static {
        classroom = "build 110";
        System.out.println("启动静态代码块");
    }

    public static void main(String[] args) {
        Student student = new Student();
    }
}

   执行顺序:

   1.静态的先执行

   2.然后执行构造代码块

   3.在执行对应的构造方法

   注意:静态代码块只执行一次。

四.对象的打印

public class Student {
    private String name ;
    public int age;

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

    public static void main(String[] args) {
        Student student = new Student("zhangsan",18);
        System.out.println(student);
    }
}

打印结果:

 

   我们发现  程序最终打印了个地址,这个地址是如何得到的呢?

我们通过打印的底层代码,发现:

是因为 toSrting方法,程序最终得到一个地址。换言之,我们只要重写toString方法,最终就能得到我们想要的结果。 

   

public class Student {
    private String name ;
    public int age;

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

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public static void main(String[] args) {
        Student student = new Student("zhangsan",18);
        System.out.println(student);
    }
}

   重写toString方法快捷键:

   鼠标右键——>Generate——>toString ——>Ctrl或shift选中——>OK

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值