Java知识点细节简易汇总——(6)面向对象编程(中级部分)

news2024/11/16 7:38:53

一、IDE快捷键

  1. 删除当前行, 默认是 ctrl + Y 自己配置 ctrl + d
  2. 复制当前行, 自己配置 ctrl + alt +向下光标
  3. 补全代码 alt + /
  4. 添加注释和取消注释 ctrl + / 【第一次是添加注释,第二次是取消注释】
  5. 导入该行需要的类 先配置 auto import , 然后使用 alt+enter 即可
  6. 快速格式化代码 ctrl + alt +L
  7. 快速运行程序 自己定义 alt + R
  8. 生成构造器等 alt + insert [提高开发效率]
  9. 查看一个类的层级关系 ctrl + H [学习继承后,非常有用]
  10. 将光标放在一个方法上,输入 ctrl + B ,可以定位到方法 [学继承后,非常有用]
  11. 自动的分配变量名 , 通过 在后面加 .var [老师最喜欢的]
  12. 还有很多其它的快捷键…

二、封装

构造器写在 public static void main(String[] args) { }之外

将构造器和 setXxx 结合

public static void main(String[] args) {
        Person person = new Person();
        person.setName("路飞");
        person.setAge(25);
        person.setSelerty(10000);
        System.out.println(person.toString());
        System.out.println("==================");
        Person person1 = new Person("索隆", -1, 1);
        System.out.println(person1.toString());
    }
}
class Person{
    public String name;
    private int age;
    private  int selerty;

    public Person() {
    }

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

    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<100 && age>0) {
            this.age = age;
        }else {
            System.out.println("错误");
        }
    }

    public int getSelerty() {
        return selerty;
    }

    public void setSelerty(int selerty) {
        if (selerty>500)this.selerty = selerty;
        else System.out.println("错误");
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", selerty=" + selerty +
                '}';
    }
}

以上代码会有弊端:索隆的年纪为-1,却能通过!所以将构造器和 setXxx 结合
改进行代码如下:

public static void main(String[] args) {
        Person person = new Person();
        person.setName("路飞");
        person.setAge(25);
        person.setSelerty(10000);
        System.out.println(person.toString());
        System.out.println("==================");
        Person person1 = new Person("索隆", -1, 1);
        System.out.println(person1.toString());
    }
}
class Person{
    public String name;
    private int age;
    private  int selerty;

    public Person() {
    }

    public Person(String name, int age, int selerty) {
        setSelerty(selerty);
        setAge(age);
        setName(name);
    }

    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<100 && age>0) {
            this.age = age;
        }else {
            System.out.println("错误");
        }
    }

    public int getSelerty() {
        return selerty;
    }

    public void setSelerty(int selerty) {
        if (selerty>500)this.selerty = selerty;
        else System.out.println("错误");
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", selerty=" + selerty +
                '}';
    }
}

三、继承

在这里插入图片描述

细节

在这里插入代码片在这里插入图片描述
ps:第四点的方法是:super(“参数和需要调用的父类构造器的参数类型相同“);
在这里插入图片描述

第二点:

//    父 类
public class Person {
    public Person() {
        System.out.println("父类的构造器...");
    }
}

//  子类
public class Student extends Person{
    public Student() {
        System.out.println("子类的构造器...");
    }
}

public class Text {
    public static void main(String[] args) {
        Student student = new Student();
    }
}

在这里插入图片描述
调用的是子类的构造器,但输出的时候父类的构造器也启动了…

原因:存在super(): 且默认调用父类的无参构造器…

public class Student extends Person{
    public Student() {
    	//super():    默认会存在,且默认调用父类的无参构造器...
        System.out.println("子类的构造器...");
    }
}

第三点后半句(如果父类默认没有提供无参构造器…)原因: 由第二点可知存在super(): 且默认调用父类的无参构造器.,但是由于父类没有提供无参构造器,所以解决方法就是手动写上super( ): 去指定说明调用的是父类的哪一个构造器。

四、super关键字

super 代表父类的引用,用于访问父类的属性、方法、构造器
在这里插入图片描述

五、重载VS重写

在这里插入图片描述

六、多态的魅力

多态的前提是类之间存在继承关系
传统的方法带来的问题是什么? 如何解决?
问题是: 代码的复用性不高,而且不利于代码维护
解决方案: 引出我们要讲解的多

在这里插入图片描述




准备工作:


// Animal  父  类
public class Animal {
	public void cry() {
		System.out.println("Animal cry() 动物在叫....");
	}
}

