java面向对象

# 面向对象

面向过程:更注重操作的步骤  (微观)

面向对象:更注重的参与者(宏观)

**类和对象的关系:**

>类是抽象的,对象是具体的

类是对象类型,对象是类的实例

编写类:类名,属性,方法

使用类:创建对象,给属性赋值,调用方法

**成员变量与局部变量的区别**

| 区别 |成员变量  | 局部变量

|--|--|---|

| 位置不同 | 类中,方法外 |方法里,方法的形参,代码块里

| 作用范围不同 |整个类,整个类中的所有方法均可以使用|只限于当前方法,或者当前语句块

| 内存的存放位置不同 | 存储在堆内存|存储在栈内存

| 有无默认值 |有默认值 |没有默认值

**构造方法(构造器)**

>1.方法名必须与类名相同

>2.不能写返回值,也比能写void,更不能使用return

>3. 构造方法可以重载

**构造方法与成员方法的区别**

| 区别 |构造方法  |成员方法

|--|--|---|

| 作用不同 |用于创建对象,并给属性初始化 |描述对象所具有的行为

|调用/使用方式不同 |使用new关键字调用|使用对象名调用

| 执行顺序不同 | 先执行构造方法创建对象|然后使用对象名去调用成员方法

| 是否开空间 |每执行一次都将在堆中开一个空间 |可以被同一个对象调用N多次,调用一次加载到栈内存一次,执行完出栈

**this关键字**

this代表的是当前对象的引用(地址)

>作用:

>(1)使用本类的属性  this.属性,, this可以省略不写

(2)使用本类的中方法 this.方法(),this可以省略不写

(3)调用本类的其它构造方法 this() ,this(....) ,要求必须是构造方法中第一句代码

(4)用于区分成员变量和局部变量this..代表成员变量

**static关键字**

>(1) static可以修饰成员变量  ,称为静态变量 ,在方法区   

>标准 使用方式:  类名.静态变量名

(2)static可以修饰成员方法,称为静态方法

      标准使用方式: 类名.方法名();

(3)static 修饰代码块:称为静态代码块, 为类的静态变量进行赋初始值

构造方法,构造代码块,静态代码块执行顺序:

静态代码块>构造代码块>构造方法

(4)修饰内部类  称为静态内部类

**注意事项:

static方法不允许使用成员变量**

**final关键字**

>(1) final修饰的变量称为常量

final修饰成员变量,通常与static一起使用,称为**静态常量**

final修饰的局部变量称为**常量**

  final修饰的基本数据类型,其**值**不允许更改

final修饰的引用数据类型, 其**地址**不允许更改

(2)修饰方法  :不允许子类重写,但是可以被子类调用

(3)修饰类:不允许有子类的,所以称为太监类

**abstract关键字**

>(1)修饰类称为抽象类(特征:就是不能创建对象)

(2)修饰方法 :使用abstract修饰的方法称为抽象方法

抽象方法的特点:

1没有方法体,只能以分号结尾

2.必须定义在抽象类里

3.必须被子类实现,如果子类不实现,那么子类也得是抽象类

注:抽象类里可以包含0个或多个抽象方法,抽象方法必须定义在抽象类中

**interface关键字**

>类与接口的关系 implements(实现)

一个类即存在继承关系又存在实现关系,继承在前(extends),实现在后 (implements)

接口中的变量均为公共的静态常量

java中的类是单继承的,java中的接口是多继承的

**super关键字**

>(1)调用父类的非私有属性

>(2)调用父类的构造方法,要求必须是构造方法中第一句代码

>(3)调用父类的非私有成员方法

>(4)用于父类与子类的同名属性的区分,super指代的是父类,this指代的是子类

**面向对象的三大特征**

>(1)封装:提高程序的安全性

(2)继承:提高代码的复(重复使)用性

(3)多态:提高程序的扩展性

**封装:访问权限**

>public :最大的访问权限

protected :子类方访问权限

package  :包内访问权限

private  :本类访问权限

**方法重载**

>(1)在一个类里面为一种行为提供多种实现方式并提高可读性

>(2)方法名相同,参数不同(类型不同,个数不同,顺序不同)

**方法重写**

>(1)父类方法无法满足子类的要求,子类通过方法重写满足要求

(2)发生在子类

(3)方法名,参数类型,个数,顺序必须与父类完全相同

(4)子类返回值小于等于父类的返回值

(5)子类访问权限大于等于父类的访问权限

**多态的前提**

>(1)继承是多态的前提

>(2)子类重写父类的方法

>(3)父类引用  new子类对象

**如何使用封装去保证属性的安全性**

>(1)属性私有化 private

(2)提供公有的取值,赋值方法

(3)在赋值的方法中进行值的合理性验证

**封装代码:**

