目录
一、封装的定义
二、实现封装
三、构造方法
四、构造方法的重载
五、this关键字
六、代码块
面向对象的三大特性为:封装,继承和多态。
一、封装的定义
封装是面向对象的核心思想,将对象的属性和方法封装成一个整体。同时,也可以将不想让外界知道的信息隐藏起来。
二、实现封装
类的封装是指将对象的状态信息隐藏在对象的内部,不允许外部程序直接访问对象的内部信息,而是通过该类提供的方法实现对内部信息的访问。
在Java中,定义一个类,将这个类中的属性私有化,可以使用private关键字修饰类的属性,被私有化的属性只能在该类中被访问。外界如果想要访问私有属性,就必须通过setter和getter方法设置和获取属性值。
class Student{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 Example {public static void main(String[] args) {Student student=new Student();student.setName("张三");student.setAge(20);System.out.println("姓名: "+student.getName()+" 年龄: "+student.getAge());}
}
三、构造方法
实例化一个对象后,如果要为这个对象中的属性赋值,就必须通过直接访问对象的属性或者调用setter方法才能实现,如果需要在实例化对象时为这个对象属性赋值,可以通过构造方法实现。
构造方法是类中一个特殊的成员方法,在类实例化对象时自动调用。
实现构造方法
注意事项:(1)、构造方法的名称必须和类名相同
(2)、构造方法名称前不能有任何返回值类型的声明
(3)、不能在构造方法中使用return返回一个值,但是可以写return语句作为方法的结束
class Student{private String name;private int age;public Student(String name, int age) {this.name = name;this.age = age;}public void read(){System.out.println("姓名:"+name+" 年龄:"+age);}
}
public class Example {public static void main(String[] args) {Student student=new Student("张三",20);student.read();}
}
四、构造方法的重载
与普通方法相同,构造方法也可以重载,在一个类中可以定义多个构造方法,只要每个构造方法的参数或者参数个数不同即可。在创建对象时,可以通过调用不同的构造方法为不同的属性赋值。
class Student{private String name;private int age;public Student(String name) {this.name = name;}public Student(String name, int age) {this.name = name;this.age = age;}public void read(){System.out.println("姓名:"+name+" 年龄:"+age);}
}
public class Example {public static void main(String[] args) {Student student1=new Student("张三");Student student2=new Student("张三",20);student1.read();student2.read();}
}
在Java中的每个类都至少有一个构造方法,如果在一个类中没有定义构造方法,系统对自动为这个类创建一个默认的构造方法,这个默认的构造方法没有参数,方法体中没有任何的代码,即什么也不做。
五、this关键字
在Java开发中,当成员变量和局部变量重名时,需要用到this关键字来分辨成员变量和局部变量,主要作用有三种。
1、使用this关键字调用本类中的属性
2、使用this关键字调用成员方法
3、使用this关键字调用本类的构造方法
1、使用this关键字调用本类中的属性
class Student{private String name;private int age;public Student(String name) {this.name = name;}public Student(String name, int age) {this.name = name;this.age = age;}public String read(){return("姓名:"+name+" 年龄:"+age);}
}
public class Example {public static void main(String[] args) {Student student=new Student("张三",20);System.out.println(student.read());}
在构造方法中,参数名称和成员变量的名称相同,编译器无法确定哪个是当前对象的属性。所以,Java提供了this关键字来指代当前对象,通过this可以访问当前对象的成员。
2、使用this关键字调用成员方法
read2方法使用this关键字调用read1方法
class Student{private String name;private int age;public Student(String name, int age) {this.name = name;this.age = age;}public void read1(){System.out.println("姓名:" + name+" 年龄: "+age);}public void read2(){this.read1();}
}
public class Example {public static void main(String[] args) {Student student=new Student("张三",20);student.read2();}
}
3、使用this关键字调用本类的构造方法
通过this调用没有参数的构造方法
使用this调用类的构造方法的注意事项:
1、只能在构造方法中使用this调用其他的构造方法,不能在成员方法中调用其他的构造方法
2、在构造方法中,使用this调用构造方法的语句必须放在第一行,且只能出现一次。
class Student{private String name;private int age;public Student(){System.out.println("这是没有参数的构造方法");}public Student(String name, int age) {this();this.name = name;this.age = age;}public String read(){return "姓名:"+name+" 年龄:"+age;}
}
public class Example {public static void main(String[] args) {Student student=new Student("张三",20);System.out.println(student.read());}
}
六、代码块
代码块,就是"{}"括号括起来的一段代码,根据位置以及声明的关键字不同,代码块可以分成,普通代码块、构造块,静态代码块和同步代码块。
普通代码块
普通代码块就是直接在方法或语句中定义的代码块
public static void main(String[] args) {{int age=20;System.out.println("这是不同代码块 age:"+age);}int age=30;System.out.println("age"+age);}
在main()方法中定义了一个局部代码块,局部代码块就main()方法进行了分隔,起到了限定作用域的作用。定义的两个相同的变量,由于两个变量处在不同的代码块,作用域不同,因此并不会互相影响。
构造块
构造块是直接在类中定义的代码块
class Student{String name;{System.out.println("构造代码块");}//构造方法public Student() {System.out.println("构造方法");}
}
public class Example {public static void main(String[] args) {Student student1=new Student();Student student2=new Student();}
执行结果:
构造代码块
构造方法
构造代码块
构造方法
从执行结果中可以看出,构造代码块的执行顺序优先与构造方法。
静态代码块
在Java类中,用static关键字修饰的代码块称为静态代码块。当类加载的时候,静态代码块会执行,由于类只加载一次,因此静态代码块也只执行一次。在程序中,通常使用静态代码块对类的成员变量进行初始化。
class Student{{System.out.println("构造代码块");}static {System.out.println("静态代码块");}//构造方法public Student() {System.out.println("构造方法");}
}
public class Example {public static void main(String[] args) {Student student1 = new Student();Student student2 = new Student();}
执行结果:
静态代码块
构造代码块
构造方法
构造代码块
构造方法
从执行结果可以看出,代码块执行的顺序为静态代码块、构造代码块、构造方法,而且静态代码块只执行一次。