前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【10】JAVASE-面向对象-继承【从零开始学JAVA】

【10】JAVASE-面向对象-继承【从零开始学JAVA】

作者头像
用户4919348
发布于 2024-05-25 06:02:50
发布于 2024-05-25 06:02:50
6700
代码可运行
举报
文章被收录于专栏:波波烤鸭波波烤鸭
运行总次数:0
代码可运行

Java零基础系列课程-JavaSE基础篇

Lecture:波哥

Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机Java 仍是企业和开发人员的首选开发平台。

四、继承

1.继承的语法格式

格式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class 子类名称 extends 父类名称{
    
}

被继承的这个类称为父类、 基类或者 超类

继承的这个类称为子类 或者 派生类

2. 继承的案例

父类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.bobo.oop08;

/**
 * 这是个Person类,抽取了 Student、Doctor、Police三个类的公共代码
 * @author dpb
 *
 */
public class Person {
	
	public String name;

	public int age;

	public String gender;

	public void sleep() {
		System.out.println("sleep .... ");
	}
}

Student,Police,Doctor三个子类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.bobo.oop08;

/**
 * 这是一个学生类
 * @author dpb
 *
 */
public class Student extends Person{
	
	public String stuNo; // 学生编号
	
	public void study(){
		System.out.println("study ....");
		
	}
}

Police

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.bobo.oop08;

/**
 * 这是一个警察类
 * @author dpb
 *
 */
public class Police extends Person{
	
	public String policeNo; // 警员编号
	
	
	/**
	 * 抓坏人的方法
	 */
	public void catchBadGuys(){
		System.out.println(".....");
		
	}
}

Doctor

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.bobo.oop08;

/**
 * 这是一个医生类
 * @author dpb
 *
 */
public class Doctor extends Person{
	
	
	public String doctorNum; // 医生编号
	
	public String department; // 部门
	
	
	public void savePeople(){
		System.out.println("save ...");
	}
}

3.继承的好处

  1. 简化了代码
  2. 提高了代码的可维护性
  3. 提高了扩展性

4.继承的缺点

开发设计思想:高内聚低耦合(尽量在一个类里面内聚,类和类之间的关系尽量保持独立)

继承后耦合性提高,牵一发动全身, 这个缺点不能改进,在Java中里面尽量不要使用继承

5. 继承的注意事项

  1. 继承是对一批类的抽象,类是对一批对象的抽象
  2. Java中只支持单继承,不支持多继承,但是支持多层继承
  3. 子类可以继承父类private修饰的属性和方法,但是不可见
  4. 子类不可以继承父类构造方法
  5. 子类出来继承父类的属性和方法以外,还可以添加自己的属性和方法

6. 怎么使用继承

继承的本质是什么? --> 简化代码

  1. 先写出所有的子类,观察子类共有的成员变量和成员方法
  2. 抽象出共同点,书写出父类
  3. 让子类区继承父类,并把子类中的共有属性删除

7.课堂案例

1、定义一个人类(姓名,年龄,性别,吃,睡) ,学生类继承人类(学号,班级,课程) ,老师类继承人类(工号,教龄,教书)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.bobo.oop09;

/**
 * 姓名,年龄,性别,吃,睡
 * @author dpb
 *
 */
public class Person {

	public String name;
	
	public int age;
	
	public String gender;
	
	public void eat(){
		System.out.println("Person.eat() ....");
	}
	
	public void sleep(){
		System.out.println("Person.sleep() ...");
	}
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.bobo.oop09;

/**
 * 老师类继承人类(工号,教龄,教书)
 * @author dpb
 *
 */
public class Teacher extends Person{

	public String workNum;
	
	public int schoolAge;
	
	public String course;
	
	
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.bobo.oop09;

/**
 * 学生类继承人类(学号,班级,课程)
 * @author dpb
 *
 */
public class Student extends Person{
	
	public String stuNo;
	
	public String className;
	
