首页 > 编程语言 >【JAVA笔记】JAVA-入门基础-面向对象04

【JAVA笔记】JAVA-入门基础-面向对象04

时间:2022-12-07 17:55:11浏览次数:38  
标签:JAVA name 04 子类 void 面向对象 父类 public String

一、OOP详解

  • 面向对象编程(Object-Oriented Programming,OOP)
  • 面向对象编程的本质就是:以类的方式组织代码,以对象的组织(封装)数据。
  • 抽象
  • 三大特性:封装、继承、多态、

1、 class类

我们面向对象,就是把一个一个抽象的事务具象化一个类,然后把属性和行为定义出来。

定义类

public class Cat {
    String name;
    int age;
    
    void eat(){
        System.out.println("小猫吃鱼!");
    }
}

 这就是一个类,小猫的名字和年龄是它本身的属性,吃是小猫的行为 

2、类与对象的关系

类是一种抽象的数据类型,而对象是对这种抽象的类的实例化。

    public static void main(String[] args) {
        Cat cat = new Cat();
        cat.eat();

    }

二.类详解-封装

1、 this关键字

this翻译出来就是这个,每一个类都有一个this,他是一个引用。通常情况下可以省略。
在实例方法中,或者构造方法中,为了区分局部变量和实例变量,不能省略。

 private String name;
 public void setName(String name) {
        this.name = name;
    }

这个时候区分这个this.name代表类种属性的name而不是局部变量。

2 、构造方法

每个类都有一个默认的构造方法,和类名一样的无参构造。
但是如果我们写了一个构造器,系统就不会自动生成无参构造器了

public class Cat {
    private String name;
    int age;
    public Cat() {
      
    }

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    void eat(){
        System.out.println("小猫吃鱼!");
    }


} 

alt+insert可以选择constrouctor快速的生成构造方法。构造方法可以重载。

3、封装

一个类的属性不应该完全暴露,不然就会被随意更改,我们需要定义一个方法,通过方法来操作我们的属性,这就是封装的基本理念

1)private强调是自己来使用

2)默认是给同包下的来使用

3)protected 强调的是给子类使用

4)public 强调的是给大家使用

封装的意义:

private 是私有的意思,我们把属性通过private修饰,然后通过方法去取值和赋值,这样对于一些违规的操作我们就可以在方法里进行过滤,比如年龄如果传过来超过一百五十岁这种。

public class Cat {
    private String name;
    private int age;
    public Cat() {

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    void eat(){
        System.out.println("小猫吃鱼!");
    }


}

  alt+inser也可以快速生成

三.类详解-继承

类与类直接可以继承,比如我们定义一个人类,然后男人类和女人类就可以继承人类。完全继承他的属性和方法。还有自己的特定的属性

public class Person {
    private String name;
    private int age;

    public void eat() {
        System.out.println("吃");
    }
}
public class Man extends Person {
    private String huzi;
    
    public void niao(){
        System.out.println("站着尿尿");
    }
}

我们就定义是一个人类,基本上每个人都是有年龄名字和吃的行为,但是男人除了人类的特性,还有胡子和站着尿尿的行为,这样我们为了不重复声明属性和行为,直接继承即可。  

一个类只能单继承,只能继承一个父类,但是一个父类可以有多个子类。
Object类是所有类的父类。

1、Super关键字

之前介绍了this关键字,是类的引用,Super关键字就是代表父类的引用。

  public void niao(){
        super.eat();
        System.out.println("站着尿尿");
    }

我们子类在尿尿的时候,可以调用父类吃的方法,吃完在尿 

不管是显式还是隐式的父类的构造器,super语句一定要出现在子类构造器中第一行代码。所以this和
super不可能同时使用它们调用构造器的功能,因为它们都要出现在第一行代码位置。

2、方法重写

方法重写是发生在子类中,参数和方法名返回值类型都得相同。

重写 实例:

package com.cnblogs;
//本类用于实现
public class Application {
    public static void main(String[] args) {
        //实例化父类
        Person person = new Person();

        //实例化子类
        Student stu = new Student();

        person.getName();//父类属性
        stu.getName();
        //子类属性
        //父类属性
    }
}

 

package com.cnblogs;
/*
person类
 */
public class Person {
    //父类属性
    private String name = "父类属性";
    //父类方法
    public void getName(){
        System.out.println(name);
    }
}

 

package com.cnblogs;
/*
student类
 */
public class Student extends Person{
    //子类属性
    private String name = "子类属性";
    //子类重写父类方法
    @Override
    public void getName() {
        System.out.println(name);
        //super关键字
        super.getName();
    }
}

四.类详解-多态

定义:父类引用指向子类对象,就是多态

多态的存在要有3个必要条件:要有继承,要有方法重写,父类引用指向子类对象  

1、多态实例:

Animal 父类:
package cn.itcast.demo7;

//定义父类
public class Animal {
    private String name;

    //    空参构造
    public Animal() {

    }

