JAVA基础第六天

面向对象编程(上)

1.面向过程和面向对象的编程思想 

  • 面向过程的编程思想:
    • 以流程为为单位,注重功能的实现
  • 存在的问题:
    • 流程之间相互依赖,导致代码之间的耦合性非常高
    • 不利于程序的维护和后期功能的扩展
  • 面向对象的编程思想: 
    • 面向对象是建立在面向过程的基础之上,也就是说在面向对象的编程中一定会用到面向过程的编程思想。
    • 面向对象就是把任何一个事物看作是一个整体,从事物的特征 ( 属性 ) 和行为 ( 方法、功能 )两个方面进行描述。
  • 面向对象特点: 
    • 能够以更加贴合实际情况或者正常的思维方式,来去理解一个事物或者软件的功能
    • 面向对象是来源于生活服务于生活
    • 面向对象的编程英文简称 --OOP
    • 面向对象的四大或者三大特征:抽象 ( 可选 ) 、封装、继承、多态
  • 面向对象和面向过程的思想对比: 
    • 面向过程:是⼀种以过程为中心的编程思想,实现功能的每⼀步,都是自己实现的
    • 面向对象:是⼀种以对象为中⼼的编程思想,通过指挥对象实现具体的功能

 对象

1.什么是对象?

对象:对象是指具体存在的一个事物就是一个对象,在Java中万事万物皆对象

特点:

  • 无论两个事物有多么的相近或者相似,永远都是两个不同的对象。
  • 一项法律、法规、规章制度、政策都是一个对象

2.对象的创建和使用

1.类是模板,可以通过类创建N个属于这个类的事物就是对象,基于这个类创建的对象,那么这个对象就拥有类中定义的所有属性和方法,一个类中可以创建出N个对象,但是你要通过new关键字,那么创建的对象就是一个新的对象
  • 创建对象的格式:
    • 类名 对象名 = new 类名();
  • 调用成员的格式: 
    • 对象名.成员变量
    • 对象名.成员方法();

示例代码:

public class Test {
    public static void main(String[]args){
            //创建对象  类名 对象名 = new 类名();
        Test1  test1 = new Test1();
        //对象名.变量名
        System.out.println(test1.name);//null
        System.out.println(test1.age);//  0
        //对象名.方法名
        test1.display();
}    
}
//我们先创建一个类
public class Test1{
        创建一个方法
    public void display(){
        System.out.println("张三");
            }
   
    
}

3.单个对象的内存图 


抽象

抽象就是把同一类事物,它们共同的特征 ( 属性 ) 和行为 ( 方法 ) 进行抽取、归纳、总结。

封装

  • 意义和目的:就是包装的意思,为了保证抽象出来数据的安全性
  • 封装包括对属性和方法的封装,而且同一类事物要把它们的属性和方法封装到一起,这才是一个完整的封装
  • 封装不是绝对的,如果需要访问封装起来的属性和方法,就必须通过指定的公共入口(方法、接口)
  • 抽象和封装都是概念性的,在程序中它们都需要代码的形式来体现,这就是类 (class)

1.private关键字

概述:private是一个修饰符,可以用来修饰成员(成员变量,成员方法)。

特点:private修饰的成员,只能在本类进行访问,针对private修饰的成员变量,如果需要被其他类使用, 提供相应的操作

  • 提供“get变量名()”方法,用于获取成员变量的值,方法用public修饰
  • 提供“set变量名(参数)”方法,用于设置成员变量的值,方法用public修饰
示例代码:
/*定义标准的学⽣类,要求name和age使⽤private修饰
并提供set和get⽅法以及便于显示数据的show⽅法
测试类中创建对象并使⽤,最终控制台输出 林⻘霞,30**/


/*
 学⽣类
*/
class Student {
 //成员变量
 private String name;
 private int age;
 //get/set⽅法
 public void setName(String n) {
 name = n;
 }
 public String getName() {
 return name;
 }
 public void setAge(int a) {
 age = a;
 }
 public int getAge() {
 return age;
 }
 public void show() {
 System.out.println(name + "," + age);
 }
}
/*
 学⽣测试类
*/
public class StudentDemo {
 public static void main(String[] args) {
 //创建对象
 Student s = new Student();
 //使⽤set⽅法给成员变量赋值
 s.setName("林⻘霞");
 s.setAge(30);
s.show();
 //使⽤get⽅法获取成员变量的值
 System.out.println(s.getName() + "---" + s.getAge());
 System.out.println(s.getName() + "," + s.getAge());
 }
}

