初始Java 来自Java SE的第六节课 类和对象

Posted wwzzzzzzzzzzzzz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初始Java 来自Java SE的第六节课 类和对象相关的知识,希望对你有一定的参考价值。

目录

类和对象

1. 类与对象的初步认知

【面向对象概念】

【面向对象设计】

2. 类和类的实例化

3. 类的成员 

3.1 字段/属性/成员变量

3.2 方法 (method)

 3.3 static 关键字

 注意事项

引用相关注意事项:

4. 封装 

4.1 private实现封装

4.2 getter和setter方法

5. 构造方法

5.1 基本语法

面试相关问题:

6. 认识代码块

6.1 构造代码块  和  静态代码块

7. toString方法

8. 匿名对象 


 

类和对象

1. 类与对象的初步认知

        C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。

        JAVA是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。 

面向过程注重的是过程,在整个过程中所涉及的行为,就是功能。

面向对象注重的是对象,也就是参与过程所涉及到的主体。是通过逻辑将一个个功能实现连接起来 

面向过程: 1.把冰箱打开 2. 把大象放入 3. 冰箱关起来

面向对象: 打开冰箱,储存,关闭都是对冰箱的操作,是冰箱的行为。冰箱就是一个对象,所以只要操作冰箱所具备的功能,都要定义在冰箱中。

【面向对象概念】

1.面向对象是思考问题的一种思考方式,是一种思想。比如:概念与实例。理论与实践。名和实等等。

2.类就是一类对象的统称。对象就是这一类具体化的一个实例。

3.面向对象的好处:将复杂的事情变简单了,只要面对一个对象就行。

【面向对象设计】

开发时:找对象,创建对象,使用对象,并维护对象之间的关系。 

2. 类和类的实例化

类就是一类对象的统称。对象就是这一类具体化的一个实例。 

一个类,可以产生无数的对象

声明一个类就是创建一个新的数据类型,而类在 Java 中属于引用类型, Java 使用关键字 class 来声明类。下面简单的声明一个类。

代码实例:

class Person{
    public String name;
    public int age;

    public void eat(){
        System.out.println(name+"正在吃饭!");
    }
}

  类中的元素称为:成员属性。类中的函数称为:成员方法。 

 

类的实例化

用类类型创建对象的过程,称为类的实例化

class Person{
    //成员属性
    public String name;
    public int age;

    //成员方法
    public void eat(){
        System.out.println(name+"正在吃饭!");
    }
}

public class TestDemo {
    public static void main(String[] args) {
        // person1是一个对象    通过new实例化对象
        Person person1 = new Person();
        person1.eat();//成员方法调用需要通过对象的引用调用
        person1.name = "niubi";
        person1.age = 666;
        System.out.println(person1.name);
        System.out.println(person1.age);
        //产生对象            实例化对象
        Person person2 = new Person();
        Person person3 = new Person();
        //一个类可以产生无数个对象
    }
}

运行结果:

 注意事项:

  •         new 关键字用于创建一个对象的实例.
  •         使用来访问对象中的属性和方法.
  •         同一个类可以创建对个实例.

3. 类的成员 

3.1 字段/属性/成员变量

        在类中, 但是方法外部定义的变量. 这样的变量我们称为 "字段" 或 "属性" 或 "成员变量"(三种称呼都可以, 一般不会严 格区分). 

        成员变量分为:普通成员变量,静态成员变量.

class Person{
    //普通成员变量
    public String name;
    public int age;

    //静态成员变量->类变量
    public static int count;

}

3.2 方法 (method)

show 方法是和 实例相关联的. 如果创建了其他实例, 那么 show 的行为就会发生变化

class Person{
    public String name = "niubi";
    public int age=666;
    //方法
    public void show() {
        System.out.println("我叫" + name + ", 今年" + age + "岁");
    }
}


public class TestDemo {
    public static void main(String[] args) {
        Person person = new Person();
        person.show();
    }
}

运行结果:

 3.3 static 关键字

a) 修饰属性

class Person{
    //普通成员变量
    public String name;
    public int age;

    //静态成员变量->类变量
    public static int count;
}

public class TestDemo {
    public static void main(String[] args) {
        Person person1 = new Person();
        person1.count++;
        person1.age++;
        System.out.println(person1.age);
        System.out.println(person1.count);
        System.out.println("========================");
        Person person2 = new Person();
        person2.count++;
        person2.age++;
        System.out.println(person2.age);
        System.out.println(person2.count);
    }
}

