Java——深入分析类与对象(封装性、构造方法与匿名对象、简单Java类开发原则)

时间:2022-07-25
本文章向大家介绍Java——深入分析类与对象(封装性、构造方法与匿名对象、简单Java类开发原则),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1、封装性

Java中所有面向对象的概念都是以类与对象的关系为主,下面用一个程序说明为什么要提供有封装性。

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Person person = new Person();
        person.name = "张三";
        person.age = -20;
        person.printOut();
    }

    class Person{
        String name;
        int age;
        public void printOut(){
            System.out.println("name="+name+"age="+age);
        }
    }

以上程序语法上OK,但是实际上属于业务错误,年龄不应该是负数。造成这种错误的原因是什么?

最大的错误在于,当前类中的属性可以直接被类外部的对象直接调用,所以,这样的操作是不安全的操作。

最需要解决的问题是将内部的属性保护起来,不允许外部直接操作,可以使用private 关键字,加入后,name 和age使用范围只能是在Person这个类中,类的外部不能直接访问,安全性最高。

    class Person{
        private String name;
        private int age;
        public void printOut(){
            System.out.println("name="+name+"age="+age);
        }
    }

现在若想通过对象操作类中的属性,在Java中的明确要求,使用setter、getter方法设置或取得封装属性内容,eg:

class Person{
        private String name;
        private int age;
        public void printOut(){
            System.out.println("name="+name+"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;
        }
    }

开发原则:类中的属性全部使用private封装,封装后的属性必须严格按照要求编写setter与getter方法。

2、构造方法与匿名对象

2.1、构造方法

构造方法的定义,要求方法名称与类名称相同,且没有返回值类型声明。构造方法只有在使用关键字new实例化对象的时候才会被调用,如下程序所示。

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
            Test test =null;//不输出*
            test = new Test();//输出*
    }

    class Test{
        public Test(){
            System.out.println("**********");
        }
    }

Java在编译过程中,系统会自动加入一些代码,如果你的类中没有定义构造方法,系统自动帮助用户提供一个无参的构造方法,以此包装每个类中至少有一个构造方法。构造方法的作用是什么?

使用关键字new实例化时才会调用构造方法,实例化时属于堆内存空间的开辟,即是属性的初始化过程。但默认情况下属性初始化的内容都是对应数据类型的默认值,所以,在实例化时若想传递属性的内容,可以靠构造方法完成,省略了一系列的setter调用,实际开发中应用较多。

【举例】:构造有参构造方法

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Person per = new Person("张三",10);
        per.printOut();
    }
    class Person{
        private String name;
        private int age;
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
        public void printOut(){
            System.out.println("name="+name+"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) {
            if(age >=0){
                this.age = age;
            }
        }
    }

注意:构造方法没有返回值,为什么没有使用void声明?构造方法在实例化对象时只调用一次,而普通方法可以利用对象调用多次,没有加void,这就是与普通方法加以区分。

构造方法本身还是属于方法,所以其是可以进行重载的。但是需要注意,按照参数的个数顺序,降序或升序排列,养成一个好的编程习惯。类中的基本属性就是属性、构造方法、普通方法,编程时也按照这个顺序。

对象的构造过程中涉及很多步骤:加载类,为对象开辟空间、属性赋值操作,构造方法在过程的最后一步,这一步是留给用户处理的。属性在声明时设置了具体的内容,这些内容是构造完成后才赋值的,构造之前都是默认值。

2.2、匿名对象

匿名对象指的是没有名字的对象,对象的名字都保存在了栈中。

如:Person per = new Person("张三",10); 就是有名对象,per是对象的名。

整个对象操作中,真正有用的不是栈内存,因为栈内存指向堆内存,真正用的是堆内存,堆内存靠new开辟,所以可以直接用new Person("张三",10)调用类中方法。

new Person("张三",10).printOut();

但是对象没有名字,使用一次后就自动成为了垃圾。

3、简单Java类开发原则

  • 1)类名称必须具备实际意义,可明确描述某一类实体,eg:学生、雇员、工人等。
  • 2)类中所有属性必须使用private封装;
  • 3)所有封装的属性必须编写setter、getter方法;
  • 4)类中可以构造若干构造方法,但是必须有一个明确的无参构造方法;
  • 5)类中不允许有输出操作,所有输出必须将数据返回给调用处输出;
  • 6)类中应该提供有一个可以取得对象完整信息的方法;