java是一门完全面向对象的语言,那么它就具有面向对象的特性,封装,继承,多态...
所谓封装 说简单一点就是把 各个方法属性模块化,但是你要模块化一些属性以及一些方法,那么你得弄清楚这些属性和方法是拿来做什么的
他们能实现什么功能,于是把他们封装起来用于实现一些现实的问题。
class Student{//当然我只是定义了学生一部分属性来形容学生
String name;//姓名
int age;//年龄
char sex;//性别
String[] grade = new String[7];//假设该生是一个学生,这就是他的成绩数组
public Student(String name,int age,char sex){
this. name = name;//这里是this关键字的第一个作用,辨别构造函数里面的形参和类的成员属性,若是同名则需用this区分当然,你可以不同名,就不需要用this了
this.age = age;//this 还有一个用处我也顺便讲了吧假设 我们学生还有个班级属性,但是这种学生只有三种属性,我们还需要重载构造方法,定义具有四种属性的构造方法的时候
就可以用this(name,age,sex)当然这行代码是出现在public Student(String name,int age,char sex,String calssStu)函数里面
this.sex = sex;
Scanner input = new Scanner(System.in);
System.out.println("请输入成绩:");
for(int i =0;i<7;i++){//手动给学生成绩数组 初始化
grade[i] = input.nextInt();
}
}
public void makeFriend(){}//当然 学生还有很多方法 我就不一一实现了 看各自的需求 实习不同的功能 (建议少一点功能,不同的功能封装到不同的类,这样便于管理)
public void showStu(){
int num ;//显示学生总成绩
System.out.println("学生姓名:"+this.name+“学生年龄:”+age+"学生性别:"+sex);
for(String item:grade)
sum = sum+ Iteger.valueof(item);
System.out.println("该生 期末考试成绩总分:"+sum);//临时打的代码 请勿直接用喔
}
}
那么我的 学生类就定义了差不多了,当然如果需要你还可以定一个班级类,用来增加学生,减少学生,查阅学生,那么成员变量就需要一个ArrayList的一个容器来装Student
这个可以和数组联系起来,数组用来装数字,这些容器拿来很方便的装对象,当然数组也是可以装对象的,只不过没有这些容器的所谓动态开辟空间的作用而已.....
class Myclass{
int class;//班级号
public ArrayList<Student> students = new ArrayList();
public Myclass(){//初始化班级 可以给容器里面初始化增加一个学生A 这里我就不掩饰了
}
}
然后我们还可以对班级这个类,再写一个服务于班级类的类,可以用于显示班级每个学生的成绩,当然在定义学生的时候我们可以利用二位数组把学科也定义进去,等一下我会给一个例子,大家看一下,这一系列的操作都是封装的概念吧,下面用一个刚刚我写的练习例子,创建一个学生类,学生类里面有三个科目,有三个科目的成绩,再创建一个班级类用来存放学生,最后再创建一个求班级学生 每个学生总成绩的类....
package Jave_Demo4_8;
import java.util.Scanner;
//学生类
public class Student {
String name;
int number;
String[][] classGrade = new String[3][2];
public Student(String name,int number){
this.name = name;
this.number = number;
Scanner input = new Scanner(System.in);
for (int i = 0; i < classGrade.length; i++) {
for (int j = 0; j < classGrade[i].length; j++) {
if(j == 0){
System.out.println("请输入学生第"+(i+1)+"科:");
classGrade[i][j] = input.next();
}else{
System.out.println("请输入学生该科成绩:");
classGrade[i][j] = input.next();
}
}
}
}
}
package Jave_Demo4_8;
import java.util.ArrayList;
import java.util.Scanner;
public class ClassStu {//班级类
ArrayList<Student> students = new ArrayList();
public ClassStu(){
Student stu = constructStudent();
students.add(stu);
}
public void addStu(){
Student stu = constructStudent();
students.add(stu);
}
public Student constructStudent(){
Scanner input = new Scanner(System.in);
System.out.println("创建一名学生!");
System.out.println("输入姓名:");
String str = input.next();
System.out.println("输入学号:");
int k = input.nextInt();
Student stu = new Student(str,k);
return stu;
}
}
package Jave_Demo4_8;
public class Grade { //求成绩类
public static void getAvergeGrade(ClassStu cs){
if(cs.students.size() == 0)
System.out.println("无学生,请加入学生!");
int k=0;
int s = cs.students.size();
while(++k <= s){
int num = 0;
for (int i = 0; i < 3; i++) {
for (int j = 1; j < 2; j++) {
num = Integer.valueOf(cs.students.get(k-1).classGrade[i][j]) +num;
}
}
System.out.println("第"+k+"个学生的总成绩是:"+num);
}
}
}
然后再去主程序,测试吧.....这应该就是所谓的封装吧
然后就是 继承,其实继承在真正的实际开发应该用得比较少,最多就有一层继承,因为继承太多影响代码的可读性,比较多的应该是抽象类的继承,还有就是接口interface的实现。好了来说说继承吧,现实生活中的继承就是儿子继承父亲的财产,等一些列可以继承的东西,程序里面也是一样的
class father{
String name;
char sex;
int age;
......等等属性
}
class son extends father{
}
儿子则是无条件全部继承过来,不过唯有私有属性(方法),我们可以这样所,他们也继承过来了,但是子类无法享受,或者说子类是除了私有变量(方法)以外的所有变量方法全部继承,因此在构造子类对象的时候系统会自动构造一个父类对象,然后在调用子类的构造函数,构造子类为子类增加上自己独有的属性和方法.....但就是增加着一些列的子类独有属性和方法容易出岔子.第一,一旦父类重写了构造函数,子类中就必须重写构造函数,你可以看成构造函数无法继承,你自己不写就没有构造函数,导致没法构建对象。第二,子类中可以调用父类的已有有参构造函数super(a,b,c)这样调用,这是super的一个用处,第三,如果父类已经定义的一个属性,子类再去重新定义,并且赋予不同的值,那么父类的属性就被隐藏,只有用super.属性名可以调用它,隐藏和属性的修饰名无关....若是静态方法那么 出现子类中也有同名静态方法,那么也是隐藏哈,这是隐藏的两种情况。接下来就是成员方法的重名 但不是以前说的重载,当然重载也可以在子类中用,因为父类那边把函数都继承过来了,这里就只讨论覆盖,出现函数覆盖那么我们在子类中想用父类的同名方法就只能用super.方法名来调用,其实这里的super,this你在实际操作中还是this用的比较多对于目前来说哈,要理解也需要在实际中掌握。
最后就是多态,我觉得多态就是一个对象有多种状态嘛,比如一个父亲他可以是一个老师,也本就是一个人,等等他就扮演了很多角色这也都是继承的成果,还有就是
有一个这种用法,
Son s = new Son();
Father f = s; 用儿子给父亲赋值,肯定嘛,儿子无条件的接受了父亲的一切,当父亲需要你献血的时候,你的血液是能无条件和你父亲匹配的 ....just an example
下周见..........