Java基础—封装继承多态(详细)

面向对象三大特征 封装 继承 多态

1.封装

定义:就是把事物封装成类,将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。

作用:尽可能地隐藏对象的内部实现细节、控制用户对类的修改和访问权限(体现:private属性) 提高代码的可维护性

package com.fengzhuang.kz;

import sun.font.EAttribute;

class Animal{
	private String name;

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	private void eat() {
		System.out.println(name+"吃竹子");
	}
	
	public void publicEat() {
		eat();
   }   
}

总结: private 声明的属性需要生成public的get,set方法来从外部调用(方法也需要)

2.继承

关键字:extends

格式: class 子类 extends 父类{ }

定义:继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力 俗称子类继承父类

注意:Java只支持单继承 ,一个子类只能继承一个父类,不能继承多个父类 但是可以多重继承

package com.fengzhuang.kz;
//不能多继承
//爷爷类
class A{
	
}
// 父类
class B extends A{
	
}
//多重继承   孙子类
class C extends B{

}

2.1注意事项

1.成员变量(属性)

​ 公开的和默认的成员变量,子类是可以继承使用的

​ 私有的成员变量,子类是无法使用

2.成员方法

​ 公开的和默认的成员方法,子类是可以继承使用的

​ 私有的成员方法,子类是无法使用

3.构造器

​ 先执行父类的构造方法,然后再执行子类的构造方法

如果父类里面没有无参构造,子类就不能写无参构造

package com.fengzhuang.kz;

import sun.font.EAttribute;
//父类
class Animal{
	private String name;
	private int age;
	private char sex;
	//创建子类对象会调用父类构造器 父类早于子类
	public Animal() {
		System.out.println("我是父类无参构造器");
	}
	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 char getSex() {
		return sex;
	}
	public void setSex(char sex) {
		this.sex = sex;
	}
	private void eat() {
		System.out.println(name+"吃竹子");
	}
	
	public void publicEat() {
		eat();
   }   
}
//子类
class Panda extends Animal{
	 @Override
	public void publicEat() {
		//重写父类的方法
		System.out.println("重写");
	}
	    //方法的重载
	 public void eat() {
		 
	 }
	 public void eat(String name) {
		 
	 }
}

public class Demo01 {
	public static void main(String[] args) {
		  //通过子类对象调用父类属性 方法
           Panda panda=new Panda();
           panda.setName("国宝");
           panda.publicEat();
	}

}

练习:编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数wheels和车重weight。小车类Car是Vehicle的子类,其中包含的属性有载人数loader。卡车类Truck是Car类的子类,其中包含的属性有载重量payload。每个类都有构造方法和输出相关数据的方法。最后,写一个测试类来测试这些类的功能

package com.fengzhuang.kz;

class Vehicle{
	private int wheels;//车轮
	private double weight;//车重
	public Vehicle() {
		
	}
	public int getWheels() {
		return wheels;
	}
	public void setWheels(int wheels) {
		this.wheels = wheels;
	}
	public double getWeight() {
		return weight;
	}
	public void setWeight(double weight) {
		this.weight = weight;
	}

}
class Car1 extends Vehicle{
	private int loader;//有载人数
	
	public Car1() {
		
	}
	public int getLoader() {
		return loader;
	}
	public void setLoader(int loader) {
		this.loader = loader;
	}

	
}
class Truck extends Car1{
	private int payload;//载重量
	public void Truck() {
		
	}
	public int getPayload() {
		return payload;
	}
	public void setPayload(int payload) {
		this.payload = payload;
	}
	public void Info(Truck truck) {
		System.out.println("卡车重量:"+truck.getWeight()+"吨");
		System.out.println("卡车载重:"+truck.getPayload()+"kg");
		System.out.println("有载人数:"+truck.getLoader()+"人");
		System.out.println("车轮有: "+truck.getWheels()+"个");
	}
}

