1.面向对象(封装,构造方法,this)

本文由用户“yl990205006”分享发布 更新时间:2021-02-23 16:15:38 举报文档

以下为《1.面向对象(封装,构造方法,this)》的无排版文字预览,完整格式请下载

下载前请仔细阅读文字预览以及下方图片预览。图片预览是什么样的,下载的文档就是什么样的。

对象和封装

目标

使用类图描述设计

掌握面向对象设计基本步骤

掌握类和对象的概念

掌握构造方法及其重载

掌握this,static关键字

掌握封装的概念及其使用

对象

什么是对象

/

对象:是客观世界存在的实体

为什么使用对象

/

如何描述对象

/

类:是同一类事物公共属性和公共行为功能抽取。是一个 抽象的概念。

面向对象的核心思想:找适合 的对象做适合事情。

描述狗对象

定义类

发现类

发现类的属性

发现类的方法

package com.myit.c01.example1;

public class Dog {

String name="旺旺"; //昵称

int health=0; //健康指数

int love=90;//亲密度

String strain="拉多拉";//品种

//输出狗的信息

public void show(){

System.out.println(name+"\t"+health+"\t"+love+"\t"+strain);

}

}

类图

/

定义对象

1. 通过类创建对象。

格式: 类名 变量 = new 类名();

2. 访问对象的属性或调用对象的方法。

对象.属性名

对象.方法名();

package com.myit.c01.example1;

public class TestDog {

/**

* 创建狗对象

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

Dog dog =new Dog();

dog.show();

}

}

练习:创建企鹅类(Penguin)与对象

/

/

匿名对象

匿名对象:没有名字的对象。(没有引用变量指向的对象)

public class TestDog2 {

/**

* 匿名对象的使用

*/

public static void main(String[] args) {

//匿名对象调用方法

new Dog().show();

//两个对象比较

System.out.println(new Dog()==new Dog());

//匿名对象作为方法的参数

showInfo(new Dog());

}

public static void showInfo(Dog dog){

System.out.println(dog.name+"\t"+dog.strain);

}

}

匿名对象要注意的细节:

1.一般不给匿名对象赋属性值,因为永远无法获取到匿名对象的属性值。

2. 两个匿名对象永远都不可能是同一个对象。

匿名对象的用途:

1. 如果调用某一个对象的 方法一次的时候,那么这时候可以使用匿名对象调用,简化书写。

2. 作为实参传递调用一个方法。简化书写

局部变量与成员变量

定义的位置上:

1.成员变量: 定义在方法之外,类之内的变量称作为成员变量。

2. 局部变量: 局部变量就是定义在方法之内的变量。

package com.myit.c01.example1;

public class TestDog3 {

static int count;

public static void main(String[] args) {

// TODO Auto-generated method stub

int count2=0;

System.out.println(count);

System.out.println(count2);

}

}

区别:

作用上的区别:

1. 成员变量的作用是描述一类事物的公共属性。

2. 局部变量的作用是提供一个变量给方法内部使用。

生命周期的区别:

1. 成员变量是随着对象的创建而存在,随着对象的消失而消失。

2. 局部变量随着方法的调用执行到创建局部变量的语句的时候存在,局部变量一旦出了自己的作用域马上 从内存中消失。

初始值的区别:

1. 成员变量都有默认的初始值。

double 0.0

float 0.0f

boolean false;

char ' '

String null;

2. 局部变量没有默认的初始值,局部变量要先初始化才能使用。

构造方法

构造方法定义

企鹅出生的时候,一旦出生就已经起好名字的。那么我们在java里面怎么在对象一旦创建就赋值呢?

package com.myit.c01.example2;

public class Penguin {

String name;

int health;

int love;

String sex;

//无参的构造方法

public Penguin(){

name="美美";

health=90;

love=95;

sex="Q妹";

}

//有参的构造方法

public Penguin(String name,int health,int love,String sex){

this.name=name;

this.health=health;

this.love=love;

this.sex=sex;

}

public void show(){

System.out.println(name+"\t"+health+"\t"+love+"\t"+sex);

}

}

构造方法的重载

无参构造方法

有参构造方法

构造方法的使用

构造方法作用:对对象进行初始化.

package com.myit.c01.example2;

