类和对象认识及知识点

发布于:2022-11-12 ⋅ 阅读:(667) ⋅ 点赞:(0)

目录

一.类的认识及其定义方式

二.对象的实例化,对象的初始化

三.类中成员变量,成员方法,构造方法的用法及使用

四.封装

五.代码块


1. 对于类的认识可以这样理解,类相当于对一个东西或实物(专业名词叫实体或对象)来进行进一步描述,描述什么呢?描述它的属性,它的功能即它是干啥的。例如一个手机,手机就是一个实体,即可看成一个类,它的属性如处理器,屏幕材质,品牌等等,它的功能就是打电话,看电影,聊天等等。这样就是一个类。下面是类的定义格式 语法:

// 创建类
class ClassName{
field; // 字段(属性) 或者 成员变量
method; // 行为 或者 成员方法
}

那么这里用书来举例,代码如下:

 class Book {
   int id ;
   String name;
   double price ;
   String author ;
   String press ;
}

上面定义的都是这个类(书)的成员变量,即它的属性。下面来定义它的成员方法即它的功能或干啥:

class Book {
    int id ;   //编号
    String name; //
    double price ; //价格
    String author ; //
    String press ; //出版社

    public void found(){   //成员方法
        System.out.println("查找知识");
    }
}

注意:

此处方法一定要写到类里面,类名注意采用大驼峰定义(首字母大写)。

2.对类进行实例化,用类类型创建对象的过程,称为类的实例化,在java中采用new关键字,配合类名来实例化对象。

对于类和对象:类相当于一个虚拟的东西,需要实例化出一个对象才能实际存储数据

class Student{
    String name;
    int age;

    public void output(){
        System.out.println(name); //输出学生姓名
        System.out.println(age); //输出学生年龄
    }
}



public class Test_5 {


    public static void main(String[] args) {
        Student stu = new Student();   //实例化对象stu
        stu.name = "zhang san";   //通过.来调用类中的方法
        stu.age = 28;         
        stu.output();
    }
}

输出为:

注意:

实例化对象要用关键词new  类名 对象名 = new 类名();

通过.来调用类中的方法   对象名.方法(成员变量)

当然还可以通过实参和形参的方式来对对象进行赋值:

class Student{
    String name;
    int age;
    public void set(String name,int age){    //形参接收
        this.name = name;
        this.age = age;
    }
    public void show(){
        System.out.println(name+" "+age);
    }

}
public class Test_5 {


    public static void main(String[] args) {
        Student stu = new Student();            
        stu.set("zhangsan",28);  //传参
        stu.show();
    }
}

此处大家可以注意到用到了this,在Java中this引用能帮助我们更加容易看懂代码 ,那么为什么有这个呢?在Java中当你把形参写成和成员变量名一样的时候,若给name和age赋值的时候,那么编译器就搞不清了,到底是谁给谁赋值,成员变量给成员变量?参数给参数?参数给成员变量?成员变量参数?这样一来就会导致赋值失败,输出默认值。

 3.上面已经提到了成员变量,成员方法,在此介绍构造方法

概念:构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且 在整个对象的生命周期内只调用一次。

构造方法:(1)名字必须与类名相同,无任何返回值     public 类名()

(2)构造方法可以有不同数的参数,当被调用时会根据不同个数的参数来实现对应个数参数的调用

class Student{
    String name;
    int age;
    public void set(String name,int age){
        this.name = name;
        this.age = age;
    }
    public void show(){
        System.out.println(name+" "+age);
    }

    public Student(String name){
        System.out.println(name+"构造方法输出");  //一个参数输出
    }
}

public class Test_5 {


    public static void main(String[] args) {
        Student stu = new Student("lishi");         //构造方法初始化
        stu.set("zhangsan",28);
        stu.show();
    }
}

class Student{
    String name;
    int age;
    public void set(String name,int age){
        this.name = name;
        this.age = age;
    }
    public void show(){
        System.out.println(name+" "+age);
    }
 
    public Student(String name,int age){   //两个参数
        System.out.println(name+" 构造方法输出");
        System.out.println(age+" 构造方法输出");
    }
}
public class Test_5 {


    public static void main(String[] args) {
        Student stu = new Student("lishi",39);       //两个参数        
        stu.set("zhangsan",28);
        stu.show();
    }
}

class Student{
    String name;
    int age;
    public void set(String name,int age){
        this.name = name;
        this.age = age;
    }
    public void show(){
        System.out.println(name+" "+age);
    }

    public Student(String name,int age){
        System.out.println(name+" 构造方法输出");
        System.out.println(age+" 构造方法输出");
    }
    public Student(){
        this.name = "九九";
        this.age = 18;
        System.out.println(name+"  无参构造方法输出");
        System.out.println(age+" 无参构造方法输出");
    }
}
public class Test_5 {