public class Demo07 {
 public static void main(String[] args) {
	  Truck truck=new Truck();
	  truck.setWeight(5);
	  truck.setPayload(200);
	  truck.setLoader(2);
	  truck.setWheels(8);
	  truck.Info(truck);
}
}

输出结果:

在这里插入图片描述

参考文档

2.2 this和super关键字

详细请看this和super的作用

2.3 重载和重写

详细请看Java重载和重写

3.多态

多态:是多种状态,是面向对象的三大特性之一,多态建立在封装和继承之上

3.1方法的多态

package com.duot.k;

class Person{
	public void run() {
		
	}
}
//方法的多态
class Man extends Person{
	//重写
	@Override
	public void run() {
		// TODO Auto-generated method stub
		super.run();
	}
}

3.2对象的多态

1.父类的引用执行子类的对象

2.编译看左 运行看右

3.一定要有继承和重写

//父类            子类
//编译看左      执行看右
Person person=new Man();

案例

编写程序实现比萨制作。需求说明编写程序,可供选择的比萨有:培根比萨和海鲜比萨。

实现思路及关键代码

  1. 分析培根比萨和海鲜比萨

  2. 定义比萨类

  3. 属性:名称、价格、大小

  4. 方法:展示

  5. 定义培根比萨和海鲜比萨继承自比萨类

  6. 定义比萨工厂类,根据输入信息产生具体的比萨对象
    PizzaFactory {
    createPizza(Pizza);//如果传的参数培根披萨就是生产培根披萨 如果传的是海鲜披萨就是生产的海鲜披萨
    }

披萨类

class Pizza{
	private String name;
	private double price;
	private int size;
	
	public Pizza(String name, double price, int size) {
		this.name = name;
		this.price = price;
		this.size = size;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public double getPrice() {
		return price;
	}
	public void setPrice(double price) {
		this.price = price;
	}
	public int getSize() {
		return size;
	}
	public void setSize(int size) {
		this.size = size;
	} 
	public void show() {
		System.out.println("我是:"+name+" 价格:"+price+" 大小:"+size+"寸");
	}
}

培根披萨类

//培根披萨
class BaconPizza extends Pizza{

	public BaconPizza(String name, double price, int size) {
		super(name,price,size);
	}
	
	@Override
	public void show() {
		// TODO Auto-generated method stub
		System.out.println("我是:"+getName()+" 价格:"+getPrice()+" 大小:"+getSize()+"寸");

	}
	
}

海鲜披萨类

//海鲜披萨
class SeafoodPizza extends Pizza{
	
	public SeafoodPizza(String name, double price, int size) {
		super(name,price,size);
	}
	@Override
	public void show() {
		// TODO Auto-generated method stub
		System.out.println("我是:"+getName()+" 价格:"+getPrice()+" 大小:"+getSize()+"寸");
	}	
}

披萨工厂类:

class PizzaFactory {
	//如果传的参数培根披萨就是生产培根披萨  如果传的是海鲜披萨就是生产的海鲜披萨
	public void createPizza(Pizza pizza) {
             pizza.show();            
	}
}

实现类:

public class Demo02 {
   public static void main(String[] args) {
	   
	   PizzaFactory pizzaFactory=new PizzaFactory();
	   Pizza baconPizza=new BaconPizza("培根披萨",200,5);
	   Pizza seafoodPizza=new SeafoodPizza("海鲜披萨",300,6);

	   pizzaFactory.createPizza(baconPizza);
	   pizzaFactory.createPizza(seafoodPizza);
}
}

在这里插入图片描述

3.3多态转型

3.3.1向上转型

本质就是:父类的引用指向子类的对象

语法格式:父类的对象 变量 = new 子类对象;

class Person {
	public void eat () {
		System.out.println("父类吃饭");
	}
}
class Student extends Person{
	@Override
	public void eat() {
		System.out.println("子类吃饭");
	}
    //子类独有的方法
	public void sleep () {
		System.out.println("子类睡觉");
	}
}
public class Demo1 {