	public String course;
	
}

8. super关键字

​ super关键字可以理解为 父类对象,this关键字表示当前对象

​ 当一个属性的使用没有添加this或者super关键字,那么他的查找顺序是 局部变量–>成员变量–>父类变量 如果还没有找到那么就会包编译异常。

​ 被this修饰的变量,如果本类的成员变量中没有找到,同样也会去父类中查找

​ 被super修饰的变量只会从父类中查找,如果父类中没有,而子类中存在,同样会报编译错误

super和this关键字访问成员的区别

成员变量

  1. this.成员变量
  2. super.成员变量 super 是不能访问私有的成员变量的,可以通过访问对应的共有方法实现

成员方法:

  1. this.成员方法
  2. super.成员方法

构造方法:

  1. this(参数列表);
  2. super(参数列表); 任何一个构造方法都默认的会在构造方法的第一句上写上 super(); 访问父类的无参构造方法 目的是初始化父类的成员变量 Constructor call must be the first statement in a constructor

super和this方法构造方法都必须出现在构造方法的第一句,this和super在方法构造方法的时候,二者是不能共存

static静态的上下文都是不能出现this和super的

案例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.bobo.oop01;

public class Son extends Father{
	

	/**
	 * 在子类中定义了一个和父类中同名的属性
	 * 子类中定义的同名的属性会覆盖掉父类中的属性
	 */
	public int num = 30;
	
	public void show(){
		// 局部变量会覆盖掉成员变量
		//int num = 40;
		// 输出局部变量
		System.out.println("num:" + num);
		// 输出成员变量
		System.out.println("num:" + this.num);
		// 输出父类的成员变量
		System.out.println("num:" + super.num);
		System.out.println(super.getAge());
		eat();
	}
	
	public Son(){
		// 在构造方法中,默认都会添加一句 super(); 而且必须是第一行 
		// Constructor call must be the first statement in a constructor
		System.out.println("Son 子类构造器执行了...");
	}
	
	public Son(int num){
		this();
		//super(); 会在无参构造方法中执行 super(); 此处如果再执行一次就会出现两次初始化父类中成员变量的情况
	}

}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.bobo.oop01;

public class Father {
	
	public int num = 10;
	
	private int age ;
	
	public void eat(){
		System.out.println("Father.eat ...");
	}
	
	public Father(){
		System.out.println("Father 。。。。构造器执行了");
	}

	public int getAge() {
		return age;
	}
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.bobo.oop01;

public class OOPDemo01 {

	public static void main(String[] args) {
		Son son = new Son();
		son.show();

	}
}

9. 访问权限修饰符

作用:表示被修饰的元素的访问权限

访问权限修饰符有四个: public protected [default] private

访问权限修饰符可以修饰的元素:

  1. 类 只有public、abstract和final能够修饰,或者不加【private和protected可以修饰内部类】
  2. 成员变量
  3. 成员方法

四个修饰符的特点

  1. public修饰的成员对一切类可见
  2. protected修饰的成员本包下面都可见,不同包下只有子类可见
  3. default修饰的成员仅对同包下面的可见
  4. private修饰的成员仅对本类可见

Java中的封装就是通过访问权限修饰符来实现的

访问权限修饰符的宽严的关系

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public  > protected  >  default  >  private

public

protected

[default]

private

同一类中

同一包中子类、其它类

不同包中子类

不同包中其它类

10. 方法的重写

​ 如果从父类继承的方法不能满足子类的需求的情况下,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写,子类中出现了和父类中一模一样的方法声明,,也称为方法的覆盖或者方法的复写。

方法的重写的规则

  1. 方法名称相同
  2. 参数列表相同
  3. 返回值类型相同或者是其子类
  4. 访问权限修饰符不能严于父类

方法重写的注意事项:

  1. 父类中的私有的方法不能重写的
  2. 构造方法不能被重写
  3. 子类重写父类方法时,访问权限不能更低
  4. 重载和重写的区别

面试题:

重载和重写的区别:

重载的定义:

