Java面向对象之基本概念及封装

 

一.面向对象的思想概述:面向对象是基于面向过程的一种编程语言

(1)面向对象思想的特征:

                            1)符合我们的行为思想习惯; 2)将复杂的事情简单化;  3)从执行者变成了指挥者;

(2)面向对象的三大特征:

                            1)封装性; 2)继承性; 3)多态性;

*面向过程和面向对象的区别:

       以"把大象装进冰箱"为例

                       1)装大象的方法in()
                       2)开冰箱门:open()
                       3)关闭冰箱门:close()

面向过程:
			class Test{
				
				main(..){
					//分别调用三个方法
					open();
					in();
					close();
				}
				
				
				//开冰箱门
				public static void open(){
					System.out.println("开冰箱门...") ;
				}
				//装大象
				public static void in(){
					System.out.println("把大象塞进冰箱") ;
				}
				
				//关闭冰箱门
				public static void close(){
					System.out.println("关闭冰箱门...") ;
				}
			}
			
	面向对象:
			把大象装进冰箱 :   名词提取法:  大象类,冰箱类,测试类
			
			class 大象类{
				public static void in(){//被静态修饰的方法可以被类名直接调用!(类名.方法();)
					System.out.println("把大象塞进冰箱") ;
				}
			}
			
			class 冰箱类{
				public static void open(){
					System.out.println("开冰箱门...") ;
				}
				
				public  static  void close(){
					System.out.println("关冰箱门...") ;
				}
			}
		
			class Test{//测试类,有main方法去执行
				main(){
				
					类名.方法名() ;
					大象类.in() ;
					冰箱类.open();
					冰箱类.close() ;
			
				}
			}

(3)面向对象开发:

                    创建对象(前提是有类),使用对象,指挥对象做事情(用对象.方法();)

(4)面向对象设计:

                    其实就是在管理和维护对象之间的关系

(5)类和对象的关系:

学习编程语言,就是为了模拟现实世界的事物,面向对象语言中现实世界的事物在代码中如何体现的?

            面向对象,就是将现实世界的事物----->代码中的:

 

      将事物看成XX类

      将事物对应的属性----->看成这个类的成员变量
      将事物对应的行为----->看成这个类的成员方法


      举例:描述一个学生事物

   分析:           学生事物                                               Student  

                              属性:姓名,年龄,性别,学号                        成员变量

                              行为:学习                                               成员方法

 

1)首先,自定义一个学生类

//这是一个学生类
public class Student {
	
	//成员变量
	String name ;
	int age ;
	String gender ;
	int Id ;
	
	//成员方法
	public void study() {
		System.out.println("学生在学习Java.....") ;
	}
}

2)然后写一个学生类的测试类,那么如何创建对象呢?

      在Java中,创建对象:new 对象

                   类名    对象名 = new 类名();

public class StudentTest {

	public static void main(String[] args) {
		
		//创建一个学生对象
        //	格式:	类名 对象名 = new 类名() ;	
		Student s = new Student() ;
		//System.out.println(s);//org.westos.oop.Student@70dea4e  包名.类名@(地址值标记)16进制数据
		
		//给学生对象进行赋值
		//赋值的时候和之前写的这个类的类型要一致!
		s.name = "高圆圆" ;
		s.age = 27 ;
		s.gender = "女" ;
		s.Id = 007 ;
		System.out.println("学生的姓名是:"+s.name+",年龄是:"+s.age+",性别是:"+s.gender+",学号是:"+s.Id);
		
		//调用Student类中的成员方法
		//对象名.成员方法名() ;
		s.study(); 
		
	}
}

二.成员变量和局部变量的区别

1)在类中位置不同
     成员变量:类中,方法外
     局部变量:方法声明上,或者再方法定义中
2)在内存中的位置不同:
     成员变量:堆内存
     局部变量:栈内存
3)生命周期不同:
     成员变量:成员变量是随着类的加载而加载,随着类的消失而消失
     局部变量:随着方法的调用而存在,随着方法调用完毕而消失
4)初始化值不同
     成员变量:初始化由系统默认初始化,
           对于成员变量,可以不给初始化值,由系统给,然后显示初始化;(int类型:默认值0;String类型:默认值null)

     局部变量:定义一个局部变量,必须进行初始化,如果不初始化,无法使用(在使用之前进行初始化)

三.匿名对象

       就是创建对象的时候,没有名字的对象(开发中经常使用).

       比如:有一个Student类

                  创建一个匿名对象new Student();

                  可以用匿名对象调这个类的成员变量和成员方法,如:new Student().name="胡一天";

    但是,匿名对象在实际开发中,只用使用一次,不要使用多次  (可能会造成一个内存溢出的现象);

         比如:new Student() ; 
                new Student () ;//错误,一直给堆内存开辟空间 