public class TestPenguin {

/**

* 构造方法的使用

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

Penguin penguin1=new Penguin();

penguin1.show();

Penguin penguin2=new Penguin("花花", 80, 95, "Q妹");

penguin2.show();

}

}

构造方法与普通的方法的区别

一般方法是用于定义对象应该具备的功能。而构造方法定义的是,对象在调用功能之前,在建立时,应该具备的一些内容。也就是对象的初始化内容。

构造方法是在对象建立时由jvm调用, 给对象初始化。一般方法是对象建立后,当对象调用该功能时才会执行。

普通方法可以使用对象多次调用,构造方法就在创建对象时调用。

构造方法的方法名要与类名一样,而普通的方法只要符合标识符的命名规则即可。

构造方法没有返回值类型。

构造方法注意的细节

1. 当类中没有定义构造方法时,系统会指定给该类加上一个空参数的构造方法。这个是类中默认的构造方法。当类中如果自定义了构造方法,这时默认的构造方法就没有了。

2.在一个类中可以定义多个构造方法,以进行不同的初始化。多个构造方法存在于类中,是以重载的形式体现的。因为构造方法的名称都相同。

构造代码块

构造代码块作用:给所有的对象进行统一的初始化。

问题

要求每个小孩出生都会哭,这份代码有两个构造方法,如果需要每个小孩出生都要哭的话,那么就需要在不同的构造方法中都调用cry()方法,但是这样子的话造成了代码重复问题,那么怎么解决呢?构造代码块。

package com.myit.c01.example3;

public class Person{

String name;

int age;

public Person(){

cry();

}

public Person(String name){

this.name=name;

cry();

}

public void cry(){

System.out.println("哇哇哇....");

}

}

解决

package com.myit.c01.example3;

public class Person{

String name;

int age;

{

cry();

}

public Person(){

//cry();

}

public Person(String name){

this.name=name;

//cry();

}

public void cry(){

System.out.println("哇哇哇....");

}

}

作用

1:给对象进行初始化。对象一建立就运行并且优先于构造方法。

2:与构造方法区别

1:构造代码块和构造方法的区别,构造代码块是给所有对象进行统一初始化, 构造方法给对应的对象初始化。

2:构造代码块的作用:它的作用就是将所有构造方法中公共的信息进行抽取。

例如孩子一出生统一哭

练习

使用java类描述一个员工,员工具备 id、 name、salary 三个属性, 还具备上班的功能。

要求: 一旦创建一个 员工对象时,员工对象就 具备了对应的属性值。

class Emp{

int id; //身份证

String name; //名字

int salary; //薪水

//构造函数初始化对象

public Emp(int i, String n,int s){

id = i;

name = n;

salary =s;

}

public void work(){

System.out.println("好好上班,天天向上");

}

}

class TestEmp

{

public static void main(String[] args)

{

Emp e = new Emp(110,"陈某某",10000); //创建了一个员工对象。

System.out.println(" 身份证:"+ e.id +" 名字:"+ e.name+" 薪水:"+e.salary);

}

}

static

问题

如何才能把一个成员变量存储到方法区作为 共享数据呢? 注意:共享数据在内存中只会维护一份。

解决办法

成员变量使用static关键字修饰即可。

package com.myit.c01.example3;

class Student{

String name ; //名字

static String country = "中国"; //国籍 共享数据 在内存中只有一份。

//构造代码块 创建对象的时候执行的。

{

System.out.println("代码块执行了.....");

}

//静态代码块,优先于代码块的执行

static{

System.out.println("静态代码快执行了..");

}

public Student( String name){

this.name = name;

}

public void study(){

System.out.println("好好学习,为成为高帅富做准备..");

}

public static void eat(){

System.out.println("在吃饭");

}

}

public class TestStudent

{

public static void main(String[] args)

{

Student s1 = new Student("狗娃");

s1.country ="小日本";

System.out.println(" 姓名:"+s1.name+" 国籍:"+s1.country);

Student.eat();

s1.eat();

Student s2 = new Student("狗娃");

System.out.println(" 姓名:"+s2.name+" 国籍:"+s2.country);

}

}

修饰变量和方法使用方式

static修饰符成员变量: static修饰符成员变量的时候,那么该数据就是共享数据,在内存中只有 一份。

访问方式:

1. 对象.属性名;

2. 类名.属性名。

推荐使用类名访问。

注意:千万不要了方便调用而使用static修饰,只有数据需要共享的时候才可以使用static修饰。

static修饰方法:

静态方法访问方式:

1. 对象.方法名;

2. 类名.方法名

注意:非静态方法不能使用类名直接调用。

静态方法要注意的细节

1. 静态方法中不能直接访问非静态的成员。

原因:因为静态方法可以使用类名直接调用,这时候非静态的数据可能还没有存在内存中。

2. 非静态的方法 可以直接访问静态与非静态的成员。

原因:因为非静态方法需要使用对象调用,当对象 存在的时候,静态与非静态数据都已经存在于内存中。

3. 静态方法不能出现this与super关键字。

问题:为什么静态方法不能出现this与super关键字?

原因:静态方法可以使用类名直接调用,而this关键字是代表了方法的调用者对象,这时候没有对象存在。

应用场景:什么时候使用static修饰方法呢?

如果一个方法没有直接访问非静态的成员,那么这时候就可以使用static修饰符方法了。 一般应用于工具类的方法。

静态成员属性与非静态成员属性的区别

1. 作用上区别:

1.静态的成员属性是属于共享数据,非静态成员属性是用于描述一类事物 的属性。

2. 存储的位置区别:

静态成员属性的数据是唯一方法区中,在内存中只有一份。非静态成员属性时位于堆内存中,每一个 对象都维护一份。

3. 访问上的区别:

静态成员属性可以使用类名或者对象直接访问,非静态的成员属性只能使用对象直接访问。

4. 生命周期的区别:

静态的成员属性是随着类的加载而存在,随着类文件的消失而消失。非静态成员 属性是随着对象 的创建而存在,随着对象 的消失而消失。

静态成员属性的优缺点

优点:访问方式简单.节省内存。

缺点:生命周期过长。

原理:我们就必须要知道静态数据与非静态数据 的加载顺序是怎样?

静态代码块是在加载字节码(class文件)的时候就会执行,是优先于对象加载的。

封装

我们日常使用的电脑主机,把cpu、内存、主板等等都封装到机箱里面去。假如没有机箱的话的出现什么问题,主机、主板全部都散落在一处,然后开机没有开机按钮,那么需要我们2直接操作接跳线才能把电脑开启。这样子的话假如操作不慎的话,会让机器损坏危险,那么假如用机箱封装起来的话,那么就不需要这样子做了。体现了封装的---安全特性。

你拿电脑去加内存,可以直接给电脑给维修的人,等他加好内存了之后。你拿到的还是那个机箱,里面发生了怎样子的变化你并不知道。封装的第二个好处-将变化隔离。

在机箱里面提供一个开机按钮,而不需要你直接使用跳线开机的话,体现了封装的—便于使用的特性。

只要机箱提供了一个开机的功能,然后无论这个机箱拿到哪里去,都可以使用这个开机的功能.体现了封装的---提供重复性的特性。

为什么使用封装

/

什么是封装

/

如何实现封装

封装的步骤

/

实现(重新创建Dog类)

添加狗类Dog

package com.myit.c01.example4;

public class Dog {

private String name;

private int health;

private int love;

private String strain;

public Dog() {

super();

// TODO Auto-generated constructor stub

}

public Dog(String name, int health, int love, String strain) {

super();

this.name = name;

this.health = health;

this.love = love;

this.strain = strain;

}

/**

* @return the name

*/

public String getName() {

return name;

}

/**

* @param name the name to set

*/

public void setName(String name) {

this.name = name;

}

/**

* @return the health

*/

public int getHealth() {

return health;

}

/**

* @param health the health to set

*/

public void setHealth(int health) {

if(health>1000||health请点击下方选择您需要的文档下载。

  1. 19-20上 新高考 高二江苏(N) 第22期
  2. very, said词汇填空
  3. U3T1SA教案
  4. 人教英语八下Unit6 Section A 3a-3c教案设计
  5. 人教版初中英语七年级上册 Unit9 Section A 1a-2d 教学设计
  6. 人教版高一英语Book1 U1warming up 课件(共19张PPT)
  7. 42号传祺(英文剧本)
  8. Java面向对象总结
  9. java总结报告
  10. XX景点英语导游词
  11. Geology101Report
  12. 英语基本句子成分
  13. 美赛指南中英文对照
  14. c++基础和进阶课堂讲义
  15. **_*2019-2020学年高二上学期期末英语试题
  16. A Study on Supporting the Deployment and Evaluatio
  17. Ciattoni2003_JOSAA20_163
  18. 1-s2.0-S***00066-main (2)
  19. 四六级写作精华:万能背景句
  20. WHO新冠疫苗技术线路(英文)

以上为《1.面向对象(封装,构造方法,this)》的无排版文字预览,完整格式请下载

下载前请仔细阅读上面文字预览以及下方图片预览。图片预览是什么样的,下载的文档就是什么样的。

图片预览