  1. 同一个类中
  2. 方法名称相同
  3. 参数列表不同
  4. 和返回值及访问权限修饰符没有关系

位置

方法名

参数列表

返回值

访问权限修饰符

方法重写

子类

相同

相同

相同或者子类

不能严于父类

方法重载

同类

相同

不相同

没有关系

没有关系

11. 课堂案例讲解

(1)设计一个User类,其中包括用户名、口令等属性以及构造方法(至少重载2个)。获取和设置口令的方法,显示和修改用户名的方法等。编写应用程序测试User类。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.bobo.oop05;

public class OOPDemo01 {

	/**
	 * 设计一个User类,其中包括用户名、口令等属性以及构造方法(至少重载2个)。
	 * 获取和设置口令的方法,显示和修改用户名的方法等。编写应用程序测试User类。
	 * @param args
	 */
	public static void main(String[] args) {
		User user = new User("admin","123");
		System.out.println(user.getUserName()); 
		System.out.println(user.getPassword());

	}

}
class User{
	
	private String userName;
	
	private String password;
	
	public User(){
	}
	
	public User(String userName,String password){
		this.userName = userName;
		this.password = password;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
}

(2)定义一个Student类,其中包括用户名、密码、姓名、性别、出生年月等属行以及init()——初始化各属性、display()——显示各属性、modify()——修改姓名等方法。实现并测试这个类。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.bobo.oop05;

public class OOPDemo02 {

	/**
	 * 定义一个Student类,其中包括用户名、密码、姓名、性别、出生年月等属行
	 * 以及init()——初始化各属性、display()——显示各属性、
	 * modify()——修改姓名等方法。实现并测试这个类。
	 * @param args
	 */
	public static void main(String[] args) {
		Student stu = new Student();
		// 初始成员变量
		stu.init("root", "123", "波波老师", "男", "198704");
		// 打印信息
		stu.display();
		// 修改姓名
		stu.modify("张三");
		// 打印信息
		stu.display();

	}

}

class Student{
	private String userName;
	private String password;
	private String name;
	private String gender;
	private String birth;
	
	/**
	 * 初始化成员变量
	 * @param userName
	 * @param password
	 * @param name
	 * @param gender
	 * @param birth
	 */
	public void init(String userName,String password
			,String name,String gender,String birth)
	{
		this.userName = userName;
		this.password = password;
		this.name = name;
		this.gender = gender;
		this.birth = birth;
		
	}
	
	/**
	 * 打印各个属性的方法
	 */
	public void display(){
		System.out.println("userName=" + this.userName
				+ "\t password=" + this.password
				+ "\t name=" + this.name
				+ "\t gender=" + this.gender
				+ "\t birth="+this.birth);
	}
	
	/**
	 * 修改姓名的方法
	 * @param name
	 */
	public void modify(String name){
		this.name = name;
	}
}

(3)从上题的Student类中派生出Granduate(研究生)类,添加属性:专业subject、导师adviser。重载相应的成员方法。并测试这个类。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.bobo.oop05;

public class OOPDemo02 {

	/**
	 * 定义一个Student类,其中包括用户名、密码、姓名、性别、出生年月等属行
	 * 以及init()——初始化各属性、display()——显示各属性、
	 * modify()——修改姓名等方法。实现并测试这个类。
	 * @param args
	 */
	public static void main(String[] args) {
		/*Student stu = new Student();
		// 初始成员变量
		stu.init("root", "123", "波波老师", "男", "198704");
		// 打印信息
		stu.display();
		// 修改姓名
		stu.modify("张三");
		// 打印信息
		stu.display();*/
		Granduate  g = new Granduate();
		g.init("root", "123", "波波老师", "男", "198704","医学专业","xxxx");
		g.display();
		g.modify("aaa");
		g.display();

	}

}

class Student{
	public String userName;
	public String password;
	public String name;
	public String gender;
	public String birth;
	
	/**
	 * 初始化成员变量
	 * @param userName
	 * @param password
	 * @param name
	 * @param gender
	 * @param birth
	 */
	public void init(String userName,String password
			,String name,String gender,String birth)
	{
		this.userName = userName;
		this.password = password;
		this.name = name;
		this.gender = gender;
		this.birth = birth;
		
	}
	
