JavaSE学习(6) 面向对象类和对象(4)三大特性

Java面向对象编程三大特征:封装、继承、多态

抽象:

  定义一个类,实际是把一类事物的共有的属性和行为提取出来,形成一个物理模型(模板)。

封装:

把抽象出的数据和对数据的操作封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作(成员方法),才能对数据进行操作。

访问控制修饰符

java提供四种访问控制修饰符控制方法和变量的访问权限:

1)公开级别:public ,对外开放

2)受保护级别:protected修饰,对子类和同一个包中的类公开

3)默认级别:没有修饰符号,向同一个包的类公开

4)私有级别:private修饰,只有类本身可以访问,不对外公开

 访问级别:   访问控制修饰符   同类 同包 子类不同包

 公开 public                        可以可以可以 可以

受保护 protected可以可以 可以 不可以

默认 没有修饰符可以可以 不可以 不可以

私有 private可以不可以 不可以不可以


包(package)--必要性

三大作用:

1)区分相同名字的类

2)当类很多时,可以很好的管理类

3)控制访问范围


包--打包命令

package com.xiaohuzi


包的命名规范

小写字母  比如  com.china.xiaohuzi


包-常用的包

一个包下,包含很多个类,java中常用 的包有:

java.lang.*包   自动引入         java.util.* 工具包

java.net.*       网络开发包              java.aw.*包 窗口工具包

如何让引入包?

import 包;

示例:import java.awt.*;

引入一个包的主要目的是使用该包下的类


继承:

解决代码复用,当多个类存在相同属性(变量)和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过extends语句来声明继承父类

class  子类 extends   父类

这样,子类就会自动拥有父类定义的属性和方法

示例:

package com.chenchen;
/*
 * 功能:说明继承的重要性
 * */
public class Demo1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Pupil p1=new Pupil();
		p1.printName();
	}

}
//将学生的共有属性提出,做一个父类
class Stu{
	//定义成员属性
		public int age;
		public String name;
		public float fee;
		public void printName(){
			System.out.println("名字:"+this.name);
		}
}
//小学生
class Pupil extends Stu{
	//定义成员属性
	
	//交学费
	public void pay(float fee){
		this.fee=fee;
	}
	
}
//中学生类
class MiddleStu extends Stu{
//定义成员属性
	
	
	//交学费
	public void pay(float fee){
		this.fee=fee*0.8f;
	}
}
//大学生类
class ColStu extends Stu{
//定义成员属性

	
	//交学费
	public void pay(float fee){
		this.fee=fee*0.1f;
	}
}
注意事项:

1)子类最多只能继承一个父类(直接继承)

2)java所有的类都是Object类的子类


方法重载:

方法重载(overload)和方法覆盖(override)

 方法重载就是类的同一种功能的多种实现方式,到底采用哪种方式,取决于调用者给出的参数。

注意事项:

1)方法名相同

2)方法的参数名、个数、顺序至少有一项不同

3)方法返回类型可以不同

4)方法的修饰符可以不同

如果只是返回类型不同,不能构成重载!!

如果只是修饰符不 同,不能构成重载!!

package com.xxx;

import javax.swing.*;

public class Demo2 extends JFrame {
	public static void main(String []args){
		//Demo2 demo2=new Demo2();
		Abc abc=new Abc();
		System.out.println(abc.getMax(3, 4));
	}
	/*public Demo2(){
		this.setVisible(true);
		this.setSize(400,400);
	}*/
}
class Abc{
	//返回较大的整数
	public int getMax(int i,int j){
		if(i>j){
			return i;
		}else{
			return j;
		}
	}
	public float getMax(float a,float b){
		if(a>b){
			return a;
		}else{
			return a;
		}
	}
	public float getMax(double c,float d){
		if(c>d){
			return (float)c;
		}else{
			return (float)d;
		}
	}
	public float getMax(float d,double c){
		if(c>d){
			return (float)c;
		}else{
			return (float)d;
		}
	}
	//如果只是返回类型不一样,能否构成重载:不能!!!
	/*public double getMax(float d,double c){
		if(c>d){
			return (float)c;
		}else{
			return (float)d;
		}
	}*/
	//如果只是控制访问修饰符不同,能否构成重载:不能!!!
	/*private double getMax(float d,double c){
	if(c>d){
		return (float)c;
	}else{
		return (float)d;
	}
}*/
}
方法覆盖:

子类有一个方法,和父类的某个方法的名称、返回类型、参数一样,这就是方法的覆盖

1)子类的方法的返回类型,参数,方法名称,要和父类方法的返回类型,参数,方法名称完全一样,否则编译通不过

2)子类方法不能缩小父类访问方法的访问权限,反之可以。


package com.xxx;

public class Demo3 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//创建一只猫
		Cat cat1=new Cat();
		cat1.cry();
		Dog dog1=new Dog();
		dog1.cry();
	}

}
class Animal{
	int age;
	String name;
	//都会叫
	public void cry(){
		System.out.println("我是动物不知道怎么叫唤!");
	}
	
}
//猫猫类
class Cat extends Animal{
	//覆盖父类
	public void cry(){
		System.out.println("喵喵!");
	}
	
}
//狗狗类
class Dog extends Animal{
	//覆盖父类
	public void cry(){
		System.out.println("汪汪!");
	}
	
}

多态:

-指一个引用(类型)在不同情况下的多种状态。

通过指向父类的指针,来调用在不同子类中实现的方法。

多态注意类型的转换

1)java允许父类的引用变量引用她的子类对象-----自动完成!

/*
 * 演示多态
 * */
package com.xxx;

public class Demo5 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//多态
		/*Cat1 cat=new Cat1();
		cat.cry();
		Dog1 dog=new Dog1();
		dog.cry();*/
		/*Cat1 cat=new Cat1();
		 * Animal1 an=new Cat1();
		an.cry();
		an=new Dog1();
		an.cry();*/
		Master master=new Master();
		master.feed(new Dog1(), new Bone());
	}
}
//主人类
class Master{
	//给动物喂食物,使用多态,方法就可以用一个
	public void feed(Animal1 an,Food f){
		an.eat();
		f.showName();
	}
}
class Food{
	String name;
	public void showName(){
		
	}
}
class Fish extends Food{
	public void showName(){
		System.out.println("鱼!");
	}
}
class Bone extends Food{
	public void showName(){
		System.out.println("骨头!");
	}
}
//动物类
class Animal1{
	private String name;
	private int age;
	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 void cry(){
		System.out.println("不要知道怎么叫!");
	}
	//动物可以吃东西
	public void eat(){
		System.out.println("不知道吃什么");
	}
}
class Dog1 extends Animal1{
	//狗自己叫唤
	public void cry(){
		System.out.println("汪汪叫");
	}
	//狗吃东西
	public void eat(){
		System.out.println("狗喜欢吃骨头!");
	}
}
class Cat1 extends Animal1{
	//猫自己叫唤
	public void cry(){
		System.out.println("喵喵叫");
	}
	//猫吃东西
	public void eat(){
		System.out.println("猫喜欢吃鱼!");
	}
}

补充:如果希望在子类中去调用父类的构造方法,要求在子类的构造函数中调用

public class Test4 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Kkk kk=new Kkk(1, "cc");
	}

}
class Base{
	int age;
	String name;
	public Base(int age,String name) {
		// TODO Auto-generated constructor stub
		System.out.println("Base");
		this.age=age;
		this.name=name;
	}
}
class Kkk extends Base{
	public Kkk(int age,String name){
		
		super(age,name);
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值