面向对象--封装


 1.理解面向对象:

        面向对象是相对面向过程而言,面向对象和面向过程都是一种思想;面向过程强调的是功能行为,面向对象是将功能封装进对象,强调具备了功能的对象;面向对象是基于面向过程的。

        举一个生活中的常例 如:我去饭店吃饭,喊服务员拿拿菜单点菜,然后服务员交给厨师去做,这就是一个面向对象;我调用服务员,服务员调用厨师,而厨师面向过程(做饭);

 

开发就是找对象使用,如果没有就创建一个对象,开发的过程就是找对象,建立对象,使用对象,维护对象的关系

 类和对象的关系:类:是对现实社会中事物的描述

                               对象:就是这类事物是实实在在的个体

 

成员变量和局部变量的区别:

    作用范围                  成员变量:作用于整个类中;

                                   局部变量:作用于函数中或语句中

  在内存中的位置

                                 成员变量:在堆内存中,因为对象的存在,才在内存中存在;

                                 局部变量:存在栈内存中;

匿名对象的两种使用方式:

                 1>当对对象的方法调用一次时可以用匿名对象来完成    下面代码标注匿名兑现过得使用

                 如果对一个对象进行多个成员调用,必须给这个对象起个名字

                2>可以将匿名对象作为实际参数进行传递

举一个面向对象的例子:

<span style="font-size:18px;"><strong>public class Car {
  //描述颜色
  String color = "红色";
  // 描述轮胎
  int num= 4 ;
  //运行方法
  void run(){
   System.out.println(color + "---->"+num);
  }
 
void show(Car c){
 
c.color = "red";
 
c.num = 2;
 
c.run();
 
}
  public static void main(String[] args) {
   //创建一个新的对象,其实就是在队内产生一个实体
   Car c = new Car();//c就是一个类类型变量  注:类类型变量指向对象
   c.color = "蓝色";//在java中的智慧方式是对象.对象成员
   c.num = 5;// new Car().num = 5; 匿名对象
   c.run();
   System.out.println("------------------");
   Car c1 = new Car();
   c1.color = "黑色";
   c1.run(); //匿名对象的同种作用  new Car().run():
 
//匿名对象作为实际参数进行传递
 
show(new Car);
  }
 }
</strong></span>


 

 面向对象程序(oop)的特点:封装, 继承, 多态

封装:即隐藏对象的属性和实现细节进队外提供公共访问方式

           封装的好处:将变化隔离,便于使用,提高重用性,提高安全性

           封装的原则:将不需要对外提供的内容都隐藏起来;

                                 把属性都隐藏,提供公共访问对其访问

private:关键字 用 private修饰的变量和方法只能在同类中访问(也可以提供一个公共的访问方式)

                私有仅仅是封装的一种形式

构造函数

               作用:可以用于给对象进行初始化;

                 构造函数的细节:当一个类中没有定义构造函数式,系统默认加一个空的构造函数;

什么时候定义构造函数: 当分析是事物时,该事物具备一些特性或者行为那么将这些函数定义在构造函数中;

一个对象建立构造函数只运行一次,而一般方法可以被该对象调用多次;

构造代码块:

    作用:给对象进行初始化,对象一建立就运行,优先于构造函数运行;

 

构造函数只是给对应的对象进行初始化,而构造代码块是给所有的对象进行初始化;

 

构造代码快的格式:{ 执行语句 }

构造代码块中定义的是:不同对象共性的初始化内容;

 

this 关键字:区别于局部变量和成员变量,代表所在函数所属对象的引用
            this语句只能用于构造函数间,必须用于构造函数的第一行;


this的应用:当定义类中功能时,该函数内部要用到调用该函数的对象时,这时用this表示这个对象,本类功能内部使用到了本类对象都用this表示;     

this语句  例:this(name);

 

static 静态 用法:是一个修饰符,用于修饰成员(成员变量,成员函数)
            当成员被静态修饰后就多了一个调用方式,除了直接被对象调用外,还可以直接被类名调用;
           
被static修饰后的成员变量具备以下特点:

1>随着类的加载而加载;

2>优先于对象存在;

3>被所有对象所共享;

4>可以直接被类名调用;

 

静态方法只能访问静态成员,静态方法中不可以写this和super关键字;

非静态方法既可以访问静态成员也可以访问非静态成员;

 

静态方法的利与弊:

利:对对象的共享数据进行单独空间存储节省空间,可以直接类名调用;

弊:生命周期过长,访问出现局限性;

 

静态的应用:将功能代码用静态的方法封装起来提高重用性;

 

静态代码块:

      特点:随着类的加载而执行,只执行一次

     作用:给类进行初始化

格式: static{  执行语句  }

静态代码块优先于静态代码块执行 如下例:

<span style="font-size:18px;"><strong>public class Text {
	/*
	 *静态块  构造块  有参   无参的执行顺序
	 */
	private String name;
	static{
		System.out.println("a");
	}
	
	public Text(){
		System.out.println("c");
	}
	
	{
		System.out.println("b");
	}
	
	public Text(String name){
		System.out.println("d");
	}
	public static void main(String[] args) {
		
		new Text("你好");
	}
}
</strong></span>