	/**
	 * 打印各个属性的方法
	 */
	public void display(){
		System.out.println("userName=" + this.userName
				+ "\t password=" + this.password
				+ "\t name=" + this.name
				+ "\t gender=" + this.gender
				+ "\t birth="+this.birth);
	}
	
	/**
	 * 修改姓名的方法
	 * @param name
	 */
	public void modify(String name){
		this.name = name;
	}
}
/**
 * 从上题的Student类中派生出Granduate(研究生)类,
 * 添加属性:专业subject、导师adviser。重载相应的成员方法。并测试这个类。
 * @author dpb
 *
 */
class Granduate extends Student{
	public String subject;
	
	public String adviser;
	
	/**
	 * 重载的init方法  实现子类成员变量的初始化和父类中的成员变量的初始化操作
	 * @param subject
	 * @param adviser
	 */
	public void init(String userName,String password
			,String name,String gender,String birth,String subject,String adviser){
		super.init(userName, password, name, gender, birth);
		this.subject = subject;
		this.adviser = adviser;
	}
	
	@Override
	public void display() {
		// TODO Auto-generated method stub
		System.out.println("userName=" + this.userName
				+ "\t password=" + this.password
				+ "\t name=" + this.name
				+ "\t gender=" + this.gender
				+ "\t birth="+this.birth
				+ "\t subject=" + this.subject
				+ "\t adviser=" + this.adviser);
	}
}

(4)创建两个具有继承结构的两个类,父类和子类均有自己的静态代码块、构造方法。观察他们的运行顺序。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.bobo.oop05;

public class OOPDemo03 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Son son1 = new Son();
		Son son2 = new Son();
		Son son3 = new Son();
		
	}

}
/**
 *  创建两个具有继承结构的两个类,
 *  父类和子类均有自己的静态代码块、构造方法。观察他们的运行顺序。
 * @author dpb
 *
 */
class Father{
	
	static{
		System.out.println("father ... 静态代码块");
	}
	public Father(){
		System.out.println("father 构造方法...");
	}
}

class Son extends Father{
	static{
		System.out.println("son .... 静态代码块");
	}
	
	public Son(){
		System.out.println("son ... 构造方法");
	}
}

输出结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
father ... 静态代码块
son .... 静态代码块
father 构造方法...
son ... 构造方法
father 构造方法...
son ... 构造方法
father 构造方法...
son ... 构造方法

(5)编写一个汽车类Car 编写一个宝马类BMW 继承Car 编写一个奔驰类Benz 继承Car 在三个类中都有一个run方法,表示不同车在跑 编写一个人类Person,不同的对象有不同的车

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.bobo.oop05;

public class OOPDemo04 {

	/**
	 * 编写一个汽车类Car
		编写一个宝马类BMW 继承Car
		编写一个奔驰类Benz 继承Car
		在三个类中都有一个run方法,表示不同车在跑
		编写一个人类Person,不同的对象有不同的车
	 * @param args
	 */
	public static void main(String[] args) {
		Car car = new Car();
		BMW bmw = new BMW();
		Benz benz = new Benz();
		
		Person p1 = new Person(car);
		Person p2 = new Person(bmw);
		Person p3 = new Person(benz);
	}
}

class Car{
	public void run(){
		System.out.println("汽车在运行...");
	}
}

class BMW extends Car{
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		System.out.println("宝马车在运行...");
	}
}

class Benz extends Car{
	
	@Override
	public void run() {
		System.out.println("奔驰车在运行...");
	}
}

/**
 * 不同的对象又不同的车
 * @author dpb
 *
 */
class Person{
	
	public Car car;
	
	public  Person(Car car){
		this.car = car;
	}
	
}

(6)有农民(farmer),教师(teacher),科学家(scientist),服务生(attendant),其中农民,服务生只有基本工资.教师除基本工资外,还有课酬(元/天),科学家除基本工资外,还有年终奖,请你写出相关类,将各种类型的员工的全年工资打印出来

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.bobo.oop05;

public class OOPDemo05 {

