JAVA封装和继承详解

2023-11-08

封装和继承

访问修饰符
  • 访问修饰符可以修饰类、方法或者变量,通常放在语句的最前端
  • 访问修饰符就是定义类、方法和变量可以被调用的范围
  • 默认修饰符可以在类上使用,同包下可以继承,不同包下不可以继承
  • protected private 修饰符不能在类上使用,在类上只能使用public 和默认修饰符
  • 默认修饰符可以用在构造方法上,继承时同包下可以,不同包下不可以
  • protected可以用在构造方法上,继承时同包下可以,不同包下不可以
  • private可以用在构造方法上,继承时不能被子类用,只能在本类使用,可以提供一个静态方法供调用者使用(单例模式)
/*访问修饰符:可以修饰变量,方法,类
修饰变量:四种修饰符都能使用
修饰方法:四种修饰符都能使用
修饰类:2种 public,default */

//名字       范围
          同类    同包     子类     不同包 
private    V        X       X       X
默认       V        V       X       X
protected  V        V       V       X
public     V        V       V       V

封装

  • 定义:将类的属性私有化隐藏起来(使用private修饰),让外部不能随意的访问属性和赋值,只能使用类提供的公开的get和set方法进行属性赋值和访问
  • 优点:减少程序的耦合;可以对成员变量进行更精确的控制,定义赋值的合法性

封装的步骤:

1.使用private进行修饰成员变量,将属性私有化

2.提供公开的get/set方法

public class Student {
	
	//第一步,属性私有化,使用private修饰属性
	private String name;
	private int age;
	private String gender;

	//提供无参  有参构造
	public Student() {
		super();
	}
	
	public Student(String name, int age, String gender) {
		super();
		this.name = name;
		this.age = age;
		this.gender = gender;
	}
	
	//第二步,提供公开的(public修饰的)的get/set方法
	//可以对属性的合法性进行判断,合法才进行赋值,比如判断年龄不能为负数
	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<0){
	     System.out.println("年龄不能为负数");
        }else{
	    	this.age = age;
	    }
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
}
使用:

1:创建对象

2:通过get/set方法进行赋值

public class test111 {
	public static void main(String[] args) {
		//创建对象
		Student stu = new Student();
		//stu.age = 18; 类封装后不能再通过这种方式进行赋值
		//通过set方法进行赋值
		stu.setAge(18);
		stu.setGender("女生");
		stu.setName("韩梅梅");
		//通过get方法调用
		System.out.println("我叫"+stu.getName()+"是"+stu.getGender()+"今年"+stu.getAge()+"岁");
	}
}

继承

  • 子类可以继承父类非private和默认修饰符(不同包时)所修饰的属性和方法;子类也可以重写父类的方法;同时子类也可以有自己的属性和方法
  • JAVA中继承是单继承,一个子类只能继承一个父类,但是一个父类可以有多个子类
  • 在Java中,所有的类都直接或者间接继承Object类
  • 继承的优点,抽取子类相同的属性和方法,子类直接继承父类,可以减少代码量
  • 调用子类构造创建子类对象时,会自动先创建父类对象
  • 子类通过extends关键字,实现继承
继承格式
class 父类 {
}
 
class 子类 extends 父类 {
}
父类
public class Animal {
	private int age;//年龄
	private String uname;//名字
	private int gender;//性别
	private String type;//品种
	public Animal() {
		super();
		System.out.println("这是父类的无参构造");
		// TODO Auto-generated constructor stub
	}
	public Animal(int age, String uname, int gender, String type) {
		super();
		System.out.println("这是父类的有参构造");
		this.age = age;
		this.uname = uname;
		this.gender = gender;
		this.type = type;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getUname() {
		return uname;
	}
	public void setUname(String uname) {
		this.uname = uname;
	}
	public int getGender() {
		return gender;
	}
	public void setGender(int gender) {
		this.gender = gender;
	}
	public String getType() {
		return type;
	}
	public void setType(String type) {
		this.type = type;
	}
	
	public void print() {
		System.out.println("名字是:"+uname+",年龄是:"+age);
	}
	
}
子类
//子类继承父类
public class Pig extends Animal{

	private double price;//子可以有类自己的属性 价钱

	public double getPrice() {
		return price;
	}

	public void setPrice(double price) {
		this.price = price;
	}
	
}
测试
Pig pig = new 	Pig();
pig.setUname("小朱");
pig.setAge(2);
pig.setGender(1);
pig.setType("中华田园猪");
pig.setPrice(33.0);//子类自己的方法

知识点
  • 1:如果子类构造方法默认的时候,会默认调用父类无参构造,如果没有写,java编译的时候会自动添加super()到第一行
  • 2:调用父类构造方法时,super必须放在第一行
  • 3:继承过来的属性大家共用了
  • 4:如果子类没有重写父类方法 方法名();this.方法名();super.方法名();三种调用方式结果一样
  • 5:super可以被用在构造方法上,也可以被用在普通方法上,但在普通方法里面不能直接调用super();
  • 6:this和super的区别,this代表自己 super代表父亲
  • 7:如果没有直接在代码里写出继承关系,默认继承Object
  • 静态方法里面不能使用 super和this
super 关键字
  • super表示父类对象,调用父类方法,访问父类构造函数

  • 调用父类构造方法时必须位于子类构造方法第一行,调用父类属性和普通方法时没有位置要求

  • super的三种使用情况:

访问父类的方法。

调用父类构造方法。

访问父类中的隐藏成员变量。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAVA封装和继承详解 的相关文章

随机推荐