    public static void main(String[] args) {
       // Student stu = new Student("lishi",39);           
          Student stu = new Student();  //无参实例化对象
        stu.set("zhangsan",28);
        stu.show();
    }
}

上面分别为两个参数,一个参数和无参数的构造方法,通过最后一个无参数调用可以看出,在类里面有两个参数的构造方法和无参数的构造方法时,编译器会自动选择无参数的构造方法。

注意:当实例化对象时,编译器就会自动调用类里面的构造方法,如果类里面没用构造方法的话,编译器就会默认一个构造方法,不过这个方法是无任何输出的。即在运行代码时,出现实例化对象这句代码时,就会自动调用构造方法。

当然在构造方法中也可以通过this来调用其他构造方法,这样就可以给其他构造方法赋值,使代码简化。

注意:(1)在这里用this()来调用,括号里面为参数,调用几个参数的构造方法里面就对应写几个参数,其this()必须为构造方法的首句。

(2)若两个参数的里面this调用无参的,而无参的里面的this又调用两个参数的,这样就会形成一个环,就会报错。这里this就相当于将参数传上去,然后执行完这个构造方法再回来执行this()下面的代码。

这里还有一个小小的细节,在编代码或运行途中,成员变量没有赋初值就可以使用或输出(输出为默认值),而局部变量不赋初值就会报错。在此对成员变量,局部变量,构造方法,成员方法再梳理下,以防混乱。

若在成员方法或构造方法里面设置变量,如int a; 这个就叫局部变量,局部变量只会对本方法有效,在别的方法里面无效,需要重定义。

4.封装

“封装”顾名思义就是对东西或事物进行“穿衣服”,把它们的内部细节隐藏起来。

封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。Java中主要通过类和访问权限来实现封装,类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认 知,而访问权限用来控制方法或者字段能否直接在类外使用。访问权限除了可以限定类中成员的可见性,也可以控制类的可见性。

常见的访问限定符有public,private等,

public可以理解为都能看见,都可以用,而private(私有)就只能自己看见了,用的话需要方法。

class Student{

    private String name; 
    private  int age;    //定义私有变量name,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 void output(){
        System.out.println(getName());
        System.out.println(getAge());   //对名字和年龄进行输出
    }
}
public class Test_5 {


    public static void main(String[] args) {
          Student stu = new Student();
        stu.setName("zhang san");
        stu.setAge(28);
        stu.output();
    }
}

 要访问私有变量就要写setget方法,这样主函数里面才可以访问并输出。否则会报错,无法识别变量。   在这里其实还可以通过static修饰方法来访问私有变量。

class Student{
 private static String name;
    private  static int age;
    public static String func(){   //定义一个静态方法
        Student.name = "zhang";
        return Student.name;
    }
}
public class Test_5 {

    public static void main(String[] args) {
        Student stu = new Student();
        System.out.println(Student.func()); //输出私有变量name
    }
}

上面的就叫做static静态方法,注意:

(1)它不属于某个具体的对象,是类方法

(2)不能在静态方法中访问非静态变量

(3)可以通过静态方法来访问类,且不需要实例化对象

class People{
    static String name;
    static int age;
    public static void show(String name,int age){
        System.out.println(name);
        System.out.println(age);
    }
}
public class Test_4 {
    public static void main(String[] args) {
        People.show("zhang",20);   //通过静态访问需拿类名访问,且不需要实例化对象
    }
}

5.代码块

代码块分为普通代码块,构造代码块(也叫实例代码块),静态代码块

(1)普通代码块(定义在方法中的代码块)

(2)构造代码块(定义在类中的代码块)

(3)静态代码块(使用static定义的代码块称为静态代码块,一般用于初始化静态成员变量。)

 

(4)代码块的执行过程

首先需注意:其一:静态代码块不管生成多少个对象,其只会执行一次 

其二:实例代码块只有在创建对象时才会执行

class A{
     String name;
     int age;
     public void show(){
        System.out.println(name);
        System.out.println(age);
        {
            System.out.println("执行方法内代码块");
        }
    }
 //构造代码块
    {
        System.out.println("执行方法外代码块");  //执行前先将代码块进行编译  实例代码块只有在实例化对象时才会执行
    }
    static {
        System.out.println("执行静态代码块");  //静态代码块
    }
}
public class Test_7 {
    public static void main(String[] args) {
        A human = new A();
        human.name = "张三";
        human.age = 18;
        human.show();

}

 

 从上面运行可以看出,程序执行时会先执行静态代码块,然后再执行构造代码块,最后在执行方法代码块。其中要注意的是静态代码块不管在类中的那个位置都会先执行,而构造代码块(实例代码块)只有在实例化对象时才会执行。

望对您有所帮助,不足之处还望指出!

 

 

 


网站公告

今日签到

点亮在社区的每一天
去签到