	/**
	 * 有农民(farmer),教师(teacher),科学家(scientist),服务生(attendant),
	 * 其中农民,服务生只有基本工资.教师除基本工资外,还有课酬(元/天),
	 * 科学家除基本工资外,还有年终奖,
	 * 请你写出相关类,将各种类型的员工的全年工资打印出来
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}
// 农民
class Farmer{
	public double basePay; // 基本工资
	
	public void printYearSalary(){
		System.out.println("Farmer全年的工资:" + basePay * 12);
	}
}

class Attendant{
	public double basePay; // 基本工资
	
	public void printYearSalary(){
		System.out.println("Attendant全年的工资:" + basePay * 12);
	}
}

class Teacher extends Farmer{
	
	public double classFee; // 课时费(天)
	
	@Override
	public void printYearSalary() {
		System.out.println("教师的全年工资:" + this.basePay*12 + classFee * 200);
	}
}

class scientist extends Farmer{
	public double yearBonus; // 年终奖
	
	@Override
	public void printYearSalary() {
		System.out.println("科学家全年的收入是:" + this.basePay *12 + yearBonus);
	}  
}

(7)完成如下功能 a.设计一个表示二维平面上点的类Point,包含有表示坐标位置的protected 类型的 成员变量x 和y,获取和设置x 和y 值的public 方法。 b.设计一个表示二维平面上圆的类Circle,它继承自类Point,还包含有表示圆半径 的protected 类型的成员变量r、获取和设置r 值的public 方法、计算圆面积的public 方 法。 c.设计一个表示圆柱体的类Cylinder,它继承自类Circle,还包含有表示圆柱体高的 protected 类型的成员变量h、获取和设置h 值的public 方法、计算圆柱体体积的public 方法。 d.建立Cylinder 对象,输出其轴心位置坐标、半径、面积、高及其体积的值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.bobo.oop05;

public class OOPDemo06 {

	/**
	 * 完成如下功能
		a.设计一个表示二维平面上点的类Point,包含有表示坐标位置的protected 类型的
			成员变量x 和y,获取和设置x 和y 值的public 方法。
		b.设计一个表示二维平面上圆的类Circle,它继承自类Point,还包含有表示圆半径
			的protected 类型的成员变量r、获取和设置r 值的public 方法、计算圆面积的public 方
			法。	
		c.设计一个表示圆柱体的类Cylinder,它继承自类Circle,还包含有表示圆柱体高的
			protected 类型的成员变量h、获取和设置h 值的public 方法、计算圆柱体体积的public
			方法。
		d.建立Cylinder 对象,输出其轴心位置坐标、半径、面积、高及其体积的值。
	 * @param args
	 */
	public static void main(String[] args) {
		Cylinder c = new Cylinder();
		c.x = 1;
		c.y = 1;
		c.r = 2;
		c.h = 2;
		System.out.println("圆心点的底坐标是(" +c.getX() + ","+c.getY()+")");
		System.out.println("圆的半径是:" + c.getR());
		System.out.println("圆的面积是:" + c.getArea());
		System.out.println("圆柱体的体积是:" + c.getVolume());

	}

}

/**
 * a.设计一个表示二维平面上点的类Point,包含有表示坐标位置的protected 类型的
		成员变量x 和y,获取和设置x 和y 值的public 方法。
 * @author dpb
 *
 */
class Point{
	protected int x;
	protected int y;
	public int getX() {
		return x;
	}
	public void setX(int x) {
		this.x = x;
	}
	public int getY() {
		return y;
	}
	public void setY(int y) {
		this.y = y;
	}
}

/**
 * b.设计一个表示二维平面上圆的类Circle,它继承自类Point,还包含有表示圆半径
		的protected 类型的成员变量r、获取和设置r 值的public 方法、计算圆面积的public 方
		法。
 * @author dpb
 *
 */
class Circle extends Point{
	
	protected int r;

	public int getR() {
		return r;
	}

	public void setR(int r) {
		this.r = r;
	}
	