//  Animal的子  类
public class Cat extends Animal {
	public void cry() {
		System.out.println("Cat cry() 小猫喵喵叫...");
	}
}

//  Animal的子  类
public class Dog extends Animal {
	public void cry() {
		System.out.println("Dog cry() 小狗汪汪叫...");
	}
}

//  Food 父  类
public class Food {
	private String name;
	
	public Food(String name) {
		this.name = name;
   }
	public String getName() {
		return name;
   }
   public void setName(String name) {
 	  this.name = name;
  }
}

//  Bone的子类
public class Bone extends Food{
	public Bone(String name) {
		super(name);
	}
}

//  food的子类
public class Fish extends Food  {
	public Fish(String name) {
		super(name);
	}
}


//  主   人

public class Master {
		private String name;
	
		public Master(String name) {
			this.name = name;
		}
	
		public String getName() {
			return name;
		}
	
		public void setName(String name) {
			this.name = name;
		}
		
		//主人给小狗 喂食 骨头
		 public void feedDog(Dog dog, Bone bone) {
			System.out.println("主人 " + name + " 给 " + dog.getName() + " 吃 " +bone.getName());
		 }
		 
		// //主人给 小猫喂 黄花鱼
		 public void feedCat(Cat cat, Fish fish) {
		 System.out.println("主人 " + name + " 给 " + cat.getName() + " 吃 " + fish.getName());
		 }
}
  

测试:
public class poly {
	public static void main(String[] args) {
		
		
		Master master1 = new Master("李华");
		Dog dog = new Dog("小狗狗");
		Bone bone = new Bone("骨头");
		
		master1.feedDog(dog, bone);
		
		
		System.out.println("=================");
		
		Master master2 = new Master("李明");
		Cat cat = new Cat("小猫猫");
		Fish fish = new Fish("鱼");
		
		master2.feedCat(cat, fish);
		
	}
}

得出结论 :太过于繁琐。如果动物很多,食物很多feed 方法很多,不利于管理和维护。对Master进行多态改进

// Master
public class Master {
		private String name;
	
		public Master(String name) {
			this.name = name;
		}
	
		public String getName() {
			return name;
		}
	
		public void setName(String name) {
			this.name = name;
		}
	
	
	  //使用多态机制,可以统一的管理主人喂食的问题
	  //animal 编译类型是 Animal,可以指向(接收) Animal 子类的对象 
	  //food编译类型是 Food ,可以指向(接收) Food 子类的对象 
	  public void feed(Animal animal, Food food) {
	 	 System.out.println("主人 " + name + " 给 " + animal.getName() + " 吃 " +
	  food.getName()); 
	  }
}
	  

测试:

public class poly {
	public static void main(String[] args) {
		
		Master master = new Master("李华");
		
		Dog dog= new Dog("小狗狗~");
		Bone bone = new Bone("骨头~");
		master.feed(dog, bone);
		
		System.out.println();
		System.out.println("=======================");
		
		
		Cat cat= new Cat("小猫咪~");
		Fish fish = new Fish("鱼~");
		master.feed(cat, fish);
	}
}

使用多态机制,可以统一的管理主人喂食的问题
animal 编译类型是 Animal,可以指向(接收) Animal 子类的对象
food编译类型是 Food ,可以指向(接收) Food 子类的对象

七、向上、下转型

向上转型

在这里插入图片描述
向上转型调用方法的规则如下:
(1)可以调用父类中的所有成员(需遵守访问权限)。
(2)但是不能调用子类的特有的成员。
(3)因为在编译阶段,能调用哪些成员,是由编译类型来决定的。
(4)最终运行效果看子类(运行类型)的具体实现, 即调用方法时,按照从子类(运行类型)开始查找方法,没有,则再在父类中查找,然后调用,规则我前面我们讲的方法调用规则一致。

向下转型

在这里插入图片描述
向下转型的条件:例如下方代码Text方法中:animal原先已经指向了Dog,所以才可以进行向下转型{ Dog cat = (Dog) animal}。

//  父 类
public class Animal {
	public void eat() {
		System.out.println("动物吃食物...");
	}
	
	public void run() {
		System.out.println("动物跑...");
	}
	
	public void show() {
		System.out.println("动物show...");
	}
}

// 子  类
public class Dog extends Animal{
	
		public void eat() {
			System.out.println("狗吃骨头....");
		}
		
		public void dogcll() {
			System.out.println("小狗的特有方法...");
		}
		
}