	public static void main(String[] args) {
		//父类的引用指向子类的对象
		Person person = new Student();
		person.eat();//子类的方法
		//父类的引用不能执行子类的独有的方法
		//person.sleep();
		//如果多态中的父类引用指向子类的对象的时候必须得有继承和重写
	}
}

3.3.2向下转型

语法格式:

父类类型 父类的引用 = new 父类();
子类类型 引用变量 = 父类的引用;

大转小 需要强制类型转换

经典案例:

class Monkey {
	//Object 是所有类的父类 
	public void Test (Object obj) {
		//向下转型
		String str = (String)obj;
		System.out.println(str);
	}
}
public class Demo {
	public static void main(String[] args) {
		Monkey monkey = new Monkey();
		monkey.Test("test");
	}
}

总结:向下转型的时候,先向上转型

3.3.3 instanceof 关键字

instanceof : 比较操作符,返回值是一个布尔类型的数据 目的是在强转的时候不会出现异常

语法格式

注意对象的引用必须是运行类本类的对象,或者是子类的对象

对象的引用 instanceof 运行类型
Object obj = new object()
obj instanceof String   false

案例:

/*
 * 编写程序实现软料购买:编写程序,接收用户输入的信息,
 * 选择购买的饮料。可供选择的饮料有:咖啡、矿泉水和可乐。
 * 其中,购买咖啡时可以选择 :加糖、加奶还是什么都不加。
 * 购买可乐时可以选择:买可口可乐还是百事可乐。
 */
class Drink{
	Scanner scanner;
	public void word(Drink drink) {
		
	}
}
//咖啡
class Coffee extends Drink{
@Override
public void word(Drink drink) {
	if (drink instanceof Coffee) {
		Coffee coffee=(Coffee)drink;
		 scanner=new Scanner(System.in);
		 System.out.println("您要的咖啡加糖还是加奶,还是什么都不加");
		 String string=scanner.nextLine();
		 if ("加糖".equals(string)) {
			System.out.println("您要的咖啡加糖");
		}
		 else if ("加奶".equals(string)) {
			System.out.println("您要的咖啡加奶");
		}
		 else {
			 System.out.println("你什么都不要");
		 }
	}
}

}
//矿泉水
class  Water extends Drink{
	@Override
	public void word(Drink drink) {
		if (drink instanceof Water) {
			Water water=(Water)drink;
			System.out.println("您买矿泉水");
		}
	}
}
//可乐
class Coke extends Drink{
	@Override
	public void word(Drink drink) {
		if (drink instanceof Coke) {
			 Coke coke=(Coke)drink;
			 Scanner scanner1=new Scanner(System.in);
			 System.out.println("买可口可乐还是百事可乐");
			 String string1=scanner1.nextLine();
			 if ("可口可乐".equals(string1)) {
				System.out.println("您要的可口可乐");
			}
			 else {
				System.out.println("您要的百事可乐");
			}
			 
		}
	}
}
public class Demo04 {
         public static void main(String[] args) {
         Scanner scanner=new Scanner(System.in);
         System.out.println("你要咖啡还是可乐还是矿泉水:");
         String string=scanner.nextLine();
        
         if ("咖啡".equals(string)) {
        	 Drink drink=new Coffee();
        	 drink.word(drink);
         }
         if ("可乐".equals(string)) {
        	 Drink coke=new Coke();
        	 coke.word(coke);
         }
		
         if ("矿泉水".equals(string)) {
			Drink drink=new Water();
			drink.word(drink);
		}
        
	 	}
}