	/**
	 * 获取圆面积的方法
	 *   pi*r*r
	 * @return
	 */
	public double getArea(){
		return Math.PI * this.r * this.r;
	}
	
}

/**
 * c.设计一个表示圆柱体的类Cylinder,它继承自类Circle,还包含有表示圆柱体高的
		protected 类型的成员变量h、获取和设置h 值的public 方法、计算圆柱体体积的public
		方法。
 * @author dpb
 *
 */
class Cylinder extends Circle{
	
	protected int h;

	public int getH() {
		return h;
	}

	public void setH(int h) {
		this.h = h;
	}
	
	
	/**
	 * 计算圆柱体 体积的方法
	 * 面积*高
	 * @return
	 */
	public double getVolume(){
		return super.getArea() * this.h;
	}	
}

输出的结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
圆心点的底坐标是(1,1)
圆的半径是:2
圆的面积是:12.566370614359172
圆柱体的体积是:25.132741228718345

12. final关键字

final关键字是 最终 的意思,可以修饰类,变量和方法

12.1 修饰类

该类就不能被继承

12.2 修饰变量

变量会变为常量,只能赋值一次,之后就不能改变了, final修饰的变量称为常量,常量名我们都大写,常量一般我们会声明为static

​ 成员变量:在定义的同时必须给出初始值。

​ 局部变量:可以在使用之前赋值

12.3 修饰方法

final修饰的方法,子类是不能重写该方法的!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Cannot override the final method from Person
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-05-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
ClickHouse 在有赞的实践之路
本文主要介绍了 ClickHouse 的简单原理,有赞 OLAP 相关组件以及 ClickHouse 在有赞的实践之路。
用户1278550
2021/02/01
1.8K0
ClickHouse 在有赞的实践之路
【图文详解】一文全面彻底搞懂HBase、LevelDB、RocksDB等NoSQL背后的存储原理:LSM-tree 日志结构合并树
LSM 树广泛用于数据存储,例如 RocksDB、Apache AsterixDB、Bigtable、HBase、LevelDB、Apache Accumulo、SQLite4、Tarantool、WiredTiger、Apache Cassandra、InfluxDB和ScyllaDB等。
一个会写诗的程序员
2022/11/30
3.7K0
【图文详解】一文全面彻底搞懂HBase、LevelDB、RocksDB等NoSQL背后的存储原理:LSM-tree 日志结构合并树
交互式分析领域,为何ClickHouse能够杀出重围?
导语 | 在百花齐放的交互式分析领域,ClickHouse 绝对是后起之秀,它虽然年轻,却有非常大的发展空间。本文将分享 PB 级分析型数据库 ClickHouse 的应用场景、整体架构、众多核心特性等,帮助理解 ClickHouse 如何实现极致性能的存储引擎,希望与大家一起交流。文章作者:姜国强,腾讯实时检索研发工程师。
Spark学习技巧
2020/11/09
1.8K0
交互式分析领域,为何ClickHouse能够杀出重围?
「ClickHouse系列」ClickHouse的优化之Block+LSM
其实本部分的标题也可以换成批处理+预排序。clickhouse通过block的设计来实现批处理,通过lsm算法来实现预排序。我们分别来分析一下,这个组合对查询速度的影响。
王知无-import_bigdata
2023/04/07
1.1K0
「ClickHouse系列」ClickHouse的优化之Block+LSM
基于LSM-Tree 的分布式组件化 KV 存储系统 | DB·洞见回顾
随着云服务基础架构以及微服务技术的日益成熟,很多大型系统能够分解为根据应用 workload 需求的多个子系统,再通过网络交互组装在一起协同工作。 Nova-LSM,一个将基于LSM-Tree的分布式KV 存储系统分解为使用RDMA进行通信的组件的工作。这些组件将存储与处理分开,使处理组件能够共享存储带宽和空间。处理组件将文件块 (SSTable) 分散到任意数量的存储组件中,并通过一定机制平衡它们之间的负载,在运行时动态构建范围以并行化压缩并提高性能。Nova-LSM 具有很好的可伸缩性,在一些场景下性
腾讯云数据库 TencentDB
2022/05/13
1.3K0
基于LSM-Tree 的分布式组件化 KV 存储系统 | DB·洞见回顾
DDIA 读书分享 第三章(上):LSM-Tree 和 B-Tree
第二章讲了上层抽象:数据模型和查询语言。本章下沉一些,聚焦数据库底层如何处理查询和存储。这其中,有个逻辑链条:
木鸟杂记
2022/03/31
8180
DDIA 读书分享 第三章(上):LSM-Tree 和 B-Tree
OceanBase 历史数据归档方案技术原理解读
面对快速增长的在线数据,尤其在例如订单、交易、日志等场景,数据往往多呈现为流水型特征,写入一段时间后即不会再次访问或更新;对访问频率很低甚至为0的数据,其占用的在线业务库固态存储空间,造成了大量硬件资源浪费,堆高企业的IT成本。同时,传统数据归档方案往往是业务研发或 DBA 采用脚本或简单的同步工具进行,难以在并发和效率上有效控制,很容易对在线数据库产生影响,严重的甚至导致生产数据误删事故。
公众号:码到三十五
2024/05/27
2720
OceanBase 历史数据归档方案技术原理解读
想要实现在时序场景下“远超”通用数据库,需要做到哪几点?
小 T 导读:近年来,随着物联网技术和市场的快速发展、企业业务的加速扩张,时序数据的处理难题也越来越受到行业和企业的重视,时序场景下通用型数据库步履维艰,各种时序数据库产品应运而起。但是,做一个优质的时序数据库真的很容易吗?本篇文章将从数据库开发者的角度,解剖时序场景下的数据处理需求、分析时序数据库设计思路,给到读者一些硬核技术思考。
深度学习与Python
2022/06/11
6410
想要实现在时序场景下“远超”通用数据库,需要做到哪几点?
DB·洞见#2回顾 | 基于LSM-Tree存储的数据库性能改进
LSM-Tree(Log Structured Merge Tree)是数据库领域内较高效的key-value存储结构,被广泛应用于工业界数据库系统,如经典的单机kv数据库LevelDB、RocksDB,以及被诸多分布式NewSQL作为底层存储引擎。 本期将由腾讯云数据库高级工程师韩硕来为大家分享基于LSM-Tree存储的数据库性能改进,重点介绍近年来学术界对LSM-Tree的性能改进工作,并探讨这些改进措施在工业界数据库产品中的应用情况以及落地的可能性。以下是分享实录: LSM-Tree基本结构 LS
腾讯云数据库 TencentDB
2022/01/06
1.7K0
LSM-tree 基本原理及应用
LSM-tree 在 NoSQL 系统里非常常见,基本已经成为必选方案了。今天介绍一下 LSM-tree 的主要思想,再举一个 LevelDB 的例子。
Apache IoTDB
2020/09/27
9290
LSM-tree 基本原理及应用
[业界方案] ClickHouse业界解决方案学习笔记
本文通过分析总结几篇文章来看目前工业界可能偏好的解决方案。学习目的是:大致知道其应用领域,技术特点和未来方向,看看目前工作中是否可以用到,或者当以后选型时候能够做到心里有数。
罗西的思考
2020/09/07
1.8K0
Apache IoTDB 相关论文入选国际数据库顶级会议 ICDE 2022
2022年5月9日,国际数据库顶级会议 ICDE 2022(线上会议)盛大召开。康愈圆同学的《 Separation or Not: On Handing Out-of-Order Time-Series Data in Leveled LSM-Tree 》被 ICDE 2022 录用,并在会议上介绍了这篇论文。
Apache IoTDB
2022/09/02
6610
Apache IoTDB 相关论文入选国际数据库顶级会议 ICDE 2022
架构探索之ClickHouse
Tech 导读 ClickHouse是一款开源的列式数据库管理系统,适用于在线分析处理(OLAP)场景,本文通过介绍ClickHouse,帮助读者今后快速地处理大规模数据,并获得实时的分析结果,为业务提供有力支持。
京东技术
2024/01/22
4780
架构探索之ClickHouse
一文科普 RocksDB 工作原理
会保证每周不低于两篇更新,订阅方式见👉这里,欢迎喜欢我文章的朋友们的订阅支持,激励我产出更多优质文章。 RocksDB 是很多分布式数据库的底层存储,如 TiKV、CRDB、NebulaGraph 等等。在 DataDog 工作的 Artem Krylysov 写了一篇文章(原文链接:https://artem.krylysov.com/blog/2023/04/19/how-rocksdb-works/)来对 RocksDB 做了一个科普,通俗易懂,在这里翻译下分享给大家。
木鸟杂记
2023/09/18
3K0
一文科普 RocksDB 工作原理
ClickHouse大数据领域企业级应用实践和探索总结
2020年下半年在OLAP领域有一匹黑马以席卷之势进入大数据开发者的领域,它就是ClickHouse。在2019年小编也曾介绍过ClickHouse,大家可以参考这里进行入门:
王知无-import_bigdata
2021/01/20
1.6K0
ClickHouse大数据领域企业级应用实践和探索总结
ClickHouse 冷热分离存储在得物的实践
得物上一代日志平台的存储主要依赖于 ES。随着公司业务的高速发展,日志场景逐步产生了一些新需求,主要表现在:应用数量逐步增多,研发需要打印更多的日志定位业务问题,安全合规需要保留更长时间的日志。随着 Clickhouse 的应用广泛,我们了解到行业部分知名公司已经将日志平台逐步由 ES 迁移至Clickhouse,以此来获取更好的写入性能与高压缩比。因此我们与日志平台研发团队开始进行日志平台新存储的选型评估,本文会介绍我们如何通过 Clickhouse 的冷热分离存储替代 ES 的实施方案。
得物技术
2022/10/26
2.4K0
ClickHouse 冷热分离存储在得物的实践
支撑700亿数据量的ClickHouse高可用架构实践
蔡岳毅,携程旅行网酒店研发中心高级研发经理,资深架构师,负责酒店大住宿数据智能平台,商户端数据中心以及大数据的创新工作。
iginkgo18
2023/05/24
2.3K1
HBase/TiDB都在用的数据结构:LSM Tree,不得了解一下?
LSM Tree(Log-structured merge-tree)广泛应用在HBase,TiDB等诸多数据库和存储引擎上,我们先来看一下它的一些应用:
Monica2333
2020/08/13
1.9K0
HBase/TiDB都在用的数据结构:LSM Tree,不得了解一下?
Clickhouse 实践
在数据量日益增长的当下,传统数据库的查询性能已满足不了我们的业务需求。而Clickhouse在OLAP领域的快速崛起引起了我们的注意,于是我们引入Clickhouse并不断优化系统性能,提供高可用集群环境。本文主要讲述如何通过Clickhouse结合大数据生态来定制一套完善的数据分析方案、如何打造完备的运维管理平台以降低维护成本,并结合具体案例说明Clickhouse的实践过程。
ruochen
2021/11/21
1.7K0
一些有趣的B+树优化实验
作为目前数据库引擎的两种主要数据结构,LSM-tree和B+-tree在业界已经有非常广泛的研究。相比B+-tree,LSM-tree牺牲一定的读性能以换取更小的写放大以及更低的存储成本,但这必须建立在已有的HDD和SSD的基础上。 探索前沿研究,聚焦技术创新,本期DB·洞见由腾讯云数据库高级工程师王宏博进行分享,主要介绍一篇2022年FAST的论文,主题为“基于硬件透明压缩的B+树优化”。本次分享的论文针对可计算存储SSD(支持硬件透明压缩)提出了三种有趣的设计方法,从而极大地减少了B+-tree的写放大
腾讯云数据库 TencentDB
2022/06/09
1K0
一些有趣的B+树优化实验
推荐阅读
相关推荐
ClickHouse 在有赞的实践之路
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验