内存解析图:

b)修饰方法

如果在任何方法上应用 static 关键字,此方法称为静态方法。

  • 静态方法属于类,而不属于类的对象。
  • 可以直接调用静态方法,而无需创建类的实例。
  • 静态方法可以访问静态数据成员,并可以更改静态数据成员的值。
class Person{
    //类方法
    public static void staticFunc(){
        System.out.println("static::func()");

    }
}

public class TestDemo {
    public static void main(String[] args) {
        Person.staticFunc();
    }
}

 注意事项

 1. 普通方法内部,不能定义静态变量

class Person{
    public void eat(){
            static int size = 0;//err
            System.out.println(name+"正在吃饭!");
        }
    public static void staticFunc(){
            static int size = 10;//err
            System.out.println("static::func()");

        }
}

 

 2.静态内部不能调用普通的方法.

class Person{
    public String name;
    public int age;

    public void eat(){
        System.out.println(name+"正在吃饭!");
    }

    //类方法
    public static void staticFunc(){
        eat();//err
        System.out.println("static::func()");

    }
}

 

引用相关注意事项:

1.

class Person{
    public String name;
    public int age;
}
public class TestDemo {
    public static void main(String[] args) {
        Person person = null;//这个引用不指向任何对象
    }

 2.

class Person{
    public String name;
    public int age;
}
public class TestDemo {
    public static void main(String[] args) {
        Person person = new Person();
        Person person1 = person;
    }

 

 3.

class Person{
    public String name;
    public int age;
}
public class TestDemo {
    public static void main(String[] args) {
        Person person = new Person();
        person = new Person();
        person = new Person();
        person = new Person();
        person = new Person();
        person = new Person();
    }

 4. 

引用一定在栈上面吗?

        肯定不是!!!

class Person{
    public String name;
    public int age;
}

public class TestDemo {
    Person person = new Person();

    public static void main(String[] args) {
        TestDemo testDemo = new TestDemo();
    }
}

 

 

4. 封装 

4.1 private实现封装

private/ public 这两个关键字表示 "访问权限控制" .

  • 被 public 修饰的成员变量或者成员方法, 可以直接被类的调用者使用.
  • 被 private 修饰的成员变量或者成员方法, 不能被类的调用者使用.

此时只能在当前类当中使用他--封装起来了

class Person{
    private String name;
    private int age;

}
public class TestDemo {
    public static void main(String[] args) {
        Person person = new Person();
        person.age=18;//err
        person.name = "www";//err
    }
}

 

 

4.2 getter和setter方法

class Person{
    private String name;
    private int 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;
    }
}
public class TestDemo {
    public static void main(String[] args) {
        Person person = new Person();
        person.setAge(20);
        person.setName("wwww");
        System.out.println(person.getAge());
        System.out.println(person.getName());
    }
}

注意事项: 

  • getName 即为 getter 方法, 表示获取这个成员的值.
  • setName 即为 setter 方法, 表示设置这个成员的值. 
  • 当set方法的形参名字和类中的成员属性的名字一样的时候,如果不使用this, 相当于自赋值. this 表示当前实例 的引用.
  • 不是所有的字段都一定要提供 setter / getter 方法, 而是要根据实际情况决定提供哪种方法.
  • 在 IDEA 中可以使用 alt + insert (或者 alt + F12) 快速生成 setter / getter 方法. 在 VSCode 中可以使用鼠标右键 菜单 -> 源代码操作 中自动生成 setter / getter 方法.

5. 构造方法

5.1 基本语法

语法规则 :

1.方法名称必须与类名称相同

2.构造方法没有返回值类型声明

3.每一个类中一定至少存在一个构造方法(没有明确定义,则系统自动生成一个无参构造)

new 执行过程:

  • 为对象分配内存空间
  • 调用对象的构造方法

代码示例: 

class Person{
    private String name;
    private int age;

    public Person(){
        System.out.println("Person()==不带参数的构造方法");
    }

    public Person(String name){
        this.name = name;
        System.out.println("Person(String)==带一个String类型的构造方法");
    }
    public Person(String name , int age ){
        this.name = name;
        this.age = age;
        System.out.println("Person(String,int)==带两个String,int类型的构造方法");
    }
}
public class TestDemo {
    public static void main(String[] args) {
        Person person = new Person();
        System.out.println("========");
        Person person1 = new Person("wwww");
        System.out.println("========");
        Person person2 = new Person("wwwzz",18);
    }
}

运行结果:

 注意事项:

  1. 如果类中没有提供任何的构造函数,那么编译器会默认生成一个不带有参数的构造函数
  2. 若当前类中定义了其他的构造方法,那么,编译器就默认的无参构造将不再生成.
  3. 构造方法之间构成重载. 规则和普通方法的重载一致.

面试相关问题:

this 和 super 有什么区别?

this:
1. this.data     调用当前对象的属性

2. this.func     调用当前对象的方法

3. this()          调用当前对象的其他构造方法

注:this()存放在构造函数当中!

 

6. 认识代码块

6.1 构造代码块  和  静态代码块

构造块:定义在类中的代码块(不加修饰符)。也叫:实例代码块。构造代码块一般用于初始化实例成员变量。

class Person{
    private String name;
    private int age;

    {
        System.out.println("实例代码块!");
    }
    static{
        System.out.println("静态代码块!");
    }
    public Person(){
        System.out.println("Person()==不带参数的构造方法");
    }

    public Person(String name){
        this.name = name;
        System.out.println("Person(String)==带一个String类型的构造方法");
    }
    public Person(String name , int age ){
        this.name = name;
        this.age = age;
        System.out.println("Person(String,int)==带两个String,int类型的构造方法");
    }
}
public class TestDemo {
    public static void main(String[] args) {
        Person person = new Person();
        System.out.println("========");
        Person person1 = new Person();

    }

运行结果:

 注意事项:

1. 静态代码块不管生成多少个对象,其只会执行一次,且是最先执行的。

2. 静态代码块执行完毕后, 实例代码块(构造块)执行,再然后是构造函数执行。

 

静态代码块不用实例化对象,也可以被执行,只执行一次 

class Person{
    public static int count = 10;
    static{
        count = 99;
        System.out.println("静态代码块!");
    }

}
public class TestDemo {
    public static void main(String[] args) {
        System.out.println(Person.count);

    }
}

运行结果:

注意:

如果都是静态的,那么和定义的顺序是有关的

如果当count没有初始化时,默认值就是99

7. toString方法

class Person{
    //普通成员变量
    public String name;
    public int age;

    //静态成员变量->类变量
    public static int count;

    public void eat(){
        //static int size = 0;
        System.out.println(name+"正在吃饭!");
    }

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

    //类方法
    public static void staticFunc(){
        System.out.println("static::func()");
    
    }
}

public class TestDemo {
    public static void main(String[] args) {
        Person person = new Person();
        System.out.println(person);
    }
}

输出结果:

注意事项 : 

  • toString 方法会在 println 的时候被自动调用.
  • 将对象转成字符串这样的操作我们称为 序列化.
  • toString 是 Object 类提供的方法, 我们自己创建的 Person 类默认继承自 Object 类, 可以重写 toString 方法实 现我们自己版本的转换字符串方法. (关于继承和重写这样的概念, 我们后面会重点介绍).
  • @Override 在 Java 中称为 "注解", 此处的 @Override 表示下面实现的 toString 方法是重写了父类的方法. 关于 注解后面的课程会详细介绍.
  • IDEA快速生成Object的toString方法快捷键:alt+f12(insert)

 

8. 匿名对象 

匿名只是表示没有名字的对象.

  • 没有引用的对象称为匿名对象.
  • 匿名对象只能在创建对象时使用.
  • 如果一个对象只是用一次, 后面不需要用了, 可以考虑使用匿名对象.

代码实例: 

class Person{
    public String name = "wwww";
    public int age = 18;
    public void eat(){
        System.out.println(name+"正在吃饭!");
    }
    public void sleep(){
        System.out.println(name+"正在睡觉!");
    }
}
public class TestDemo {

    public static void main (String[] args) {
        new Person().eat();
        new Person().sleep();
        System.out.println(new Person());

    }
}

运行结果:

 

以上是关于初始Java 来自Java SE的第六节课 类和对象的主要内容,如果未能解决你的问题,请参考以下文章

第六节课:元组和集合

linux第六节课

第六节课课堂笔记

Linux学习第六节课-用户组合权限

0520 第六节课

shell 脚本——第六节课 if判断语句