面向对象_01

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象_01相关的知识,希望对你有一定的参考价值。

概述:程序中使用对象来映射现实中的事物,使用对象的关系来描述事物之间的联系,这种思想称面向对象。

三大特性:封装性、继承性、多态性
封装:隐藏对象的属性和实现细节,仅对外提供公共访问方式
原则:将不需要的对外提供的内容隐藏
属性都隐藏,提供公共方法对其访问
好处:将变化隔离
便于使用
提高复用性
提高安全性

通俗理解:用Java对现实生活中的事物进行描述,通过类的形式来体现。
描述事物的关系:属性,行为
类:是对象的抽象,用于描述一组对象的共同特征和行为。
类中可定义成员变量和成员方法:成员变量<-->属性 ,成员方法<-->行为

1 class Person{
2         int age;
3         String name;
4         //speak方法
5         void speak(){
6             System.out.println("姓名:"+name+"\\n"+"年龄:"+age);
7         }
8     }

区分成员变量与局部变量?
定义在类中==>成员变量
定义在方法==>局部变量
注:局部变量与成员变量同名,则优先访问局部变量

 1 package new_Object;
 2 class Number{
 3     int n=2017;//类中定义称为成员变量
 4     void show(){
 5         int n=2018;//方法中定义称为局部变量
 6         System.out.println("访问局部变量:"+n);
 7     }
 8 }
 9 public class Example_Demo {//成员变量与局部变量 
10     public static void main(String[] args) {
11         new Number().show();
12     }
13 }

eclipse运行:

技术分享图片

成员变量和局部变量得区别:
1,成员变量定义在类中,整个类中都可以访问,局部变量定义在函数,语句,局部代码块中,只在所属的区域有效。
2,成员变量存在于堆内存的对象中
     局部变量存在于栈内存的方法中
3,成员变量随着对象的创建而存在,随对象的消失而消失
   局部变量随着所属区域的执行而存在,随着所属区域结束而释放
4,成员变量都有默认初始化值 
     局部变量没有默认初始化值

类与对象关系:类=>事物的描述,对象=>该事物的实例.Java中通过关键字 new来创建对象 即:
对象创建与使用==v
类名 对象名称=new  类名 ();
Person p=new Person();
使用对象:通过对象.成员调用

 1 package new_Object;
 2 class Person_03{
 3     int age;
 4     String name;
 5     //speak方法
 6     void speak(){
 7         System.out.println("姓名:"+name+"\\n"+"年龄:"+age);
 8     }
 9 }
10 public class Example_01 {//访问对象成员
11     public static void main(String[] args) {
12         //创建两个Person对象
13         Person_03 p1=new Person_03();
14         Person_03 p2=new Person_03();
15         //赋值
16         p1.name="小明";
17         p1.age=12;
18         //    调用对象方法
19         p1.speak();
20         p2.speak();
21     }
22 }

eclipse run:
技术分享图片

匿名对象[对象的简写格式]:Person p =new Person();<==>new Perosn.speak();
1,当对象对方法仅进行一次调用的时候,就可简化成匿名对象
2,匿名对象可作为实例参数进行传递

 1 class Person{
 2         int age=12;
 3          String name="小明";
 4          void speak(){
 5             System.out.println("姓名:"+name+"\\n"+"年龄:"+age);
 6         }
 7      }
 8 public class Example_01 {
 9      public static void main(String[] args) {
10          new Person().speak();
11      }
12  }

技术分享图片

类的封装:将类中的属性私有化,使用关键字private修饰,私有属性只能在它所属的类中被访问,外界访问则需要提供public修饰公有方法,例如:getXxx和 setXxx

 1 package new_Object;
 2 class Student{
 3         //创建私有化属性
 4         private String name;
 5         private int age;
 6         //公有的getXxx()和getXxx()方法
 7         public String getName()
 8         {
 9             return name;
10         }
11         public void setName(String stuName)
12         {
13             name=stuName;
14         }
15         public int getAge()
16         {
17             return age;
18         }
19         public void setAge(int stuAge)
20         {
21             //判断年龄数据是否合法
22             if (stuAge>0 && stuAge<=130) 
23             {
24                 age=stuAge;
25             }else
26             {
27             System.out.println("年龄数据不合法");
28             }
29         }
30          void speak()
31          {
32             System.out.println("姓名:"+name+"\\n"+"年龄:"+age);
33         }
34     }
35 public class EncapTest {//类的封装
36     public static void main(String[] args) {
37         Student stu =new Student();
38         stu.setName("小明");
39         stu.setAge(-23);
40         stu.speak();
41     }
42 }