 class Demo04 {
         public static void main(String[] args) {
         Scanner scanner=new Scanner(System.in);
         System.out.println("你要咖啡还是可乐还是矿泉水:");
         String string=scanner.nextLine();
        
         if ("咖啡".equals(string)) {
        	 Drink drink=new Coffee();
        	 drink.word(drink);
         }
         if ("可乐".equals(string)) {
        	 Drink coke=new Coke();
        	 coke.word(coke);
         }
		
         if ("矿泉水".equals(string)) {
			Drink drink=new Water();
			drink.word(drink);
	         	}
        	}
		}

在这里插入图片描述

<think>嗯,用户想了解Java中的封装继承多态的概念及用法,还要求示例。首先我得回忆这三个核心OOP概念。封装应该和隐藏数据有关,通过访问修饰符来实现,比如private变量,然后提供getter和setter方法。继承的话,是子类继承父类的属性和方法,extends关键字,可能还要提到方法重写。多态的话,应该涉及父类引用指向子类对象,还有方法重载和重写。 然后用户给的引用资料里提到,引用1到5都有相关的内容,可能需要结合这些引用中的内容来组织回答。比如引用4提到继承是分等级层次的类,允许子类继承父类的特征和行为。引用5说多态是向上转型的过程,父类类型变量指向子类实例。这些都需要整合到回答中。 接下来需要结构清晰,分点解释每个概念,给出定义、作用、示例代码。可能每个概念下还要分小点,比如封装的作用包括数据保护和简化使用。继承要注意单继承,还有super关键字的使用。多态分为编译时多态(方法重载)和运行时多态(方法重写)。 示例代码方面,封装的话,可以写一个Person类,私有name和age,提供公共方法访问。继承的例子可以是Student继承Person,添加grade属性。多态可以用Animal类,Dog和Cat继承,重写eat方法,然后用父类引用调用。 还要注意用户提到的引用标识,比如在提到继承的时候引用资料里的内容,比如引用4和3,可能需要标注。但用户给的引用内容有些可能和问题不太直接相关,比如引用1和2比较泛泛,而引用3、4、5更具体,需要合理引用。 最后生成相关问题,可能包括每个概念的优缺点,实际应用中的例子,或者多态与重载重写的关系等。确保问题符合用户需求,帮助进一步学习。 检查有没有遗漏,比如是否每个概念都有示例,是否涵盖了使用场景,是否引用了正确的资料。比如多态部分提到向上转型,引用5里的内容需要标注。确保代码正确,比如Java语法正确,访问修饰符使用正确,没有语法错误。然后组织语言,用中文清晰表达,避免术语混淆。</think>### Java面向对象三大特性解析 #### 一、封装(Encapsulation) **定义**:通过访问控制修饰符隐藏对象内部细节,仅暴露必要接口$^{[^4]}$ **作用**: 1. 防止数据被意外修改(如用`private`保护字段) 2. 简化调用方的使用复杂度 3. 实现数据校验逻辑集中管理 **示例**: ```java public class BankAccount { private double balance; // 私有化字段 public void deposit(double amount) { // 暴露安全操作方法 if(amount > 0) balance += amount; } public double getBalance() { // 提供受控访问 return balance; } } ``` #### 二、继承(Inheritance) **定义**:子类通过`extends`继承父类特征,形成层次化类结构$^{[^3][^4]}$ **特性**: 1. 单继承原则(Java不支持多继承) 2. 支持方法重写(`@Override`) 3. 通过`super`调用父类构造方法 **示例**: ```java class Animal { // 父类 void eat() { System.out.println("动物进食"); } } class Cat extends Animal { // 子类继承 @Override void eat() { System.out.println("猫吃鱼"); // 方法重写 } } ``` #### 三、多态(Polymorphism) **定义**:同一操作作用于不同对象时产生不同行为$^{[^5]}$ **实现方式**: 1. 编译时多态:方法重载(Overload) 2. 运行时多态:向上转型+方法重写 **示例**: ```java Animal a = new Cat(); // 向上转型(多态核心) a.eat(); // 输出"猫吃鱼" // 方法重载示例 class Calculator { int add(int a, int b) { return a+b; } double add(double a, double b) { return a+b; } // 参数类型不同 } ``` ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kkkouz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值