1、 封装
封装概述: 隐藏对象的属性和实现细节,仅对外提供公共的访问方式。
package org.wdzl.unit02;
public class Student {
String name;
private int age;
public void setAge(int age1){
if (age1 > 0 ){
age=age1;
}else {
System.out.println("你输入的信息有误!!");
}
}
//显示信息
public void showInfo(){
System.out.println("name:"+name);
System.out.println("age:"+age);
}
}
package org.wdzl.unit02;
public class StudentDemo {
public static void main(String[] args) {
Student student = new Student();
student.name="唐某";
//student.age = 18;
student.setAge(18);
//System.out.println("name"+ student.name);
//System.out.println("age"+student.age);
student.showInfo();
System.out.println("-------------");
student.name="张三";
student.setAge(20);
//System.out.println("name:"+ student.name);
//System.out.println("age:"+student.age);
student.showInfo();
}
}
**封装优点:**安全性高,独立性高,复用性高
封装原则:
1、将不需要用户访问的内用隐藏起来。
2、将属性进行隐藏,提供公共的访问方式。
2、private关键字
!它是一个权限修饰符
!它可以修饰成员变量和成员方法
!被它修饰的变量和方法只能在本类中被访问。
3、封装和private的应用:
1、将成员变量私有化
2、提供对应的getXxx()和setXxx()方法
package org.wdzl.unit02;
/**
* 标准学生类:
* 1、私有成员变量
* 2、提供getXxx()和setXxx()方法
*/
public class Student3 {
//成员变量
private String name;
private int age;
//name的get,set方法
//get方法
public String getName(){
return name;
}
//set方法
public void setName(String n){
name = n;
}
//age的get,set方法
//get方法
public int getAge(){
return age;
}
//set方法
public void setAge(int a){
age = a;
}
}
package org.wdzl.unit02;
/**
* 学生标准类测试案例
*/
public class Student3Demo {
public static void main(String[] args) {
//创建对象
Student3 student3 = new Student3();
//设置属性值
student3.setAge(18);
student3.setName("唐某人");
//获取属性值
System.out.println(student3.getAge());
System.out.println(student3.getName());
}
}
4、this关键字
问题:
package org.wdzl.unit02;
/**
* 学生标准类测试案例
*/
public class Student4 {
//成员变量
private String name;
private int age;
//name的get,set方法
//get方法
public String getName(){
return name;
}
//set方法
public void setName(String name){
name = name;
}
//age的get,set方法
//get方法
public int getAge(){
return age;
}
//set方法
public void setAge(int age){
age = age;
}
}
class Student4Demo {
public static void main(String[] args) {
//创建对象
Student4 student4 = new Student4();
//设置属性值
student4.setAge(18);
student4.setName("唐某人");
//获取属性值
System.out.println(student4.getAge());
System.out.println(student4.getName());
}
}
此程序运行的结果是:
解释:
因为在set方法中,name = name;
此时由于成员变量和局部变量同名,按照就近原则来处理,public void setName(String name){ name = name; }
此时两个name就都是代表着局部变量,所以就是将局部变量赋值给局部变量,而成员变量并未发生改变。
this关键字概述:
1、表示所在类的对象引用,简单来说,就是当前类的对象。
2、它的作用是解决局部变量隐藏成员变量的问题。
3、那个类调用该方法,this就表示那个类。
4、谁调用该方法,该方法内部的this就代表谁。
代码演示:
package org.wdzl.unit02;
/**
* 学生标准类测试案例
*/
public class Student4 {
//成员变量
private String name;
private int age;
//name的get,set方法
//get方法
public String getName(){
return name;
}
//set方法
public void setName(String name){
//方式1
// Student4 student4 = new Student4();
// student4.name = name;
//方式2:
this.name = name;//this表示当前类的对象
}
//age的get,set方法
//get方法
public int getAge(){
return age;
}
//set方法
public void setAge(int age){
this.age = age;
}
}
class Student4Demo {
public static void main(String[] args) {
//创建对象
Student4 student4 = new Student4();
//设置属性值
student4.setAge(18);
student4.setName("唐某人");
//获取属性值
System.out.println(student4.getAge());
System.out.println(student4.getName());
}
}
5、构造方法
概述: 用来创建类的对象,并对类的对象的属性进行初始化。
格式: 1、没有任何返回值,连void都没有。
2、方法名和类名相同。
注意事项:
1、如果我们没有给出构造方法,系统会自动提供一个默认的无参构造方法。
2、如果我们给出了构造方法,系统则不会在提供默认的无参构造方法,推荐大家每次定义类的时候,手动给出无参构造方法。
扩展: 成员变量的赋值有两种方式,1、set方法,2、构造方法赋值。
类的组成:
成员变量
成员方法
a、根据返回值类型:
1、void类型
2、有明确返回值类型(return)
b、根据参数:
1、有参方法
2、无参方法
构造方法
package org.wdzl.unit02;
public class PhoneDemo {
public static void main(String[] args) {
Phone phone = new Phone();
phone.PinPai="华为";
phone.XingHao="P30";
phone.setPrice(1999);
phone.showInfo();
System.out.println("--------------");
Phone phone1 = new Phone("VIVO","不知道",599);
phone1.showInfo();
}
}
class Phone{
String PinPai;
String XingHao;
private int price;
public Phone(){}
public Phone(String PinPai,String XingHao,int price){
this.PinPai = PinPai;
this.XingHao = XingHao;
this.price = price;
}
public void setPrice(int price){
this.price = price;
}
public int getPrice(){
return price;
}
public void showInfo(){
System.out.println("PinPai:"+PinPai);
System.out.println("Xinghao:"+XingHao);
System.out.println("price:"+price);
}
}
6、成员变量的注意实现
1、当变量为类的描述信息,我们才将它定义为成员变量。
2、变量到底是定义为成员变量好还是局部变量好呢?
变量的定义范围越小越好,因为节省系统资源,能够及时的被垃圾回收机器及时回收。
7、static关键字
概述: 针对对象中有共同属性的这种情况,Java提供了一个关键字来解决这个问题:static
特点: 1、随着类的加载而加载。
2、先于对象存在。
3、被类的所有对象共享(判断是否使用static关键字的一个依据)。
package org.wdzl.unit02;
/**
* 针对人的一个类
* 在测试案例中我们发现所有对象都有一个属性都是相同的,
* 这样的话会造成系统资源不必要的浪费,可不可以使用其他方法来解决这个问题呢?
*
* 针对对象中,有共同属性的这种情况,Java提供了一个关键字来解决这个问题,static
*/
public class PersonDemo {
public static void main(String[] args) {
Person person = new Person("唐某人",18,"中国");
person.showInfo();
System.out.println("----------");
Person person1 = new Person("赵某人",10);
person1.showInfo();
System.out.println("----------");
Person person2 = new Person("去某人",16);
person2.showInfo();
System.out.println("----------");
person.setCountry("巴铁");
person1.showInfo();
person2.showInfo();
}
}
class Person{
private String name;
private int age;
private static String country;
public Person(){}
public Person(String name){
this.name = name;
}
public Person(String name,int age){
this.name = name;
this.age = age;
}
public Person(String name,int age,String country){
this.name = name;
this.age = age;
this.country = country;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public String getCountry(String country){
return country;
}
public void setCountry(String country){
this.country = country;
}
//显示信息的方法
public void showInfo(){
System.out.println("name:"+name);
System.out.println("age:"+age);
System.out.println("country:"+country);
}
}
可以通过类名去调用:
package org.wdzl.unit02;
public class StaticDemo {
public static void main(String[] args) {
//调用非静态变量
Demo1 demo1 = new Demo1();
System.out.println(demo1.num);
//调用静态的变量
System.out.println(Demo1.num2);
System.out.println(demo1.num2);
}
}
class Demo1{
//非静态的变量
int num = 99;
//静态的变量
static int num2 = 199;
}
static的内存图解:
static注意事项:
1、静态方法中不能使用this关键字
2、静态的方法只能调用静态的方法和静态的变量。
package org.wdzl.unit02;
/**
* static关键字使用注意事项:
* 1、在静态方法中,this关键字不能使用
* 分析:静态方法是随着类的加载而加载,它是先于对象而创建的,而this表示的是当前类的对象,它是随
* 对象产生而产生的,
* 2、静态的方法只能访问静态的变量和静态的方法,
* 静态方法:静态的变量和静态的方法
* 非静态方法:都可以访问
*/
public class StaticDemo2 {
public static void main(String[] args) {
Demo2 demo2 = new Demo2();
demo2.function();
demo2.method();
}
}
class Demo2{
private int num;
private static int num1;
public void function(){
System.out.println(num);//隐式的表示访问的是成员变量
System.out.println(this.num);//明确的表示访问的是成员变量
method2();
method();
}
public static void method(){
// System.out.println(num);//爆红
System.out.println(num1);
method2();
// function();//爆红
}
public static void method2(){
System.out.println("method2");
}
}
面试题:概述静态变量与成员变量的区别?
1、所属不同
静态变量属于类,
成员变量属于对象,
2、内存的位置不同
静态变量存储在方法区的静态区
成员变量存储在堆内存当中
3、生命周期不同
静态变量随着类的加载而加载,随着类的消失而消失
成员变量随着对象的创建而创建,随着对象的消失而消失。
4、使用方法不同
静态变量可以通过类去使用,也可以通过对象使用。
成员变量只能通过对象而使用。
8、main方法讲解
* 主方法详解
* public static void main(String[] args){}
* public:公共的,访问权限最大的,main方法是供JVM调用的,所以它的访问权限是最大的。
* static:静态的,可以通过类名去调用,方便JVM调用
* void:无返回值的,返回值是返回给方法的调用者,而主方法的调用者是JVM,返回值对JVM无任何意义。
* String[] args:字符串数组
*
9、生成Java DOC
10、练习
package org.wdzl.unit02;
import java.util.Scanner;
/**
* 猜数字
*/
public class MathTest {
public static void main(String[] args) {
//生成随机数
int num = (int) (Math.random()*100)+1;//生成1-100之间的随机数;
//Scanner对象
Scanner scanner = new Scanner(System.in);
while (true){
System.out.println("请输入一个数字");
int userNum = scanner.nextInt();
//比较
if (userNum == num){
System.out.println("程序结束");
break;
}else if(userNum > num){
System.out.println("输入的数字过大");
}else if (userNum < num){
System.out.println("输入的数字过小");
}
}
}
}
11、代码块
**局部代码块:**局部位置,用于限定变量的生命周期。
**构造代码块:**在类的成员位置,用花括号扩起来的代码。
执行顺序:先于构造方法执行。
作用:将多个构造方法相同的代码块放到构造代码块中,对对象进行初始化。
**静态代码块:**在类的成员位置,用花括号括起来的代码,使用static来修饰。
执行顺序:在类的加载的时候执行。
作用:对类进行初始化。
package org.wdzl.unit02;
/**
* 代码块:
* 局部代码块:局部位置,用于限定变量的生命周期的。
* 构造代码块:在类中成员的位置,用花括号扩起来的代码,
* 执行顺序,先于构造方法执行,
* 他的作用是将多个构造方法共同的代码放到一起,对对象进行初始化。
* 静态代码块:在类中成员位置,用花括号括起来的代码,并且有static关键字来修饰,
* 执行顺序:在加载类的时候执行,作用对类进行初始化操作。
*/
public class CodeDemo {
//静态代码块
static {
System.out.println("static code");
}
//构造代码块
{
int y = 200;
System.out.println(y);
}
public CodeDemo(){
System.out.println("CodeDemo");
}
public CodeDemo(int a){
System.out.println(a);
System.out.println("CodeDemo");
}
{
int z = 300;
System.out.println(z);
}
public static void main(String[] args) {
//局部代码块
{
int x = 100;
System.out.println(x);
System.out.println("----------");
}
// System.out.println(x);//爆红
CodeDemo codeDemo = new CodeDemo();
System.out.println("----------");
CodeDemo codeDemo1 = new CodeDemo();
}
}
执行结果如下:
**面试题1:**静态代码块,构造代码块,构造方法三者的执行顺序?
1、静态代码块
2、构造代码块:只要调用的构造方法,构造代码块就执行。
3、构造方法
面试题2:
看代码,说出执行的结果
package org.wdzl.unit02;
public class Test {
{
System.out.println("构造代码块");
}
{
System.out.println("静态代码块");
}
{
System.out.println("构造方法");
}
}
class TestDemo{
static {
System.out.println("TestDemo静态代码块");
}
public static void main(String[] args) {
Test test = new Test();
Test test1 = new Test();
}
}