技术分享图片

 构造函数:1,函数名与类名一致
      2,不用定义返回值类型
         3,没有具体的返回值
作用:给对象进行初始化
  一个类中如果没有定义过构造函数,该类会有一个默认的空参数构造函数,如果在类中定义了制定的构造函数,该类中默认构造函数就没有了。

一般函数和构造函数的区别?
  构造函数:对象创建时,就会调用对应的构造函数,对对象进行初始化
  一般函数:对象创建后,需要函数功能时才调用

  构造函数:对象创建时,会调用只调用一次
  一般函数:对象创建后,可以被调用多次
  构造函数可以有多个,用于对不同的对象进行针对性初始化。

 1 package new_Object;
 2 class Person_02{
 3     private String name;
 4     private int year;
 5     //定义构造函数
 6     Person_02(){
 7         name="迪丽热巴·迪力木拉提";
 8         year=9263;
 9         //System.out.println(name+":"+year);
10     }
11     Person_02(String n,int data){
12         name=n;
13         year=data;
14     }
15     public void speak(){
16         System.out.println(name+":"+year);
17     }
18 }
19 public class Cons_Demo03 {//构造函数另一种写法,link-Cons_Demo/Cons_Demo01
20     public static void main(String[] args) {
21         Person_02 p1=new Person_02();
22         p1.speak();
23         Person_02 p2=new Person_02("胖迪",18);
24         p2.speak();
25     }
26 }

技术分享图片

多个构造函数在类中是以重载的形式来体现的。
重载:方法名相同,参数列表不一样且方法名与类名相同

 1 package new_Object;
 2 class Person_01{
 3         String name;
 4         int age;
 5         //定义两个参数的构造函数
 6         Person_01(String Nname,int Aage){
 7             name=Nname;
 8             age=Aage;
 9         }
10         //定义一个参数的构造函数
11         Person_01(String Nname){
12             name=Nname;
13         }
14         void show(){
15             System.out.println("姓名:"+name+age+"岁");
16         }
17     }
18 public class Cons_Demo02 {//方法的重载
19     public static void main(String[] args) {
20         //创建p1,p2两个对象
21         Person_01 p1=new Person_01("小明",18);
22         p1.show();
23         Person_01 p2=new Person_01("小红");
24         //通过对象p1,p2调用show方法
25         p2.show();
26     }
27 }

技术分享图片

this关键字:
当成员变量和局部变量冲突,可用关键字this区分
this:代表对象,代表哪个对象?[当前对象]
this就是所在函数所属对象的引用
简单说:哪个对象调用了this所在的函数,this就代表哪个对象

 1 package new_Object;
 2 class Person_07{
 3     String name;
 4     int age;
 5     Person_07(String name){
 6         this.name=name;
 7     }
 8     Person_07(String name,int age){
 9         this.name=name;
10         this.age=age;
11     }
12     void speak(){
13         System.out.println(this.name+":"+this.age);/*this可省略*/
14     }
15 }
16 public class T_this01 {//this访问类中的成员变量,解决局部与成员变量名冲突
17     public static void main(String[] args) {
18         Person_07 p1=new Person_07("小红",13);
19         p1.speak();
20         Person_07 p2=new Person_07("小强",10);
21         p2.speak();
22     }
23 }
24 
25 /*
26  * 当成员变量和局部变量冲突,可用关键字this区分
27     this:代表对象,代表哪个对象?[当前对象]
28         this就是所在函数所属对象的引用
29         简单说:哪个对象调用了this所在的函数,this就代表哪个对象
30  * */

技术分享图片

this调用其他构造函数==>this.(参数1)

 1 package new_Object;//构造函数之间的this
 2 class Person_08{
 3     String name,Class;
 4     int age;
 5     Person_08(){
 6         name="小明";
 7         age=15;
 8     }
 9     Person_08(String name){
10         this.name=name;
11     }
12     Person_08(String name,int age){
13         /*对this的调用必须是构造函数中的第一个语句,因为初始化先执行*/
14         this(name);
15         //this.name=name;
16         this.age=age;
17     }
18     void speak(){
19         System.out.println(this.name+":"+this.age);
20     }
21 }
22 public class T_this02 {
23     public static void main(String[] args) {
24         new Person_08().speak();
25         Person_08 p1=new Person_08("小红");
26         p1.speak();
27         Person_08 p2=new Person_08("小强",10);
28         p2.speak();
29     }
30 }

技术分享图片