Java中,类中存放的就是抽象出来的属性和方法。
类的定义语法:
[访问修饰符] class 类名{ 

//属性 //方法 

    }

属性:就是变量,也成为属性。

  • 成员属性或者全局变量:就是在类中任何方法或者代码块外部定义的变量,整个类中都可以使用。成员变量,都有默认值,会根据数据类型来决定。
    • 整数类型的默认值是 0
    • 浮点类型的默认值是 0.0
    • boolean 类型的默认值是: false
    • char 类型的默认值是空格
    • 所有引用类型的默认值都是 null
  • 局部属性或者局部变量:就是在方法或者代码块内部定义的变量,只能在方法内部或者代码块内部使用,而且局部变量必须要初始化了才能使用。

构造方法

创建类的对象时,实际上是通过构造方法来完成的
构造方法:
  • 方法名和类名相同
  • 没有 void ,也没有 return
  • 方法不能被 static 修饰
类名 对象名 =new 构造方法 ( 参数列表 );
语法:
[访问修饰符] 类名(参数){

 }

构造方法的作用:

  • 创建对象
  • 可以对成员属性进行初始化

构造方法的分类:

  • 当一个类中,不存在任何形式的构造方法时,那么JVM会提供一个默认的无参数的构造方法。
  • 构造方法分为:
    • 无参数的构造方法
      • 隐式无参数的构造方法
      • 显示无参数的构造方法
    • 有参数的构造方法,在调用时,需要传递数据,而且数据要和构造方法中参数的类型,个数,顺序必须完全匹配。
  • 构造方法中的参数,有被称为形式参数(形参),在调用这个构造方法时,传递的数据称为实际参数(实参)
  • 在一个类中,可以同时拥有多个构造方法,只要构造方法之间的参数列表不同即可。

示例代码:

/** 构造方法 */
public class Demo2{ 
    public Demo2(){ 
             System.out.println("------无参数的构造方法------"); }
    public Demo2(String name,int age){
             System.out.println("------有参数的构造方法----- name="+name+", age="+age); }
    public Demo2(int a,int b){ 
             System.out.println("------有参数的构造方法----- a="+a+", b="+b); }
    public static void main(String[]args){ 
             Demo2 demo2=new Demo2("zhangsan",20); 
             

                } }

方法

方法就是完成同一功能的代码块。

语法:

[访问修饰符] 返回值类型 方法名(参数列表){ 
    //返回值 
    return 返回值; 
}
  • 方法分类:

1.无返回值无参数的方法

[访问修饰符] 返回值类型 方法名(参数列表){
 //返回值 
return 返回值; }

2.有返回值无参数的方法

[访问修饰符] 返回值类型 方法名(){
 //代码
 //返回值 return 值; 
}
说明:返回值类型由返回值来决定的 
      带有返回值的方法的最后一句代码,一定是:return 返回值; 而且一次只能返回一个值。

3.无返回值有参数的方法

[访问修饰符] void 方法名(数据类型 参数1,数据类型 参数2,...){

 }
说明: 方法中的参数可以有多个,参数之间使用逗号分隔。
      方法中的参数也称为形式参数(形参)
      调用有参数的方法时,传递的数据称为实际参数(实参),在传递数据时,
      必须和目标方法中参数 的个数,类型,顺序完全一致。

4.有返回值有参数的方法

[访问修饰符] 返回值类型 方法名(参数列表){ 
//最后一句代码
 return 返回值; }

示例代码:

/** 方法的定义 */
public class Demo3{ 
    //无返回值无参数的方法
     public void test1(){ 
        System.out.println("------无返回值无参数的方法------"); }
    //有返回值无参数的方法 
    public int test2(){ 
        System.out.println("------有返回值无参数的方法------");
         return 10+20; }
    //无返回值有参数的方法 
    public void test3(int a,int b,int c){ 
        System.out.println("a+b+c= "+(a+b+c)); }
    //有返回值有参数的方法 
public String test4(String name,int age,String address){ 
    return "姓名:"+name+",年龄是:"+age+",住址是:"+address; }
public static void main(String[]args){ 
    //创建对象 
    Demo3 demo3=new Demo3(); 
    //调用方法 
        demo3.test1();
     int num=demo3.test2(); 
    System.out.println(num); 
    System.out.println(demo3.test2());
     demo3.test3(10,20,30); 
    System.out.println(demo3.test4("张三",25,"天津")); } }

代码的执行顺序

  • JavaSE中,main方法是程序的入口,所有普通的方法,都要在main方法中被调用才有机会得到运行;普通方法运行完毕后,再回到Main方法,所以,程序从Main方法开始,也从Main方法结束。
  • 普通方法之间的调用,直接写 方法名(参数列表) 即可

示例代码:

/** 代码之间执行的流程 */
public class Demo5{ 
public static void main(String[]args){ 
Demo5 demo5=new Demo5(); 
demo5.t1(); 
demo5.t2(50,55);
System.out.println("---程序结束---"); }
public void t1(){ 
System.out.println("---开始执行t1方法......");
System.out.println("---t1方法执行完毕---"); }
public void t2(int a,int b){ 
System.out.println("---开始执行t2方法......"); 
System.out.println(a+"+"+b+"="+(a+b));
System.out.println("---t2方法执行完毕---"); 

} }

this关键字

  • 使用场景:this关键字只能出现在没有被static修饰的方法中。
  • 作用:this关键字表示对当前类某个对象的引用(哪个对象调用这个方法,this就指向谁)
  • 用法:
    • 当方法中的局部变量或者参数和成员(全局)变量完全一致时,以局部变量或者参数为主(就近原则);如果此时就想调用全局变量,则可以通过this关键字来解决,格式是:this.属性名
    • 当this以this(参数列表)的形式,出现在构造方法的第一句代码时,就表示当前构造方法,调用了该类中其它的构造方法,可以通过this的参数列表来匹配。

示例代码:

/** 就近原则 */
public class Demo6{ 
int num=999;
 public Demo6(){
 this("张三",22); 
System.out.println("---------回到了无参数的构造方法--------"); }
public Demo6(String name,int age){ 
System.out.println("有参数的构造方法 name="+name+",age="+age); }
public static void main(String[]args){ 
Demo6 demo6=new Demo6();
 demo6.t1(); }
public void t1(){ 
int num=666; 
System.out.println(this.num);//对象名.属性名 调用的一定是全局变量 } }

方法重载

  • 多态:就是同一种事物在不同的情况下有多种表现形式。
  • 多态有两种表现形式
    • 方法重载
    • 方法重写
  • 方法重载:方法重载:在同一个类中,有多个方法名相同,但是参数列表不同包括参数的个数、类型、顺序的不同。
    • JVM会根据参数来匹配相应的方法
    • Java中普通方法和构造方法都可以重载
  • 返回值类型不同,其它都相同的情况下,构不成方法重载。
/** 方法重载 */
public class Demo7{ 
public static void main(String[]args){ 
Demo7 demo7=new Demo7(); 
demo7.t1(100); 
demo7.t1(20,"zhangsan"); }
public int t1(int a){ 
return 100; }
public double t1(int a,int b,int c){ 
return 99.99; }
public void t1(){ 
System.out.println("---无参数的t1方法---"); }
public void t1(int a,int b){
 System.out.println("两个参数:"+(a+b)); }
public void t1(String name,int age){ 
System.out.println("姓名:"+name+" 年龄:"+age); }
public void t1(int age,String name){ 
System.out.println("年龄:"+age+",姓名:"+name); 

} }

Object类
  • Object类在Java中,是所有类的父类(超类、基类、根类),它位于java.lang包中。
  • 凡是位于java.lang包中的类,都无需导包,可以直接使用。
  • 如果一个类没有明确指明它的父类,则父类默认就是Object类。
  • Object类中的方法:
    • public String toString():用来输出对象的字符串表示形式,包名 . 类名 @对象哈希码值的16进制

  • 为了解决在大型项目开发中,数目众多的类命名冲突的问题,java引入了包的概念。包其实就是我们操作系统中的目录。
  • 包的目录层次结构使用.分隔

package打包

  • 语法:
    • package 包名 ;
    • package 一定要位于源文件的第一句代码
  • JDK8之前编译带包的类语法:
    • javac -d . 类名.java
    • . 表示在当前目录生成带包的字节码文件
  • 在指定目录下生成带包的字节码文件
    • javac -d 目录 类名 .java
  • JDK8之前执行带包的字节码文件:
    • java 包名 . 类名

import导包

  • 如果使用的目标类,和当前类不在同一个包下,则必须导入目标类所在的包,才能使用。
  • 导包语法:
    • import 包名 . 类名 或者 包名 .*
    • Import 语句一定要位于 package 语句下面。

JavaBean

  • JavaBean是一个可以重复使用的组件,也是Java中的一个普通类,只不过它需要遵循一定的规则,才能称为javabean
  • JavaBean的规范:
    • 类中所有的成员属性都是私有,也就是private来修饰
    • 提供一个公共无参数的构造方法
    • 为所有私有的属性提供公共的setget方法。
    • set 方法是有参数无返回值的,目的是通过 set 方法给 javabean 中的私有属性赋值,命名
      方式 setXxx( 数据类型 参数名 ) ,Xxx 表示是属性名
    • get 方法是无参数有返回值的,目的是通过 get 方法获取 javabean 中私有属性的值,命名
      方式 getXxx()
    • boolean类型的get方法 是以 is开头的

示例代码:

/** javabean */
public class Demo9{
public static void main(String[]args){ 
Student stu=new Student();
 stu.setStuId(1001); 
 stu.setName("zhangsan"); 
 stu.setScore(99.9); 
 stu.setGender(false);
System.out.println(stu.getStuId()+" "+stu.getName()+" "+stu.getScore()+" "+stu.isGender());
}
 }
//学生类 
class Student{
 private int stuId; 
 private String name; 
 private double score;
 private boolean gender; 
 public Student(){
 }
public void setStuId(int stuId){ 
    this.stuId=stuId; }
public int getStuId(){
     return stuId; }
public void setName(String name){ 
    this.name=name; }
public String getName(){ 
    return name; }
public void setScore(double score){ 
    this.score=score; }
public double getScore(){ 
    return score; }
public void setGender(boolean gender){ 
    this.gender=gender; }
public boolean isGender(){ 
    return gender; } }




访问修饰符 

  • 访问修饰符可以用来限定一个元素被使用的范围
  • private只能修饰属性和方法,不能修饰类,一般成员属性私有,方法公共public
  • public一般用来修饰类和方法,默认修饰符也可以修饰属性、方法、类】
  • protected比较特殊,一般用来修饰受保护的属性和方法】

方法的传递

  • Java中参数的传递,无论是基本数据类型还是引用数据类型,都是采用的值传递
  • 基本数据类型,传递的是参数的副本,目标方法中无论如何修改,都不影响其本身
  • 引用数据类型,传递的是地址,目标方法中如果对其进行修改,其本身也会发生变化

基本数据类型传递:

/** 基本数据类型参数的传递 */
public class Demo12{ 
public static void main(String[]args){ 
Demo12 demo12=new Demo12(); 
int n=10; 
System.out.println("调用方法t1之前,n的值是:"+n);
 demo12.t1(n); 
System.out.println("调用方法t1之后,n的值是:"+n); }
public void t1(int num){ 
System.out.println("t1方法中参数Num="+num); 
num=999; 
System.out.println("t1参数重写赋值后Num="+num); } }

引用数据类型传递:

/** 引用类型参数的传递 */
public class Demo13{ 
public static void main(String[]args){ 
Demo13 demo13=new Demo13(); 
Animal animal=new Animal(); 
animal.name="Dog"; 
animal.age=5; 
System.out.println("调用t1方法之前:"); 
animal.display(); 
demo13.t1(animal); 
System.out.println("调用t1方法之后:"); 
animal.display(); }
public void t1(Animal animal){ 
animal.name="Tiger"; 
animal.age=10; } }
class Animal{ 
String name; 
int age; 
public void display(){ 
System.out.println("动物类"+name+",年龄"+age); } }

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值