执行结果==》a b d

封装的举例: 用到上面介绍的内容:

<span style="font-size:18px;"><strong>public class Person {
	
	private String name;
	private int age;//成员变量
	private static String country = "cn";//静态变量
	
	static{
		//静态块
	}
	
	{
		//构造快
	}
	
	public static String getCountry() {
		return country;
	}
	public static void setCountry(String country) {
		Person.country = country;//静态方法中不能用this、super关键字
	}
	public Person(){//无参构造
		
	}
	public Person(String name){
		this.name = name;
	}
	public Person(String name, int age,String country){//有参构造
		this(name);//调用上面给的this.name  this语句的使用
		this.age = age;
		this.country = country;
	}
	
	public void setName(String name){
		this.name = name;
	}
	public String getName(){
		return name;
	}
	public void setAge(int age){
		this.age = age;
	}
	public int getAge(){
		return age;
	}
	
	public void speak(){//非静态方法既可以访问静态变量也可以访问静态变量
		
		System.out.println("姓名"+ this.name +"--->"+ "年龄"+this.age+"-->"+country);
	}
	public static void show(){//静态方法只能访问静态变量
		System.out.println("国家" + country);
	}
	
	//this代表本类对象
	public boolean campare(Person p){
		return this.age == p.age;
	}
}
public class PersonDemo {

	public static void main(int x){
		
	}
	public static void main(String[] args) {
		
		Person p = new Person();//调用无参构造
		p.setName("张三");
		p.setAge(20);
		p.speak();//调用非静态方法
	
		Person p1 = new Person();//调用有参构造
		p1.setName("李四");
		p1.setAge(6);
		p1.speak();
		Person.show();//静态方法的调用
		Person.getCountry();//类名直接调用静态变量
		
		System.out.println(p.campare(p1));
	}
}
</strong></span>

单例模式


<span style="font-size:18px;"><strong>public class Person {
	
	private String name;
	private int age;//成员变量
	private static String country = "cn";//静态变量
	
	static{
		//静态块
	}
	
	{
		//构造快
	}
	
	public static String getCountry() {
		return country;
	}
	public static void setCountry(String country) {
		Person.country = country;//静态方法中不能用this、super关键字
	}
	public Person(){//无参构造
		
	}
	public Person(String name){
		this.name = name;
	}
	public Person(String name, int age,String country){//有参构造
		this(name);//调用上面给的this.name  this语句的使用
		this.age = age;
		this.country = country;
	}
	
	public void setName(String name){
		this.name = name;
	}
	public String getName(){
		return name;
	}
	public void setAge(int age){
		this.age = age;
	}
	public int getAge(){
		return age;
	}
	
	public void speak(){//非静态方法既可以访问静态变量也可以访问静态变量
		
		System.out.println("姓名"+ this.name +"--->"+ "年龄"+this.age+"-->"+country);
	}
	public static void show(){//静态方法只能访问静态变量
		System.out.println("国家" + country);
	}
	
	//this代表本类对象
	public boolean campare(Person p){
		return this.age == p.age;
	}
}

public class PersonDemo {

	public static void main(int x){
		
	}
	public static void main(String[] args) {
		
		Person p = new Person();//调用无参构造
		p.setName("张三");
		p.setAge(20);
		p.speak();//调用非静态方法
	
		Person p1 = new Person();//调用有参构造
		p1.setName("李四");
		p1.setAge(6);
		p1.speak();
		Person.show();//静态方法的调用
		Person.getCountry();//类名直接调用静态变量
		
		System.out.println(p.campare(p1));
	}
}
</strong></span>


 单例模式:

<span style="font-size:18px;"><strong>单例设计模式:解决一个类在内存中只用一个对象
 
例:饿汉式   Student一进内存就已经创建好了对戏那个
 
public class Student {
 
 private int age;
  
  private static Student s = new Student();
  private Student(){}
  public static Student getStudent(){
   return s;
  }
  public void setAge(int age){
   this.age = age;
  }
  public int getAge(){
   return age;
  }
 }
 

public class StudentDemo {
 
 public static void main(String[] args) {
   
   Student s1 = Student.getStudent();
   Student s2 = Student.getStudent();
   s1.setAge(25);
   
   System.out.println(s1.getAge());
   System.out.println(s2.getAge());
   
  }
 }
 
单例模式2   懒汉式  Student类 进内存,对象还没有存在,只用调用getInfo方法时,才建立对象
 
public class Student {
 
 private int age;
  //模式2 懒汉式
  private static Student s = null;
  private Student(){}
  public static Student getInfo(){
   if(s == null){
    s = new Student(); 
   } 
   return s;
  }
  public void setAge(int age){
   this.age = age;
  }
  public int getAge(){
   return age;
  }
 }
 
public class StudentDemo {
 
 public static void main(String[] args) {
   
   Student s1 = Student.getInfo();
   Student s2 = Student.getInfo();
   Student s3 = Student.getInfo();
   s1.setAge(25);
   
   System.out.println(s1.getAge());
   System.out.println(s2.getAge());
   System.out.println(s3.getAge());
   
  }
 }
</strong></span>


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值