public class Text {
	public static void main(String[] args) {
	
		//向上转型
		Animal animal = new Dog();
		animal.eat();    //狗吃骨头....
		animal.run();    //动物跑...");
		//animal.dogcll();  错误!!!
		
		//向下转型
		Dog dog =(Dog)animal;
		dog.dogcll();
    }
}

向上转型: 按照从子类(运行类型)开始查找方法,若有则调用;若没有,则再在父类中查找,然后调用。

八、== 和 equal

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/176090.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Day867.事务隔离 -MySQL实战

事务隔离 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于事务隔离的内容。 提到事务&#xff0c;肯定不陌生&#xff0c;和数据库打交道的时候&#xff0c;总是会用到事务。 最经典的例子就是转账&#xff0c;你要给朋友小王转 100 块钱&#xff0c;而此时你的银行…

[前端笔记——CSS] 10.层叠与继承、选择器

[前端笔记——CSS] 10.层叠与继承、选择器1.层叠与继承1.1 冲突规则1.2 继承1.3 层叠1.4 CSS位置的影响2.选择器2.1 选择器是什么&#xff1f;2.2 选择器列表2.3 选择器的种类类型、类和 ID 选择器标签属性选择器伪类与伪元素运算符选择器参考表1.层叠与继承 1.1 冲突规则 CS…

一起自学SLAM算法:8.1 Gmapping算法

连载文章&#xff0c;长期更新&#xff0c;欢迎关注&#xff1a; 下面将从原理分析、源码解读和安装与运行这3个方面展开讲解Gmapping 算法。 8.1.1 Gmapping原理分析 首先要知道&#xff0c;Gmapping是一种基于粒子滤波的算法。在7.7.2节中已经提到过用RBPF&#xff08;Rao-…

linux系统中使用QT实现APP开发的基本方法

大家好&#xff0c;今天主要和大家分享一下&#xff0c;如何使用QT进行APP的主界面开发的方法。 目录 第一&#xff1a;APP界面开发基本简介 第二&#xff1a;滑动界面实现 第三&#xff1a;APP界面开发实现 第四&#xff1a;APP主界面测试 第一&#xff1a;APP界面开发基本…

ARP渗透与攻防(一)之ARP原理

ARP原理 前言 ARP攻击就是通过伪造IP地址和MAC地址实现ARP欺骗&#xff0c;能够在网络中产生大量的ARP通信量使网络阻塞&#xff0c;攻击者只要持续不断的发出伪造的ARP响应包就能更改目标主机ARP缓存中的IP-MAC条目&#xff0c;造成网络中断或中间人攻击。ARP攻击主要是存在…

CSS3基础内容

目录 CSS基本样式 选择器分类 标签选择器 类选择器 利用类选择器画三个盒子 多类名 id选择器 id选择器和类选择器的区别 通配符选择器 CSS字体属性 字体粗细font-weight 字体样式 CSS文本属性 CSS的引入方式 行内样式表&#xff08;行内式&#xff09; 内部样式表…

2023年集卡活动简记

文章目录支付宝总评&#xff1a;【强烈推荐】年味浓&#xff0c;必中奖&#xff0c;单倍金额不算少。只关注开奖可以除夕当天玩儿。集卡分1.88元难度&#xff1a;【非常低】必中奖时间投入&#xff1a;【较少】无需打开其他App&#xff0c;比较轻松。操作体验&#xff1a;【好】…

深度理解卷积神经网络

神经网络包括卷积层&#xff0c;池化层&#xff0c;全连接层。一个最简单的神经元结构&#xff0c;假如有三个输入&#xff0c;都对应一个权重参数&#xff0c;然后通过权重加起来&#xff0c;经过一个激活函数&#xff0c;最后输出y。CNN中独特的结构就是卷积层&#xff0c;就…

拓展:阿里巴巴中文站架构演进分析【部分】

文章目录前言阿里巴巴中文站架构发展历程阿里巴巴第五代架构数据架构的复杂前言 由学习整理而来&#xff0c;并非有意抄袭。如果有冒犯行为&#xff0c;请及时联系作者进行处理&#xff01; 阿里巴巴中文站架构发展历程 时间关键技术1999第一代网站架构Perl&#xff0c;CGl&…

【实操案例八】元组、集合操作 实例代码及运行效果图!

