Java面向对象OOP(上)

1、初识面向对象

  1. 面向过程和面向对象
  2. 面向对象OOP本质:以的方式组织代码,以对象的形式封装(组织)数据。
  3. 抽象
  4. 三大特性:
    封装
    继承
    多态

2、方法回顾和加深

1 方法的定义

  1. 修饰符

  2. 返回类型

  3. break和return的区别:

    break跳出switch,结束循环
    return结束方法,返回一个结果
  4. 方法名:驼峰命名、见名知意

  5. 参数列表:(参数类型, 参数名)… 可以有多个

  6. 异常抛出:如数组下表越界

package OOP.OOP1;

//Demo1  类
public class Demo1 {
    //main  方法
    public static void main(String[] args) {
        //
    }

    /*
    修饰符         返回类型    方法名(...){
        //方法体
        return  返回值;
    }
     */

    public String sayHello(){
        return "helloworld";
    }
    public int max(int a1,int b1){
        return a1 > b1?a1:b1;
    }

}

2 方法的调用

  1. 静态方法
  2. 非静态方法
  3. 形参和实参
  4. 值传递和引用传递
  5. this关键字

3 方法的重载(overload)

概念在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。
特点:与返回值类型无关,只看参数列表,且参数列表必须不同。(参数个数或参数类型)。调用时,根据方法参数列表的不同来区别
示例

我们自己写的重载方法
public class PrintStream {
	//普通方法
	public static void print(int i) {……}
	public static void print(float f) {……}
	public static void print(String s) {……}
	
	//main方法
	public static void main(String[] args) {
		print(3);
		print(1.2f);
		print("hello!");
	} 
}
另外,System.out.println()方法就是典型的重载方法,其内部的声明形式如下
public void println(byte x)
public void println(short x)
public void println(int x)
public void println(long x)
public void println(float x)
public void println(double x)
public void println(char x)
public void println(double x)
public void println()
……

4 可变个数形参

当调用可变个数形参的方法时,传入的参数个数可以是:0个,1个,2个等等
可变个数形参在方法的形参中,最多只能声明一个可变形参且必须声明在末尾

1 可变个数形参

结果:
show(String ... strs)
hello
BB
CC
show(String ... strs)
hello
BB
CC
test.show(new String[]{"hello","BB","CC"});
test.show("hello","BB","CC");

public void show(String ... strs){
		System.out.println("show(String ... strs)");
		
		for(int i = 0;i < strs.length;i++){
			System.out.println(strs[i]);
		}
}
2 字符串数组

结果:
show(String [] strs)
hello
BB
CC
show(String [] strs)
null
null
null
test.show(new String[]{"hello","BB","CC"});
test.show(new String[3]);
test.show("hello","BB","CC");      //ERROR 实参和形参列表长度不同

public void show(String[] strs){
		System.out.println("show(String ... strs)");

		for(int i = 0;i < strs.length;i++){
			System.out.println(strs[i]);
		}
}

5 值传递

值传递机制:
如果变量是基本数据类型,此时赋值的是变量所保存的数据值
如果变量是引用数据类型,此时赋值的是变量所保存的数据的地址值

面试题1
在这里插入图片描述

解法1( `System.exit(0); `      终止当前正在运行的 Java 虚拟机)
a *= 10;
b *= 20;
System.out.println(a);
System.out.println(b);
System.exit(0);
解法2:重写方法?


面试题2
在这里插入图片描述
在这里插入图片描述
面试题3(乐视)
在这里插入图片描述

3、对象的创建分析

  1. 使用new关键字创建对象

1、使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的对象进行 默认的初始化以及对类中构造器的调用
2、类中的构造器也称为构造方法,是在创建对象的时候必须要调用的。构造器有以下两个特点:
1)必须和类的名字相同
2)必须没有返回类型,也不能写void

package OOP.OOP1;

public class Demo2 {
    public static void main(String[] args) {
        //实例化这个类
        //对象类型   对象名  =  对象值;
        Student student = new Student();
        int result = add(1,2);
        System.out.println(result);
    }
    public static int add(int a,int b){
        return a+b;
    }
}

package OOP.OOP1;

//学生类
public class Student {

    //非静态方法
    public void say(){
        System.out.println("学生说话了");
    }
    //静态方法:和类一起加载的(创建对象前就已经存在)
    public static void a(){
        //b();     error
    }
    //非静态方法:类实例化之后才存在
    public void b(){
        a();
    }

}
  1. 构造器必须掌握
package OOP.OOP2;
public class Person {
    //一个类即使什么都不写,它也会存在一个方法
    //显式地定义构造器
    String name;
  
    //实例化初始值
    //1、使用new关键字,必须要有构造器
    //2、用来初始化值
    public Person(){
        this.name = "xiaosan";
    }

    //有参构造:一旦定义了有参构造,无参就必须显式定义
    public Person(String name){
        this.name = name;
    }

    //alt + insert 自动生成构造函数的快捷键
}

