类和对象初步认识

目录

1.类初步认识

2.this

2.1.this的引出

2.2 this的使用

3. 构造方法

4.封装 

4.1关于封装

4.2访问限定符 

5.练习

 6.内部类及对象的打印

         6.1实例内部类

6.2静态内部类 

6.3局部内部类 

1.类初步认识

1.1类是用来描述对象的,定义类需要用到class关键字:

//创建类    
class ClassName{//类名采用大驼峰
    field;//字段(属性)或者成员变量
    method;//行为或者成员方法---说明类具有哪些功能
}
class Person{//大驼峰
    //属性
    public int age;
    public String name;
    //行为
    public void eat(){//小驼峰
        System.out.println("吃饭!");
    }

}

类名:大驼峰;

方法名/变量名:小驼峰

注意事项:
1.一般一个文件中只有一个类;
2.main方法所在的类一般用public修饰:Eclipse默认会在public修饰的类中找main方法;
3.public修饰的类必须与文件名相同;
4.不要轻易修改public修饰的类的名称,如果要修改,用开发工具修改。

1.2 简单实例化


class Dog{
    //成员变量
    public String name;
    public String color;
    //方法
    public void barks(){
        System.out.println(name+"汪汪");
    }
    public void wag(){
        System.out.println(name+"摇尾巴");
    }

}


public class Test{
    public static void main(String[] args) {
        //实例化一个Dog对象;
        Dog dog1=new Dog();
        dog1.name="来福";
        dog1.color="黑色";
        System.out.println(dog1.name);
        System.out.println(dog1.color);
        dog1.barks();
        dog1.wag();
    }
} 

 

2.this

2.1.this的引出

public class TestDate {
    public int year;
    public int month;
    public int day;

    public void setDate(int y, int m, int d) {//局部变量优先
        year = year;
        month = month;
        day = day;

    }

    public void printDate() {
        System.out.println(year + "-" + month + "-" + day);
    }

    public static void main(String[] args) {
        TestDate testdate = new TestDate();
//        testdate.year  = 2022;
//        testdate.month = 12;
//        testdate.day = 23;
        testdate.setDate(2022,11,23);
        testdate.printDate();
    }
}

在这种情况下,我们发现结果是 0-0-0 并非是我们想要的。

2.1.1当形参名不小心与成员变量名相同:

  • 是因为在setDate方法内部,局部变量优先,只是形参自己给自己赋值了,所以根本就没有到我们的成员变量里面。
  • 改为
    public void setDate(int year, int month, int day) {//局部变量优先
        this.year = year;
        this.month = month;
        this.day = day;
    }
  • this代表对当前对象的引用(谁调用这个方法,谁就是this)

2.2 this的使用

this.访问成员变量;

this.访问成员方法;

this()访问构造方法; -调用本类中其他的调用方法。

* 1.this的类型:对应类型引用,即对哪个对象调用就是那个对象的引用类型;

* 2.this只能在“成员方法”中使用;

* 3.在“成员方法”中,this只能引用当前对象,不能引用其他对象;

* 4.this是“成员方法”中第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法的对象的引用传递给该成员方法,this负责接收。

3. 构造方法

  • 这个方法没有返回值,方法名与类名一样。 
  • 在实例化对象的过程中(new)一定会调用构造方法。
  • 当我们没有提供任何构造方法的时候,编译器会帮我们提供一个不带参数的构造方法。
  • 当构造方法调用完之后,对象才实际产生。
  • 构造方法可以重载;
  • 构造方法中,可以通过this调用其他构造方法来简化代码(this不能形成环)

  •  绝大多数情况下使用public来修饰,特殊情境下会被private修饰。

局部变量在使用时必须初始化,而成员变量在使用时会被默认初始化。

代码编译完成后,编译器会将所有给成员初始化的这些语句添加到各个构造函数中。 

4.封装 

4.1关于封装

*面向对象程序的三大特性:封装 继承 多态

在类与对象阶段,主要研究的是封装特性,封装就是套壳屏蔽细节。

  • 封装:将数据与操作数据的方法进行有机结合,隐藏对象属性与实现细节,进对外公开接口来和对象交互
  • 权限->访问修改限定符进行修改

4.2访问限定符 

Java中主要通过类和访问权限来实现封装:类可以将数据以及封装数据的方法结合在一起;访问权限用来控制方法或者字段能否直接在类外使用