任务一&#xff1a;我的咖啡馆你做主 方法一&#xff1a;使用列表 # 任务一&#xff1a;我的咖啡馆你做主 # 方法一&#xff1a;使用列表lst[蓝山,卡布奇诺,拿铁,皇家咖啡,女王咖啡,美丽与哀愁]for i in lst:print(lst.index(i)1,.,i,end\t) print()while True:chice int(in…

SpringCloud+Ribbon 报错:java.net.unknownhostexception:XXX

SpringCloudRibbon 报错&#xff1a;java.net.unknownhostexception:XXX 问题分析&#xff1a; 网上很多的说法是依赖冲突导致&#xff0c;原因是什么呢&#xff1a;如果你的org.springframework.cloud:spring-cloud-starter-netflix-eureka-client 依赖中包含了ribbon依赖&…

常用JVM配置参数简介

既然学习JVM&#xff0c;阅读GC日志是处理Java虚拟机内存问题的基础技能&#xff0c;它只是一些人为确定的规则&#xff0c;没有太多技术含量。 既然如此&#xff0c;那么在IDE的控制台打印GC日志是必不可少的了。现在就告诉你怎么打印。 &#xff08;1&#xff09;如果你用的是…

Elasticsearch7.8.0版本高级查询—— 分页查询文档

目录一、初始化文档数据二、分页查询文档2.1、概述2.2、示例一、初始化文档数据 在 Postman 中&#xff0c;向 ES 服务器发 POST 请求 &#xff1a;http://localhost:9200/user/_doc/1&#xff0c;请求体内容为&#xff1a; { "name":"zhangsan", "ag…

数据分析-深度学习 Pytorch Day8

一。什么是循环神经网络&#xff1a;循环神经网络&#xff08;Rerrent Neural Network, RNN&#xff09;&#xff0c;历史啊&#xff0c;谁发明的都不重要&#xff0c;说了你也记不住&#xff0c;你只要记住RNN是神经网络的一种&#xff0c;类似的还有深度神经网络DNN&#xff…

广州周立功CanTest卡使用教程一

网上有不少Can采集平台,包括Ardunio,Can卡,也有不少人用Freescale自己DIY一个平台,这些都是相当不错,并且都有成熟的代码,这里介绍在汽车诊断软件领域普遍都会选择的Can卡使用。 大家是不是对这个节面非常熟悉,CAN-bus 通用测试软件是一个专门用来对所有的 ZLGCAN 系列板…

【Python】基于经典网络架构训练图像分类模型——图像识别模型与训练策略(2023年1月22日,大年初一,春节快乐,兔年大吉)

声明:仅学习使用~ 今天是大年初一,祝大家新年快乐!!! 这个练习使用的图片稍多,因此初次在PyCharm里面可能会需要一些时间。 (注释中包含遇到的一些错误以及修正,同时也含有一些输出,部分较长的输出以省略号的形式在注释里面展示了) 2023.1.22,大年初一,新年快乐…

LoadBalancer源码解析

文章目录一、背景二、总体流程三、源码解析1. lb拦截器配置2. LB拦截器实现3. LB执行前置处理4. 负载均衡5. LB执行http请求一、背景 Spring Cloud 2020版本以后&#xff0c;默认移除了对Netflix的依赖&#xff0c;其中就包括Ribbon&#xff0c;官方默认推荐使用Spring Cloud …

生物化学 电阻抗成像OpenEIT 番外篇 EIT公式

EIT简介 摘要电阻抗断层扫描&#xff08;EIT&#xff09;是一种成像方式&#xff0c;使用无害的电流探测患者或物体。电流通过放置在靶表面上的电极馈送&#xff0c;数据由在电极处测量的电压组成&#xff0c;这些电压由一组线性独立的电流注入模式产生。EIT旨在恢复目标内部电…

【MySQL】第八部分 加密和解密函数

【MySQL】第八部分 加密和解密函数 文章目录【MySQL】第八部分 加密和解密函数8. 加密和解密函数总结8. 加密和解密函数 函数用法PASSWORD(str)返回字符串str的加密版本&#xff0c;41位长的字符串。加密结果不可逆&#xff0c;常用于用户的密码加密.( 8.0 版本以上不能用)MD5…

海湾化学冲刺上交所上市:计划募资30亿元,华融曾是其股东

近日&#xff0c;青岛海湾化学股份有限公司&#xff08;下称“海湾化学”&#xff09;预披露招股书&#xff0c;准备在上海证券交易所主板上市。本次冲刺上市&#xff0c;海湾化学计划募资30亿元&#xff0c;将于37.5万吨/年环氧氯丙烷绿色循环经济项目&#xff08;一期&#x…