以下为《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.面向对象(封装,构造方法,this)》的无排版文字预览,完整格式请下载
下载前请仔细阅读上面文字预览以及下方图片预览。图片预览是什么样的,下载的文档就是什么样的。