面向对象2

对象与引用

  • java语言中除基本类型之外的变量类型都称之为引用类型。

  • java中的对象是通过引用对其操作的.

例如 我们有一个自定义为Car(汽车类)

class Car{

String color;

String name;

String model;

}

Car bm = new Car();

通常把这条语句的动作称之为创建一个对象,其实,它包含了三个动作。

1)右边的“new Car()”,是以Car类为模板,调用Car类的构造函数,在堆空间里创建一个Car类对象。

2)左边的Car bm是创建了一个引用变量,就是可以用来指向Car对象的引用

3)=操作符使对象引用指向刚才所创建的对象,也就是将对象的地址赋给引用变量bm

值传递和引用传递

  • 值传递:方法调用时,实际参数把自己的值传递给形式参数,形式参数只是用实际参数的值来初始化自己的存储单元内容,两个存储单元是不同的,所以形式参数的值改变并不会影响实际参数的值

public class Demo {    
     private int a;    
    /*          
    基本类型值传递                    
    */    
    public static void main(String[] args) {        
        Demo d = new Demo();        
        int a =10;       
        d.test(a);        
        System.out.println(a);    
    }    
    /*    
    形参b    
    用实参a的值,直接对b进行了赋值,在内存中有两个独立的存储空间 a,b    
    */    
    public void test(int b) {        
        b =20;//b的值发生改变 不会影响到a    
    }}

  • 引用传递:也就是传地址,方法调用时,实际参数就是对象,这个时候实参和形参指向的是同一个地址,所以这个方法执行时对形参的改变会影响到实参

public class Demo {    
    /*      
      引用类型 在传递时,传的是对象的地址            
      */    
      public static void main(String[] args) {       
      Demo d = new Demo();      
      Person zs = new Person("张三",20);      
      d.test(zs);//只是把对象的地址传给了 p                                         System.out.println(zs.name);//李四
      }    
      /*    
      */    
      public void test(Person p) {
      //p和zs指向的是同一个对象           
      p.name = "李四";    }

总结:基本类型值传递是该数据的本身,而引用类型的传递是对对象的引用,传的是地址而不是对象的本身。

this关键字

  • this关键字代表当前对象

  • 使用this关键字引用成员变量

  • 使用this关键字引用成员方法

在一个类中方法或者构造方法内部,可以用“this.成员变量名”这样的格式来引用成员变量名,常常可以用来区分成员变量和局部变量

public class Demo{

private int a;

public Demo(int a){

this.a = a;

}

public int getA(){

return a;

}

public void setA(int a){

this.a = a;

}

}

static关键字

  • static被成为静态,可以用来修饰类的属性,方法,代码块,内部类。

    • 随着类的加载而加载

    • 优先于对象的存在

    • 修饰的成员,被所有对象共享

    • 可不创建对象,直接被类调用

    /*    
     static 静态 修饰属性,方法,代码块,内部类(后面讲)           
       类变量,和类一样只有一份       
      被static修饰的内容,随着类的加载而加载,优于对象存在,被所有对象共享,可以通过类名直接调用       
 */
     public class Chinese {    
       String name;//name属性不建议修饰为static,在内存中只有一份,而name每个对象都不一样    
         int age;    
         static String country = "中国";//常量一般修饰为static        
         /*           
         static修饰方法,类方法,静态方法不能使用非静态的成员变量,静态资源随着类先加载,                         
         非静态的随着对象的创建而加载        
         */    
         public static void test(){        
             //System.out.println(name);    
         }     
         /*          
         非静态方法可以使用静态变量,非静态方法必须通过对象来调用,对象创建之前先加载类        */    
         public void test1(){       
             System.out.println(country);    
         }}
​
public class Test {
​
    public static void main(String[] args) {
        Chinese zs = new Chinese();
                zs.name = "张三";
                zs.age = 20;
        Chinese ls = new Chinese();
        ls.name = "李四";
        ls.age = 20;
​
        Chinese.country = "china";
        System.out.println(zs.name);
        System.out.println(ls.name);
        System.out.println(zs.country);
        System.out.println(ls.country);
​
        Chinese.test();//静态方法,静态变量 建议使用类名调用
    }
}

代码块

   public class Demo {    
     String name;    
     static String country = "中国";    
     public Demo() {        
     System.out.println("无参构造");    
     }    
     /*      
     代码块:类似一个没有名字的方法.      
     代码块:
     实例代码块  在创建对象之后执行,调用构造方法之前执行,每创建一次对象,执行一次             
     静态代码块  在类加载时候执行,只执行一次,多个静态按照先后顺序            
     类什么时候加载?             
     main方法在哪个类中执行,这个类加载的.             
     创建某个类的对象,             
     调用某个类中的静态属性,方法         
     */ 
     {        
     System.out.println("实例代码块");    
     }   
     static {        
     System.out.println("静态代码块2");    
     }   
     static {       
     System.out.println("静态代码块1");    
     }
     }
​
public class TestDemo {
​
    public static void main(String[] args) {
        new Demo();
        new Demo();
​
        //System.out.println(Demo.country);
        //System.out.println(Demo.country);
    }
}

包:为了更好地组织类,java提供了包机制,用于区别类名的命名空间(是类路径中的一部分 地址)。       
避免类重名      
按功能管理(目前按日期管理)          
GUI(窗口)          
数据访问层          
工具类         
包的命名规则:包名都小写             
项目类型:com(商业) org(组织) edu gov             
公司名称:oracle sun huawei            
项目名称:oa,erp,cms             
功能模块:窗口/视图层  数据访问层 服务层  工具类               
细分子模块

访问权限修饰符

java有四种访问权限修饰符,由大到小依次是public,protected,default,priva

/*   
访问权限修饰符:用来修饰类,成员变量,成员方法,内部类,控制对齐访问的权限   
访问权限和包是密切相关的   
public     公共的    类,成员变量,方法,内部类    在任何类中都可以访问   
protected  保护的      成员变量,方法,内部类   
(default)  默认的(无)  类,成员变量,方法,内部类   
private    私有的       成员变量,方法,内部类   
*/
public class Demo1 {       
public String pubname;       
protected  String proname;      
String name;   
private  String priname;  
​
public void pubtest(){       }  
​
protected  void protect(){       }    
​
void test(){       }      
​
private void pritest(){       }   
​
​
public static void main(String[] args) {       
Demo1 demo1 = new Demo1();      
System.out.println(demo1.pubname);        System.out.println(demo1.proname);        System.out.println(demo1.name);        System.out.println(demo1.priname);//在本类中都可以访问到      
}}

封装

/*   
封装:将类的某些信息隐藏起来(用访问权限修饰符来实现),不让在外部直接对其访问,        可以通过一个特定的方法来对隐藏信息进行访问,便于控制        
设计模式:解决某一类问题的解决方案(模式)        
单例模式-->让一个类在一个程序,只能创建一个对象
*/
public class Dog {   
//隐藏类的属性    
private String name; 
    
public Dog(){    }    
        public Dog(String name) {        
                  if (name!=null){            
                     this.name = name;        
                 }    
               }    
private void eat(){    }   
//提供特定的方法,对隐藏成员进行访问    
public void setName(String name){  
if(name!=null){            
this.name = name;        
}    }  
public String getName(){        
return this.name;   
}}
​
public class TestDog {
​
    public static void main(String[] args) {
        Dog dog = new Dog("旺财");
        //dog.name = "";//直接访问类的成员
​
        Dog dog1 = new Dog();
        dog1.setName("小黑");
​
        System.out.println(dog1.getName());
        System.out.println(dog.getName());
    }
}
  • 24
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

重开之Java程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值