面向对象
2.1了解面向对象
2.1.2 面向对象的概念
面向对象是相对面向过程而言,面向对象和面向过程都是一种思想。面向过程强调的是每一个功能的步骤,代表语言:C语言。面向对象强调的是对象,然后由对象去调用功能,代表语言:Java、C++、C#。
例子:把大象装进冰箱。用面向过程实现:1. 打开冰箱。2. 存储大象。3. 关上冰箱。"打开"、"存储"、"关上"都是功能行为,在代码中的直观体现就是函数或者方法,这就是一种面向过程的以功能行为为主体的思想体现。用面向对象实现:1. 冰箱打开。2. 冰箱存储。3. 冰箱关闭。可以看到,所有的操作都是以"冰箱"为主体,而不是功能行为。也就是说冰箱自己已经具备"打开"、"存储"、"关上"的行为功能,我们只需要让冰箱执行它具备的功能就可以了。这就是一种面向对象的以执行功能的对象为主体的思想体现。
2.1.2 面向对象的特点
是一种符合人们思考习惯的思想,可以将复杂的事情简单化,将程序员从执行者转换成了指挥者。
完成需求时:
1. 先要去找具有所需功能的对象来用。
2. 如果该对象不存在,那么创建一个具有所需功能的对象。
2.1.3 面向对象开发,设计,特征
开发的过程:其实就是不断的创建对象,使用对象,指挥对象做事情。
设计的过程:其实就是在管理和维护对象之间的关系。
面向对象的特征:
封装(encapsulation)
继承(inheritance)
多态(polymorphism)
2.2类与面向对象
class Phone{
//品牌
String brand;
//价格
int price;
//颜色
String color;
//打电话的方法
public void call(String name){
System.out.println("给"+name+"打电话");
}
//发短信方法
public void sedMessage(){
System.out.println("发短息");
}
}
class PhoneDemo{
public static void main(String[] args){
//创建手机对象
Phone p = new Phone();
//直接输出成员变量的值
System.out.println(p.brand+"---"+p.price+"---"+p.color);
//给成员变量赋值
p.brand = "一加";
p.price = 1999;
p.color = "black";
//再次输出
System.out.println(p.brand+"---"+p.price+"---"+p.color);
//调用方法
p.call("classmate");
p.sedMessage();
}
}
运行结果:
2.2.4 对象的内存结构
局部变量:在方法定义中或者方法声明上
class Variable{
int num;//成员变量,默认初始化值为0
public void show(){
int num = 2;//局部变量
System.out.println(num);
int num2 = 1;//局部变量
System.out.println(num2);
}
}
class VariableDemo{
public static void main(String[] args){
Variable v = new Variable();
System.out.println(v.num);//访问成员变量
v.show();
}
}
运行结果:
2.2.6 基本数据类型参数及引用数据类型参数传递
//基本数据类型参数传递
class Demo
{
public static void main(String[] args){
int x = 3;
show(x);
System.out.println("x=" + x);
}
public static void show(int x){
x = 4;
}
}
运行结果:
//引用数据类型参数传递
class Demo
{
int x = 3;
public static void main(String[] args){
Demo d = new Demo();
d.x = 9;
show(d);
System.out.println(d.x);
}
public static void show(Demo d){
d.x = 4;
}
}
运行结果:
class Student{
public void show(){
System.out.println("我爱学习");
}
}
class StudentDemo{
public void method(Student s){
s.show();
}
}
class NoNameDemo{
public static void main(String[] args){
//带名字对象的调用
Student s = new Student();
s.show();
System.out.println("--------------");
//建立一个匿名对象
new Student();
//匿名对象调用方法
new Student().show();
System.out.println("--------------");
//匿名对象作为实际参数传递
StudentDemo sd = new StudentDemo();
//匿名对象的使用
sd.method(new Student());
//匿名对象的使用
new StudentDemo().method(new Student());
}
}
运行结果:
2.3封装
class Student{
private String name;
private int age;
//年龄的获取
public int getAge(){
return age;
}
//年龄的赋值
public void setAge(int a){
age = a;
}
//姓名的获取
public String getName(){
return name;
}
//姓名的赋值
public void setName(String n){
name = n;
}
}
//测试类
class StudentTest{
public static void main(String[] args){
//创建学生类对象
Student s = new Student();
//使用成员变量
//System.out.println(s.name+"---"+s.age);
System.out.println(s.getName()+"---"+s.getAge());
//直接给成员变量赋值
//s.name=classmate; name是Student类的私有成员,外部无法直接对其赋值
//s.age=22; age是Student类的私有成员,外部无法直接对其赋值
//通过方法给成员变量赋值
s.setName("classmate");
s.setAge(22);
System.out.println(s.getName()+"---"+s.getAge());
}
}
运行结果:
2.4 构造方法
class Student {
private String name; //null
private int age; //0
public Student() {
System.out.println("这是构造方法");
}
public void speak(){
System.out.println("name:"+name+",age:"+age);
}
}
class ConstructDemo {
public static void main(String[] args) {
//创建对象
Student s = new Student();
System.out.println(s); //Student@e5bbd6
s.speak();
}
}
运行结果:
2.5 this关键字
class Person{
private String name;
private int age;
private Person(){
}
private Person(String name){
this();//this语句只能定义在构造函数的第一行,因为初始化时要先执行。
this.name = name;//用this区分后,前面的name就是成员变量,后面的name就是局部变量。
}
Person(String name,int age){
//this.name = name;
this(name);//this语句只能定义在构造函数的第一行,因为初始化时要先执行。
this.age = age;
System.out.println("name:"+ name +",age:"+ age);
}
}
class PersonDemo4{
public static void main(String [] args){
Person p = new Person("lisi",30);
}
}
运行结果:
2.6 static关键字
class Person{
String name;//成员变量,也叫实例变量。
static String country = "CN";//静态的成员变量,也叫类变量。
public void show(){
System.out.println(name+"::"+country);
}
}
class StaticDemo{
public static void main(String [] args){
Person p = new Person();
p.name = "zhangsan";
p.show();
System.out.println(p.country);//被对象调用
System.out.println(Person.country);//被类调用
}
}
运行结果:
class Person{
String name;
static String country = "CN";
//静态方法
public static void show(){
System.out.println(country + ":" + name);
}
}
编译时会报错:
2.6.3 主函数
2.7 创建对象做了哪些事情
2.8 代码块
static{
静态代码块中的执行语句;
}
特点:随着类的加载而执行,只执行一次。且优先于main方法执行。
{
构造代码块中的执行语句;
}
特点:随着对象的建立而执行,可执行多次,每建立一个该类的对象就会执行一次,且优先于构造函数执行。
class Student {
static {
System.out.println("Student 静态代码块");
}
{
System.out.println("Student 构造代码块");
}
public Student() {
System.out.println("Student 构造方法");
}
}
class StudentDemo {
static {
System.out.println("好好学习");
}
public static void main(String[] args) {
System.out.println("我是main方法");
Student s1 = new Student();
Student s2 = new Student();
}
}
运行结果:
分析:首先虚拟机会先找到main方法所在的类StudentDemo,并将其加载到方法区,所以会先执行StudentDemo的静态代码块,打印出“好好学习”,下来main方法进栈,打印出“我是main方法”,接下来准备创建Student类中的第一个引用s1,所以首先会加载Student类,紧接着会执行Student类的静态代码块,打印出“Student 静态代码块”,然后开始创建引用s1,这时会先执行构造代码块,所以打印出“Student 构造代码块”,然后执行构造方法,打印出“Student构造方法”。下来在建立引用s2的时候,会先执行构造代码块,然后执行构造方法。
2.9 面向对象练习题
import java.util.Scanner;
class Demo{
public int sum(int a,int b){
return a+b;
}
}
class Test{
public static void main(String[] args){
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入第一个数:");
int a = sc.nextInt();
System.out.println("请输入第二个数:");
int b = sc.nextInt();
//创建对象
Demo d = new Demo();
System.out.println("两数之和为:"+d.sum(a,b));
}
}
运行结果:
import java.util.Scanner;
class Rectangle{
private int length;//定义成员变量长
private int width;//定义成员变量宽
public void setLength(int length){
this.length = length;
}
public void setWidth(int width){
this.width = width;
}
//获取周长
public int getPerimeter(){
return 2*(length + width);
}
//获取面积
public int getArea(){
return length*width;
}
}
class Test2{
public static void main(String[] args){
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
System.out.println("请输出长方形的长:");
int length = sc.nextInt();
System.out.println("请输出长方形的宽:");
int width = sc.nextInt();
//创建对象
Rectangle r = new Rectangle();
//对长进行赋值
r.setLength(length);
//对宽进行赋值
r.setWidth(width);
System.out.println("长方形的周长:"+r.getPerimeter());
System.out.println("长方形的面积:"+r.getArea());
}
}