.形式参数问题

    (1)如果是基本数据类型,形式参的改变对实际参数没有影响(字符串类型String是一个特殊的类型,它的形式参数的改变会直接影响实际参数)
     (2)Java研究引用类型:形式参数的改变会直接影响实际参数

举例:

 
class Student{
	public void show() {
		System.out.println("好好学习,天天向上....");
	}
}

class StudentDemo{
	//method方法中形式参数是一个引用类型:需要的是学生类对象  Student s = new Student () ;
	public void method(Student s) {//形式参数现在引用类型  
		s.show(); 
	}
}

 

 

    需求:调用StudentDemo中的method方法:如何调用?

           1)创建StudentDemo类对象

StudentDemo sd = new StudentDemo() ;

          2)形式参数是Student类型,所以创建Student类的对象

Student s = new Student() ;

          3)调用StudentDemo中的method方法

<em>sd.method(s);</em>

五.封装和private关键字

  还是以上面学生类为例,

       给学生的年龄赋值了一个不合理的数据(s.age = -30 ;),而这种不合理的数据依然可以被输出出来,有问题!

解决方案:
       在Student类中提供一个针对年龄的判断的一个方法

//针对年龄进行一个判断
	public void ageTest(int age) {
		if(age <0 || age >120) {
			System.out.println("该年龄是一个不合理数据....");
		}
	}

 

       虽然提供了这一个方法,但是成员变量在测试类中永远被访问到,针对这种情况:Java提供了关键字:private:私有的

private:体现的也是一种封装思想

(1)封装:

        标准类的写法,将成员变量全部私有化,被private修饰的成员变量只能在本类中访问,可以通过公共的访问方法去访问成员变量

(2)private的用法:
     1)被private修饰的只能在本类访问
     2)可以通过公共的访问public 去间接访问

class Demo{
	private int num = 100 ;
	
	//成员方法 :公共访问方法
	public void method()	{
		int num = 200 ; //局部变量
		System.out.println(num);
	}
}
//测试类
public class PrivateDemo {
	
	public static void main(String[] args) {
		//创建一个Demo类的对象
		Demo d = new Demo() ;
        //System.out.println(d.num);//外界不能访问
		d.method(); 
	}
}

        注:当前成员变量和局部变量名称一致的情况,遵循就近原则

六.构造方法以及创建对象的过程

(1)作用:就是给对象进行进行初始化

(2)构造方法:1)方法名和类名相同     2)构造方法,连void都没有

(3)构造方法的注意事项:

     1)之前没有写无参构造,系统会默认提供无参构造

     2)如果我们无参构造或者有参构造,系统不会在提供无参构造;定义一个类的时候,建议永远给出无参构造!

     3)构造方法是可以重载的!

  面试题:有一个学生类:Student  里面有一些属性,在测试类中创建学生类对象,经历了哪些过程?

Student s = new Student() ;

(1)通过测试类里面的main主程序进行加载,加载Student类(Student.class)

(2)Student s 先在栈内存开辟内存空间,创建一个学生对象,需要在堆内存申请堆内存空间

(3)通过无参构造方法给学生类的对象进行默认初始化

(4)通过给成员变量赋值的形式,给对象进行显示初始化

(5)显示初始化完毕,整个对象创建完毕之后,给对象进行内存空间地址值的分配

(6)通过地址值找对应的对象

 

七.this关键字以及一个标准类的写法

this:代表是当前类对象,或者是(当前类对象的引用),解决局部隐藏了成员变量

八.static关键字

(1)多个对象对同一个变量进行共享,这个时候Java提供了一个关键字---static:  静态的(共享的)
         在方法区中:开辟一个静态区域: 都是静态标记

(2)关于static关键字:
    1)静态随着类的加载而加载
    2)static优先于对象存在
        回想:main  public static void main(..){...}
    3)static共享数据,可以被多个对象进行共享
        举例: 饮水机(staticd的:共享的)
                水杯(不能共享的...)
    4)如果数据被静态修饰的,它可以被类名直接调用
       被静态修饰的方法: 类名.方法名()
       被静态修饰的变量: 类名.变量名;

(3) static用法:

       一个类中可有静态变量,也可以有非静态

       可以有静态成员方法,也可以非静态的成员方法

       静态的方法只能访问静态变量,或者是静态的方法

       非静态的方法,既可以访问静态变量也可以非静态的变量...

  简单记:静态只能访问静态!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值