注:对this的调用必须是构造函数中的第一个语句,因为初始化先执行

static 关键字:
用于修饰成员(成员变量和成员函数)
static特点:  1,static一个修饰符,用于修饰成员
      2,static修饰的成员被所有对象共享
      3,static优先于对象存在,因为static的成员随着类的加载而存在
      4,static修饰的成员可直接被类名所调用==>类名.静态成员
      5,static修饰的数据是共享数据,对象中的存储是特有数据

 1 //static共享数据
 2 package new_Object;
 3 class Person_05{
 4     static String name;//成员变量【实例变量】
 5     static String country="China";//静态变量【类变量】
 6     public static void speak(){
 7         System.out.println(country+":"+name);
 8     }
 9 }
10 public class S_static01 {
11     public static void main(String[] args) {
12         //Person p=new Person();
13         Person_05.speak();
14 //        p.name="小强";
15 //        p.speak();
16 //        System.out.println(p.country);/*被对象调用*/
17 //        System.out.println(Person.country);/*类名进行调用*/
18     }
19 }

技术分享图片

成员变量和静态变量区别?
1,两个变量生命周期不同。
  -成员变量随着对象的创建而存在,随着对象被回收而释放
  -静态变量对着类的加载而存在, 随着类的消失而消失[虚拟机结束]

2,调用方式不同
  -成员变量只能被对象调用
  -静态变量可被对象调用,也可被类名调用==>类名.静态成员

3,别名不同
  -成员变量也称实例变量
  -静态变量称类变量
4,数据存储位置不同
  -成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据
  -静态变量数据存储在方法区(数据共享区)的静态区,所以也叫对象的共享数据

静态使用的注意事项:
1,静态方法只能访问静态成员[变量,函数](非静态既可访问静态,也可访问非静态)
2,静态方法中不可以使用this或super关键字(因为没有对象)
3,主函数是静态的

静态什么时候用?
1,静态变量
  当分析对象中所具备的成员变量值都是相同的,这时这个成员可静态修饰,
  只要数据在对象中都是不同的,就是对象的特有数据,必须存储在对象中,是非静态的。如果是相同的数据,对象不需要修改,只需要使用即可,不需要存储在对象,定义成静态的。
2,静态函数
  函数是否用静态修饰,就参考一点,就是该函数功能是否有访问到对象中的特有数据。简单点说:从源代码看,该功能是否需要访问非静态的成员变量,如果需要,该功能就是非静态的,不需要则是定义成静态的。


静态代码块:独立的代码区间,static代码块随着加载而执行且执行一次。
作用:用于给类进行初始化

 1 //静态代码块
 2 package new_Object;
 3 class StaticCode{
 4         static int num;
 5         static{
 6             num=2;
 7             System.out.println("static静态代码块");
 8         }
 9         void speak(){
10             System.out.println(num);
11         }
12     }
13 public class S_static02 {
14     public static void main(String[] args) {
15 //        StaticCode p=new StaticCode();
16 //        p.speak();
17         new StaticCode().speak();
18         new StaticCode().speak();
19         /*
20          * static代码块随着加载而执行且执行一次
21          * 作用:用于给类进行初始化
22          * */
23     }
24 }

技术分享图片

代码块对所有相同对象的初始化

 1 //构造函数代码块所有对象初始化
 2 package new_Object;
 3 class Person_06{
 4     private String name;/*私有化name属性*/
 5     //构造代码,所有对象初始化
 6     {
 7         Class();//调用封装
 8     }
 9     //创建两个Person构造函数
10     Person_06(){//对应对象进行针对性初始化
11         name="小红";
12         //Class();
13     }
14     Person_06(String name){
15         this.name =name;
16         //Class();
17     }
18     //打印方法
19     void speak(){
20         System.out.println("姓名:"+name);
21 
22     }
23     //统一属性进行封装
24     public void Class(){
25         System.out.print("班级:软件工程\\t");
26     }
27 }
28 public class S_static03 {
29     public static void main(String[] args) {
30         Person_06 p1=new Person_06();
31         p1.speak();
32         Person_06 p2=new Person_06("小明");
33         p2.speak();
34     }
35 }

技术分享图片

 







































































以上是关于面向对象_01的主要内容,如果未能解决你的问题,请参考以下文章

python之路之前没搞明白4面向对象(封装)

06.01_面向对象(面向对象思想概述)

面向对象_多态_抽象类_接口

01_java面向对象编程语言的思考

java基础学习_面向对象(上)01_day07总结

day07-01-面向对象进阶