    //    带参构造
    public Animal(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    //    成员方法
    public void eat() {
        System.out.println("吃饭");
    }
}
Dog 子类:
package cn.itcast.demo7;

//是Animal的子类
public class Dog extends Animal {
    //对父类eat重写
    @Override
    public void eat() {
        System.out.println(getName() + "吃骨头");
    }
}
Mouse 子类:
package cn.itcast.demo7;

//子类-老鼠类
public class Mouse extends Animal {
    @Override
    //对父类eat重写
    public void eat() {
        System.out.println(getName() + "吃奶酪");

    }

}

Test测试类(写法1):

package cn.itcast.demo7;

public class Test {
    public static void main(String[] args) {

        Animal animal1 = new Dog();
        animal1.setName("哈士奇");
        animal1.eat();

        Animal animal2 = new Mouse();
        animal2.setName("Jerry");
        animal2.eat();

    }
}

测试结果:

哈士奇吃骨头
Jerry吃奶酪

Test测试类(写法1):

package cn.itcast.demo7;

public class Test {
    public static void main(String[] args) {
//        用来测试Dog类和Mouse类
//        测试Dog类
        Dog d = new Dog();
        d.setName("哈士奇");
        showAnimal(d);

//        用来测试老鼠类
        Mouse m = new Mouse();
        m.setName("Jerry");
        showAnimal(m);

    }

    // 多态的使用场景:父类型可以作为形参的数据类型
    public static void showAnimal(Animal an) {
        an.eat();

    }

}

两种写法返回结果相同 

备注:

1)多态关系中,成员变量不涉及重写
简单记忆:编译看左,运行看左

2)多态关系中,成员方法
简单记忆:编译看左,运行看右

2、多态调用子类独有方法实例:

Animal 父类:

package cn.itcast.demo8;

public class Animal {
    public void eat() {
        System.out.println("吃饭");
    }
}

Dog子类:

package cn.itcast.demo8;

public class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("狗吃骨头");
    }

    public void watch() {
        System.out.println("狗会看家");
    }

}

Test 测试类:

package cn.itcast.demo8;

public class Test {
    public static void main(String[] args) {
//        通过多态创建对象调用子类的方法
        Animal an = new Dog();
//        调用eat()方法
        an.eat();

//        调用watch()方法,属于子类独有的方法
//        an.watch();   不能直接使用

//1、向下转型(调用子类独有的方法)
  /*      Dog dog = (Dog) an;
        dog.watch();*/
//      优化、判断对象是否是Dog对象,如果是再调用watch()方法
        if (an instanceof Dog) {
//能走到这里说明条件满足
            Dog dog = (Dog) an;
            dog.watch();
        }
    }
}

测试结果: 

狗吃骨头
狗会看家

  

 

  

  

  

  

  

  

 

  

  

  

 

  

 

标签:JAVA,name,04,子类,void,面向对象,父类,public,String
From: https://www.cnblogs.com/xfbk/p/16951023.html

相关文章

  • 如果输入javac报错怎么处理?
    把环境变量改成绝对路径就OK1.JAVA_HOME使用包的原始路径  原始路径:  2.CLASSPATH使用jdk和jre的lib绝对路径   原始路径:   (如果是是创建,用英文......
  • 怎么配置Java的环境变量?<No SDK>怎么处理?
     这是我打开idea的界面,表示我没配置jdk。  1.先下载JDK   JDK官方下载链接 2.配置JDK环境变量路线1:window设置》系统》关于》高级系统设置路线2:右击我的电......
  • Java中二叉树的遍历、查找
    1、准备节点/***二叉树的节点*@authorlurenjia*@date2022/12/7-12:07*/publicclassNode{Objectvalue;NodeleftChild;NoderightChild......
  • Day1 JAVASE
    构造器:1.和类名相同2.没有返回值作用:1.new本质在调用构造方法2.初始化对象的值注意点:1.在创建类的时候就会有一个构造器去初始化对象的值,因此new才能创建一个实例......
  • 瀑布流布局 不到30行代码实现(JavaScript + absolute)支持懒加载
    @目录前言一、使用css实现瀑布流布局1.flex布局2.column-count多栏布局3.grid网格布局二、结合JavaScript的瀑布流布局实现1.推荐原因2.实现步骤a.初步实现:结合JavaSc......
  • Java前后端请求Content-Type与接受方式
    1.GetGet方法没有请求体,所以加不加Content-Type没有意义。参数通过拼接到Url来加入url?key=value&key2=value2SpringMVC后台如何获取参数:Java后台通过Request的get......
  • Javascript-极速入门指南-3-jQuery使用教程
    内容概要jQuery类库类库jQuery简介jQuery的宗旨:Writeless,domore写的更少做的更多jQuery的特点为: 1.加载速度快 2.选择器更多更好用 3.一行代码走天下......
  • java 随便的复习
    packagewxy1;publicclassw{ publicstaticvoidmain(Stringargs[]){ //这个是单行注释只可以注释一行; /*这个是多行注释可以注释很多航, *注意:byte也是整数型; ......
  • 力扣540(java&python)-有序数组中的单一元素(中等)
    题目:给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次。请你找出并返回只出现一次的那个数。你设计的解决方案必须满足O(logn)时间复......
  • 现代javascript教程 数组
    array字面量或者构造函数声明数组newArray(100),长度100的空获取数组长度,是一个属性,arr.length获得元素,通过索引值,arr[0]修改数组,arr[0]=0用alert方法打印数组,会......