```

/**

* @author lh

* @since JDK 1.8

* ClassName: Person

* date: 2019/8/17 16:37

* Description:

* 定义Person类

* 属性私有化

* 提供共有的取值赋值方法

* 在赋值的方法内进行合理性验证

*/

public class Person {

    //属性私有化

    private String name;

    private int age;

    private String gender;

    //提供共有的取值赋值方法

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public int getAge() {

        return age;

    }

    public void setAge(int age) {

        //在赋值的方法中对值进行合理性验证

        if(age<=18||age>=25){

            System.out.println("对不起,年龄要在18到25之间");

            this.age=18;//给属性设置默认值

        }else{

            this.age=age;//将局部变量的值赋给成员变量

        }

    }

    public String getGender() {

        return gender;

    }

    public void setGender(String gender) {

        //在赋值的方法中对值进行合理性验证

        if(!"男".equals(gender)&&!"女".equals(gender)){

            System.out.println("对不起,性别有误");

            this.gender="男";//给属性设置默认值

        }else{

            this.gender=gender;

        }

    }

    //无参构造

    public Person() {

    }


    //带参构造

    public Person(String name, int age, String gender) {

        this.name = name;

        this.age = age;

        this.gender = gender;

    }

    //成员方法

    public void show(){

        System.out.println(name+"\t"+age+"\t"+gender);

    }

}

```

```

/**

* @author lh

* @since JDK 1.8

* ClassName: TestPerson

* date: 2019/8/17 16:57

* Description:

* 定义测试类

*/

public class TestPerson {

    public static void main(String[] args) {

        Person p=new Person();//创建对象(无参)

        p.setAge(5);

        System.out.println(p.getAge());//对不起,年龄要在18到25之间  设置为18

        Person pp=new Person("王小五",22,"人妖");//创建带参构造

        pp.show();//提示错误信息 :对不起,性别有误      王小五 22 男(改为默认值)

    }

}

```

**继承代码(一父二字一测试)**

```

/**

* @author lh

* @since JDK 1.8

* ClassName: Animal

* date: 2019/8/17 19:05

* Description:

* 定义一个Animal类

* 定义两个私有属性 color age

* 三个方法 eat sleep  introduce

*/

public class Animal {

    private String color;

    private int age;

    public String getColor() {

        return color;

    }

    public void setColor(String color) {

        this.color = color;

    }

    public int getAge() {

        return age;

    }

    public void setAge(int age) {

        this.age = age;

    }

    public void eat(){

        System.out.println("我饿了,我想吃东西!!!");

    }

    public void sleep(){

        System.out.println("我困了,我想睡觉!!!!");

    }

    public void introduce(){

        System.out.println("Animal:"+color+"  "+age);

    }

}

```

```

/**

* @author lh

* @since JDK 1.8

* ClassName: Dog

* date: 2019/8/17 19:09

* Description:

* 定义一个dog类

* dog直接继承animal类 ,间接继承object类

* 一个私有属性  name

* 定义一个自己方法

* 覆盖父类的方法

* 重写父类的introduce方法

*/

public class Dog extends Animal {//extend继承  dog类继承animal类

    private String name;

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public void show(){

        System.out.println("小狗汪汪汪!!!");

    }

    @Override

    public void introduce() {//重写父类的introduce

        System.out.println("我是二哈,我会拆家!!!");

    }

}

```

```

/**

* @author lh

* @since JDK 1.8

* ClassName: Cat

* date: 2019/8/17 19:14

* Description:

* 定义cat类

* 一个私有属性  name

* 一个方法  show

*/

public class Cat extends Animal {

    private String name;

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public void show(){

        System.out.println("我会捉老鼠!!!");

    }

}

```

```

/**

* @author lh

* @since JDK 1.8

* ClassName: Test

* date: 2019/8/17 19:17

* Description:

* 编写测试类

* 创建两个对象 dog和cat

*/

public class Test {

    public static void main(String[] args) {

        //dog

        Dog dog=new Dog();//创建对象

        dog.setName("二哈");

        dog.setAge(2);

        dog.setColor("黑白相间");

        dog.eat();//从父类继承

        dog.introduce();//方法重写调用自己的

        dog.sleep();//从父类继承

        dog.show();//子类自己的

        //cat

        Cat cat=new Cat();

        cat.setColor("橘色");

        cat.setAge(3);

        cat.eat();

        cat.introduce();

        cat.sleep();

        cat.show();

    }

}

```

**多态代码(一父二字一测试)**

```

/**

* @author lh

* @since JDK 1.8

* ClassName: Car

* date: 2019/8/17 20:20

* Description:

* 定义汽车类

* 定义两个方法 run show

* run子类继承

* show子类重写

*/

public class Car {

    //子类继承

    public void run(){

        System.out.println("我在公路上驰骋,不允许飙车!!!");

    }

    //子类重写

    public void show(){

        System.out.println("我是辆好车!!!");

    }

}

```