软件包->为了更好的管理类,把多个类收集在一起成为一组。

包是对类,接口等封装机制的体现,是一种对类或者接口等的很好的组织方式,在一个工程中允许存在相同名称的类,只要不在同一个包就行。 

5.练习

由于static的存在不会使之出现空指针异常,a的类型也是A,a这个引用不指向任何的对象 。

静态成员的引用使用类.存在于方法区

static 修饰的变量是类变量或者修饰类的方法而不是方法的局部变量 ,随着类的创建而创建,随着类的销毁而销毁,而这里static int a=10;变成了局部变量,出了大括号就被销毁

  • 这里的static修饰的是成员变量
  • static修饰的方法里不能含有非静态的方法,所以如果写成func(),不new一个通过对象的引用访问是会报错的(或者就public static void func() )

3.0是double类型;

默认权限是不存在关键字的 

import也不能导入指定的包,只能导入一个具体的类

 

 假设A有构造方法A(int a),则在类A的其他构造方法中,调用该构造方法和语句的格式应该是(A)

A.this(a)

B.A(a)

C.this.A(a)

描述

现有一个Data类,内部定义了属性x和y,在main方法中实例化了Data类,并计算了data对象中x和y的和。但是,Data类的定义存在错误,请你将这些错误修正过来,使得main方法中的求和逻辑可以正常执行。

输入描述:

两个整数

输出描述:

两个整数的和

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextInt()) {
            int x = scanner.nextInt();
            int y = scanner.nextInt();
            Data data = new Data(x, y);
            System.out.println(data.getX() + data.getY());
        }
    }
}

class Data {
    private int x;//都被封装了,就只能在当前类内使用
    private int y;

    public Data(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return x;
    }
    public int getY() {
        return y;
    }
}

描述

采用封装的思想,为Person类定义年龄属性,要求:

修改年龄时判断其范围,若年龄小于0则按0输出,若年龄大于200则按200输出。

输入描述:

年龄整数值

输出描述:

1. 若年龄小于0则输出0;

2. 若年龄大于200则输出200;

3. 若年龄介于[0,200]之间则直接输出。

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Person p = new Person();
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextInt()) {
            int age = scanner.nextInt();
            p.setAge(age);
            System.out.println(p.getAge());
        }
    }

}
class Person {
    private int age;
    public void setAge(int age){
        if(age<0) this.age=0;
        else if(age>200) this.age=200;
        else this.age=age;
    }
    public int getAge(){
        return age;
    }

}

 6.内部类及对象的打印

  • 内部类:定义在另一类中的类;(是封装的一种体现)
  • 分为实例内部类(非静态内部类),静态内部类,局部内部类,匿名内部类......
  • 外部类:定义在方法外部的类·;
  • 虽然内部类和外部类共用一个源文件,但经过编译后,内部类会形成单独的字节码文件。

 6.1实例内部类

public class Outclass{
    class Interclass{
        
    }
}
//Outclass是外部类
//Interclass是内部类

6.1.1如何获取实例内部类/构造内部类的对象呢? 

OuterClass outClass=new OuterClass();
OuterClass.InnerClass innerClass=outerClass.new InnerClass();


 6.1.2.实例内部类中不能有静态的成员变量

因为static属于类成员(类加载就会被执行),而实例内部类还需要对象的引用。

但是在static 后面加上final然后赋值(就相当于变成常量,final就是常量)就不会报错了。

final int A=10;

定义常量,常量是在程序编译的时候 确定的,一旦初始化就不能被修改了。


 6.1.3.当实例内部类与外部例中有相同的成员变量时,如何在实力内部类中访问外部的成员变量data1? 

OutClass.this.data1
//在实力内部类方法中访问同名的成员时,优先访问自己的,
//访问外部:外部类名称.this.同成员名

6.1.4.实例内部类对象必须在先有外部类对象前提下创建。

6.1.5.实例内部类的非静态方法中包含了一个指向外部类对象的引用。

6.1.6.外部类不能直接访问实例内部类中的成员,如果要访问必须先创建内部类的对象。 


6.2静态内部类 

6.2.1如何获取静态内部类对象?

 

6.2.2静态类内部不能访问外部类的非静态成员,因为外部的非静态成员需要外部类对象的引用才能访问 。非要访问的话

 

6.3局部内部类 

匿名内部类先放着。

对象的打印:右键,generate+tostring() 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sqyaa.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值