/*
public static void main(String[] args) {
        //new  实例化了一个对象
        Person person = new Person("xiaosi");

        System.out.println(person.name);
        //Person(xiaosi);
    }

    构造器:
        1、和类名相同
        2、没有返回值
    作用:
        1、new本质是在调用构造方法
        2、初始化对象的值
    注意点:
        1、定义有参构造后,如果想使用无参构造,必须显式地定义一个无参的构造

        Alt + Iesert

        this.name = name;
        前一个name指向当前对象     后一个是传递过来的参数
 */

一个student类

package OOP.OOP2;

//学生类
public class student {

    //属性:字段
    String name;
    int age;

    //方法
    public void study(){
        System.out.println(this.name + "在学习");
    }
}
/*
public static void main(String[] args) {

        //类:抽象的,实例化
        //类实例化后会返回一个自己的对象!
        //xiaoming对象就是一个student类的具体实例!
        student xiaoming = new student();
        student xiaohong = new student();

        xiaoming.name = "小明";
        xiaoming.age = 3;

        System.out.println(xiaoming.name);
    }

 */

4、面向对象(上)总结(概念)

  1. 类与对象
    类是一个模板,对象是一个具体的实例
    类是构造对象的模板或蓝图。
    由类构造(construct)对象的过程称为创建类的实例(instance)
  2. 方法
    定义、调用
  3. 对象的引用
    引用类型: 基本类型(8)
    对象是通过引用来操作的:栈—>堆
  4. 属性:也叫字段filed 成员变量
    默认初始化:
    数字:0
    char:u0000
    boolean:false
    引用:null
    修饰符 属性类型 属性名 = 属性值!
  5. 对象的创建和使用
    使用new关键字创造对象,构造器 Person xiaosan = new Person();
    对象的属性 xiaosan.name
    对象的方法 xiaosan.sleep()
  6. 类:
    静态的属性 属性
    动态的行为 方法

5、变量与方法

成员变量与局部变量的区别有哪些?

参数成员变量局部变量
作用域针对整个类有效只在某个范围内有效(一般就是方法,语句体内)
存储位置随着对象的创建而存在,随着对象的消失而消失,存储在堆内存中。在方法被调用,或者语句被执行的时候存在,存储在栈内存中。当方法调用完,或者语句结束后,就自动释放。
生命周期随着对象的创建而存在,随着对象的消失而消失当方法调用完,或者语句结束后,就自动释放。
初始值有默认初始值没有默认初始值,使用前必须赋值

一个类的构造方法的作用是什么?若一个类没有声明构造方法,改程序能正确执行吗?为什么?

主要作用是完成对类对象的初始化工作。可以执行。因为一个类即使没有声明构造方法也会有默认的不带参数的构造方法。

静态变量和实例变量区别

静态变量: 静态变量由于不属于任何实例对象,属于类的,所以在内存中只会有一份,在类的加载过程中,JVM只为静态变量分配一次内存空间。
实例变量: 每次创建对象,都会为每个对象分配成员变量内存空间,实例变量是属于实例对象的,在内存中,创建几次对象,就有几份成员变量。

静态变量和普通变量区别

static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。

还有一点就是static成员变量的初始化顺序按照定义的顺序进行初始化。

静态方法和实例方法有何不同?

静态方法和实例方法的区别主要体现在两个方面:

  1. 在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式 。也就是说,调用静态方法可以无需创建对象。
  2. 静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制

在一个静态方法内调用一个非静态成员为什么是非法的?

由于静态方法可以不通过对象进行调用,因此在静态方法里,不能调用其他非静态变量,也不可以访问非静态变量成员。

6、OOP特征一:封装与隐藏

一、问题的引入:
当我们创建一个类的对象以后,我们可以通过"对象.属性"的方式,对对象的属性进行赋值。这里,赋值操作要受到属性的数据类型和存储范围的制约。除此之外,没有其他制约条件。

但是,在实际问题中,我们往往需要给属性赋值加入额外的限制条件。这个条件就不能在属性声明时体现,我们只能通过方法进行限制条件的添加。(比如:setLegs())
同时,我们需要避免用户再使用"对象.属性"的方式对属性进行赋值。则需要将属性声明为私有的(private)。

–>此时,针对于属性就体现了封装性。

二、封装性的体现:
我们将类的属性xxx私有化(private)
同时,提供公共的(public)方法来获取(getXxx)和设置(setXxx)此属性的值

拓展封装性的体现:① 如上 ② 不对外暴露的私有的方法 ③ 单例模式 …

三、封装性的体现,需要权限修饰符来配合:

  1. Java规定的4种权限(从小到大排列):private、缺省、protected 、public
  2. 4种权限都可以用来修饰类的内部结构:属性、方法、构造器、内部类
    修饰类只能使用:缺省、public

总结封装性:Java提供了4种权限修饰符修饰类及类的内部结构,体现类及类的内部结构在被调用时的可见性的大小
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Lacrimosa&L

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

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

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

打赏作者

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

抵扣说明:

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

余额充值