```

/**

* @author lh

* @since JDK 1.8

* ClassName: Bwm

* date: 2019/8/17 20:25

* Description:

* 定义bwm类

* 重写父类手方法

* 自己定义speed方法(独有)

*/

public class Bwm extends Car {

    //重写父类方法

    @Override

    public void show() {

        System.out.println("我是宝马!!!");

    }

    //子类特有

    public void speed(){

        System.out.println("我可以达到200迈");

    }

}

```

```

/**

* @author lh

* @since JDK 1.8

* ClassName: Fll

* date: 2019/8/17 20:31

* Description:

* 定义Fll类

* 重写父类show方法

* 自己定义login方法

*/

public class Fll extends Car {

    @Override

    public void show() {

        System.out.println("我是法拉利!!!");

    }

    public void login(){

        System.out.println("我的车标是一匹奔腾的马!!!");

    }

}

```

```

/**

* @author lh

* @since JDK 1.8

* ClassName: TestCar

* date: 2019/8/17 20:35

* Description:

* 定义测试类TestCar

* 1.没有使用多态 只能调用父类的方法

* 2.使用多态 父类引用 new子类对象

* 向上类型转换(自动类型转换)

* 只能调用父类中存在的方法,或者是重写的方法

* 在子类中定义的方法将不能使用

* 向下类型转换(强制类型转换) 可以调用子类独有的方法

*/

public class TestCar {

    public static void main(String[] args) {

        //没有使用多态 只能调用父类的方法

        Car c=new Car();

        c.run();

        c.show();

        //使用多态 父类引用 new子类对象

        //向上类型转换(自动类型转换)

        //只能调用父类中存在的方法,或者是重写的方法

        //在子类中定义的方法将不能使用

        Car car=new Bwm();

        car.show();

        //向下类型转换(强制类型转换)

        Bwm b=(Bwm)car;

        b.speed();//调用子类独有的方法

        Car car1=new Fll();//使用多态

        car1.show();

        Fll f=(Fll) car1;

        f.login();//调用子类独有的方法

    }

}

```

**接口的使用**

```

/**

* @author lh

* @since JDK 1.8

* ClassName: Human

* date: 2019/8/17 14:14

* Description:

* 定义一个人类的统称

* 定义接口

* 定义三个方法 laugh cry talk

*/

public interface Human {//首先定义什么是人类

    //人是快乐的,会笑

    public void laugh();

    //人类还会哭。代表痛苦

    public void cry();

    //人类还会说话

    public void talk();

}

```

```

/**

* @author lh

* @since JDK 1.8

* ClassName: YellowHuman

* date: 2019/8/17 14:32

* Description:

* 定义具体的人类

* 黄种人

* 重写human接口的三个方法

*/

public class YellowHuman implements Human {

    @Override

    public void laugh() {

        System.out.println("黄种人会笑,开心呀!幸福呀!");

    }

    @Override

    public void cry() {

        System.out.println("黄种人会哭,有心事!");

    }

    @Override

    public void talk() {

        System.out.println("黄种人会说话,一般都是双字节!");

    }

}

```

```

/**

* @author lh

* @since JDK 1.8

* ClassName: WhiteHuman

* date: 2019/8/17 14:37

* Description:

* 定义白种人

* 重写human接口的三个方法

*/

public class WhiteHuman implements Human {

    @Override

    public void laugh() {

        System.out.println("白种人会大笑,侵略的笑声!");

    }

    @Override

    public void cry() {

        System.out.println("白种人也会哭!");

    }

    @Override

    public void talk() {

        System.out.println("白种人会说话,一般都是单字节!");

    }

}

```

```

/**

* @author lh

* @since JDK 1.8

* ClassName: BlockHuman

* date: 2019/8/17 14:42

* Description:

* 定义黑人  类

* 重写human接口的三个方法

*/

public class BlockHuman implements Human{

    @Override

    public void laugh() {

        System.out.println("黑人会笑。");

    }

    @Override

    public void cry() {


        System.out.println("黑人也会哭!");

    }

    @Override

    public void talk() {

        System.out.println("黑人会说话,一般人听不懂!");

    }

}

```

```

/**

* @author lh

* @since JDK 1.8

* ClassName: Test

* date: 2019/8/17 21:06

* Description:

* 定义测试类

* 创建三个实例

* 分别调用自己的方法

*/

public class Test {

    public static void main(String[] args) {

        Human h=new BlockHuman();

        h.cry();

        h.laugh();

        h.talk();

        Human h1=new YellowHuman();

        h1.cry();

        h1.laugh();

        h1.talk();

        Human h2=new WhiteHuman();

        h2.cry();

        h2.laugh();

        h2.talk();

    }

}

```

**注:一定要理解,理解,理解,多做练习!!!**

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容