黑马程序员---基础-概述、封装、构造方法、this和static关键字、继承
2015-06-15 01:13
429 查看
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
一、面向对象概述
1.类实质上就是封装对象属性和行为的载体,类是同一类事物的统称。
2.对象是类抽象出来的一个实例(万物皆对象),该类是事物实实在在的个体。
3.面向对象的三大特点:①封装;②继承;③多态。
(1)面向对象的特点:
1.是一种更符合我们思想习惯的思想
2.可以将复杂的事情简单化
3.将我们从执行者变成了指挥者,角色发生了转换
我们在解决问题的时候,就是找对象,如果没有对象,就创造对象去解决方法。
我们描述小汽车的时候,有轮胎数、颜色,这些是事物的属性;还有汽车的运行,这些是事物的行为。我们在定义类的时候,就是定义类中的成员,其中成员变量对应着事物的属相,成员方法对应着事物的行为。
如我们可以定义一个Car类就可以这样:
(2)成员变量和局部变量的区别
主要是四个方面的区别:
A:在类中的位置不同
成员变量:在类中方法外
局部变量:在方法定义中或者方法声明上
B:在内存中的位置不同
成员变量:在堆内存
局部变量:在栈内存
C:生命周期不同
成员变量:随着对象的创建而存在,随着对象的消失而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
D:初始化值不同
成员变量:有默认初始化值
局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。
下面举个例子:
程序执行的结果是:
二、封装
封装的引入就是为了隐藏实现细节,保证一些数据的安全。仅对外提供公共的方法对其访问。
(1)封装的好处
①隐藏实现细节,提供公共的访问方式
②提高了代码的复用性
③提高安全性。
(2)具体的实现
程序执行的结果是:
三、this关键字
我们之前说过: 起名字要做到”见名知意”,我们在方法中使用参数赋值的时候就可以使用this关键字来代表本类对象的引用。也就是说谁调用方法,这个方法中的this代表的就是谁。
下面是具体的代码实现:
程序执行的结果是:
四、构造方法
构造方法就是创建对象,给对象中的成员进行初始化用的。
※构造方法的格式特点
a:方法名与类名相同
b:没有返回值类型,连void都没有
c:没有具体的返回值
下面举个例子可以看看:
程序执行的结果是:
看过上面的例子后,我们还需要注意两个事项:
1.如果我们没有给出构造方法,系统将自动提供一个无参构造方法。
2.如果我们给出了构造方法,系统将不再提供默认的无参构造方法。
注意:这个时候,如果我们还想使用无参构造方法,就必须自己给出。建议永远自己给出无参构造方法
五、static关键字
这里先讲讲static关键字的特点
1.随着类的加载而加载
2.优先于对象存在
3.被类的所有对象共享。举例:咱们班级的学生应该共用同一个班级编号。其实这个特点也是在告诉我们什么时候使用静态?如果某个成员变量是被所有对象共享的,那么它就应该定义为静态的。
4.可以通过类名调用,其实它本身也可以通过对象名调用。推荐使用类名调用。静态修饰的内容一般我们称其为:与类相关的,类成员
程序:
执行的结果是:
六、继承
继承使用extends关键字,它的好处是:
1.提高了代码的复用性;
2.让类与类之间产生了关系,给第三个特征多态提供了前提;
3.提高了代码的维护性;
(1)引出
继承其它类的类叫”子类”,被继承的类叫”父类”、”超类”、”基类”,当子类继承了父类后,就自动拥有了父类中允许被继承的成员;大家可以近似的认为:子类就是拥有了父类中的可以被继承的成员。
如下程序所示:
结果是:
在java中只支持单继承,不支持多继承的,但可以支持多层继承。
(2)继承的注意事项
1.子类不能继承父类中私有成员:
2.构造方法是不能被继承的;
3.当实例化一个子类对象时,会调用父类的构造方法,实例化一个父类对象;这个父类对象,是存储在子类对象空间内的。
4.不要为了部分功能而去继承:
5.当类和类之间是:是一个(is a)的关系时,使用继承,学员是传智播客的一员,教师是传智播客的一员,所以,Student可以继承自Person,Teacher也可以继承自Person
代码:
运行的结果是:
(3)继承中成员变量的关系
1.首先在子类局部范围找
2.然后在子类成员范围找
3.最后在父类成员范围找(肯定不能访问到父类局部范围)
4.如果还是没有就报错。(不考虑父亲的父亲…)
结果是:
一、面向对象概述
1.类实质上就是封装对象属性和行为的载体,类是同一类事物的统称。
2.对象是类抽象出来的一个实例(万物皆对象),该类是事物实实在在的个体。
3.面向对象的三大特点:①封装;②继承;③多态。
(1)面向对象的特点:
1.是一种更符合我们思想习惯的思想
2.可以将复杂的事情简单化
3.将我们从执行者变成了指挥者,角色发生了转换
我们在解决问题的时候,就是找对象,如果没有对象,就创造对象去解决方法。
我们描述小汽车的时候,有轮胎数、颜色,这些是事物的属性;还有汽车的运行,这些是事物的行为。我们在定义类的时候,就是定义类中的成员,其中成员变量对应着事物的属相,成员方法对应着事物的行为。
如我们可以定义一个Car类就可以这样:
class Car{ int num;//车的轮胎数 String color;//车的颜色 void run(){ System.out.println(num+"..."+color); } }
(2)成员变量和局部变量的区别
主要是四个方面的区别:
A:在类中的位置不同
成员变量:在类中方法外
局部变量:在方法定义中或者方法声明上
B:在内存中的位置不同
成员变量:在堆内存
局部变量:在栈内存
C:生命周期不同
成员变量:随着对象的创建而存在,随着对象的消失而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
D:初始化值不同
成员变量:有默认初始化值
局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。
下面举个例子:
// 基本类 class Variable { int num = 40; public void show(){ // 错误的: 可能尚未初始化变量num2 // int num2 ; /* int num2 = 20; System.out.println(num2); */ // int num = 30 ; System.out.println(num); } } // 测试类 class VariableDemo { public static void main(String[] args){ // 创建对象 Variable v = new Variable(); // System.out.println(v.num); // 调用show方法 v.show(); } }
程序执行的结果是:
二、封装
封装的引入就是为了隐藏实现细节,保证一些数据的安全。仅对外提供公共的方法对其访问。
(1)封装的好处
①隐藏实现细节,提供公共的访问方式
②提高了代码的复用性
③提高安全性。
(2)具体的实现
// 学生类 class Student { // 成员变量 String name ;// 姓名 private int age ;// 年龄 // 定义一个方法来给age赋值 public void setAge(int a){ // -18 if(a < 0 || a > 120){ System.out.println("你输入的年龄不正确"); }else{ age = a ; } } // 成员方法 public void show(){ System.out.println(name); System.out.println(age); } } // 测试类 class StudentDemo { public static void main(String[] args){ // 创建学生对象 Student s = new Student(); // 给成员变量赋值 s.name = "小红"; // s.age = 18 ; s.setAge(18); // 调用show方法输出所有的成员变量 s.show(); System.out.println("--------------------"); // 创建学生对象 Student s1 = new Student(); // 给成员变量赋值 s1.name = "小花"; // s1.age = -18; s1.setAge(-18); // 调用show方法输出所有的成员变量 s1.show(); } }
程序执行的结果是:
三、this关键字
我们之前说过: 起名字要做到”见名知意”,我们在方法中使用参数赋值的时候就可以使用this关键字来代表本类对象的引用。也就是说谁调用方法,这个方法中的this代表的就是谁。
下面是具体的代码实现:
// 定义一个学生类 class Student { // 成员变量 private String name ; // 姓名 private int age ; // 年龄 // 提供对应的get和set方法 public String getName(){ // return name ; // 存在一个隐含的this return this.name ; } public void setName(String name){ // 我们变量的访问遵循一个"就近原则" // 我们需要的是将传递进来的name赋值给成员变量的name // name = name ; // 我们要访问成员变量需要使用对象对其访问,那么谁又可以代表当前类的一个对象呢? // 这时候java就给我们提供了一个关键字: this this.name = name ; } public int getAge(){ return age ; } public void setAge(int age){ this.age = age ; } } // 测试类 class StudentDemo { public static void main(String[] args){ // 创建学生对象 Student s = new Student(); // 给成员变量赋值 s.setName("小菲菲"); s.setAge(13); // 输出所有的成员变量 System.out.println(s.getName() + "---" + s.getAge()); // 创建学生对象 Student s1 = new Student(); // 给成员变量赋值 s1.setName("大菲菲"); s1.setAge(18); // 输出所有的成员变量 System.out.println(s1.getName() + "---" + s1.getAge()); } }
程序执行的结果是:
四、构造方法
构造方法就是创建对象,给对象中的成员进行初始化用的。
※构造方法的格式特点
a:方法名与类名相同
b:没有返回值类型,连void都没有
c:没有具体的返回值
下面举个例子可以看看:
// 手机类 class Phone { // 成员变量 private String brand ; // 品牌 private String color ; // 颜色 private int price ; // 价格 // 构造方法 public Phone(){} public Phone(String brand , String color , int price){ this.brand = brand ; this.color = color ; this.price = price ; } // 提供get和set方法 public String getBrand(){ return brand ; } public void setBrand(String brand){ this.brand = brand ; } public String getColor(){ return color ; } public void setColor(String color){ this.color = color ; } public int getPrice(){ return price ; } public void setPrice(int price){ this.price = price ; } } // 测试类 class PhoneDemo { public static void main(String[] args){ // 创建手机对象方式1 Phone p = new Phone(); // 给成员变量赋值 p.setBrand("苹果"); p.setColor("白色"); p.setPrice(100); // 获取成员变量 System.out.println(p.getBrand() + "---" + p.getColor() + "---" + p.getPrice()); System.out.println("----------------------------------"); // 创建手机对象方式2 Phone p2 = new Phone("三星" , "黑色" , 50); // 获取成员变量 System.out.println(p2.getBrand() + "---" + p2.getColor() + "---" + p2.getPrice()); } }
程序执行的结果是:
看过上面的例子后,我们还需要注意两个事项:
1.如果我们没有给出构造方法,系统将自动提供一个无参构造方法。
2.如果我们给出了构造方法,系统将不再提供默认的无参构造方法。
注意:这个时候,如果我们还想使用无参构造方法,就必须自己给出。建议永远自己给出无参构造方法
五、static关键字
这里先讲讲static关键字的特点
1.随着类的加载而加载
2.优先于对象存在
3.被类的所有对象共享。举例:咱们班级的学生应该共用同一个班级编号。其实这个特点也是在告诉我们什么时候使用静态?如果某个成员变量是被所有对象共享的,那么它就应该定义为静态的。
4.可以通过类名调用,其实它本身也可以通过对象名调用。推荐使用类名调用。静态修饰的内容一般我们称其为:与类相关的,类成员
程序:
// 人类 class Person { // 成员变量 String name ; // 姓名 // String country ; // 国籍 static String country ; public void show(){ System.out.println(name + "---" + country); } } // 测试类 class PersonDemo { public static void main(String[] args){ // 创建一个对象 Person p = new Person(); // 给成员变量赋值 p.name = "凤姐"; p.country = "中国"; // 调用show方法 p.show(); // 创建第二个对象 Person p2 = new Person(); //给成员变量赋值 p2.name = "刘亦菲"; // p2.country = "中国"; // 调用show方法 p2.show(); System.out.println("-----------------------"); p.country = "美国"; p.show(); p2.show(); } }
执行的结果是:
六、继承
继承使用extends关键字,它的好处是:
1.提高了代码的复用性;
2.让类与类之间产生了关系,给第三个特征多态提供了前提;
3.提高了代码的维护性;
(1)引出
继承其它类的类叫”子类”,被继承的类叫”父类”、”超类”、”基类”,当子类继承了父类后,就自动拥有了父类中允许被继承的成员;大家可以近似的认为:子类就是拥有了父类中的可以被继承的成员。
如下程序所示:
class Person { String name;//姓名 int age;//年龄 char sex;//性别 void show(){ System.out.println("我是传智播客的一员,我骄傲!!"); } } //Person的"子类" class Student extends Person { String stuNo;//学员编号 int score;//分数; } //Person的"子类" class Teacher extends Person { String teaNo;//教师编号 } //当再需要"员工类"时,也需要这些成员时,可以直接继承自"Person" class Employee extends Person { //自动拥有了Person的三个属性和一个方法; } class Demo { public static void main(String[] args) { Student stu = new Student(); System.out.println(stu.name);//继承的 System.out.println(stu.age);//继承的 System.out.println(stu.sex);//继承的 System.out.println(stu.stuNo);//自己的 stu.show(); Teacher tea = new Teacher(); System.out.println(tea.name);//继承的 System.out.println(tea.age);//继承的 System.out.println(tea.sex);//继承的 System.out.println(tea.teaNo);//自己的 tea.show(); } }
结果是:
在java中只支持单继承,不支持多继承的,但可以支持多层继承。
(2)继承的注意事项
1.子类不能继承父类中私有成员:
2.构造方法是不能被继承的;
3.当实例化一个子类对象时,会调用父类的构造方法,实例化一个父类对象;这个父类对象,是存储在子类对象空间内的。
4.不要为了部分功能而去继承:
5.当类和类之间是:是一个(is a)的关系时,使用继承,学员是传智播客的一员,教师是传智播客的一员,所以,Student可以继承自Person,Teacher也可以继承自Person
代码:
class A { String name; private int age;//此成员不会被子类继承 private void show(){//此方法不会被子类继承 System.out.println("private的show()"); } void show2(){ System.out.println("非私有的show2()"); } A(){ System.out.println("A的构造方法"); } } class B extends A { B(){ System.out.println("B的构造方法"); } } class Demo { public static void main(String[] args) { B b = new B(); // System.out.println(b.name);//OK的,name可以被继承 // System.out.println(b.age);//NO的,编译错误,age私有的,不能被继承 // b.show();///NO的,编译错误,show私有的,不能被继承 // b.show2();//OK的,show2可以被继承 B b2 = new B(); } }
运行的结果是:
(3)继承中成员变量的关系
1.首先在子类局部范围找
2.然后在子类成员范围找
3.最后在父类成员范围找(肯定不能访问到父类局部范围)
4.如果还是没有就报错。(不考虑父亲的父亲…)
class A { int num = 10; } class B extends A { int a = 20; int num = 30;//子类成员变量,覆盖父类的成员变量; void show(){ //就近原则; int num = 40;//局部变量,覆盖成员变量 System.out.println("num = " + num);//40 注意:先找局部,再找成员,再找父类; System.out.println("this.num = " + this.num);//30,注意:如果本类没有,会向父类去找; System.out.println("super.num = " + super.num);//访问父类的num : 10 } } class Demo { public static void main(String[] args) { B b = new B(); //在外部访问B中的成员变量 /* System.out.println(b.num); System.out.println(b.a); */ b.show(); } }
结果是:
相关文章推荐
- 黑马程序员-Java基础--类型转换、标识符、位运算符
- 黑马程序员--Java基础Day09
- IT 电影
- 程序员必备
- 黑马程序员--------8种基本数据类型的封装类
- 一天还是程序员,就别说自己都懂了
- 黑马程序员-------io流总结
- 黑马程序员---2015.6.14java基础笔记--静态方法--单例
- 黑马程序员---2015.6.14java基础笔记--静态方--静态代码块--单例模式
- 黑马程序员------TreeSet的自然排序与比较器
- 黑马程序员——java概述及基本语法(一)
- 黑马程序员<Java笔记<IO流>>
- 黑马程序员——Java基础——多线程的同步、死锁和等待唤醒机制
- 程序员自学/自我培训指南
- 黑马程序员---Java基础-String类
- 人,绩效与职业道德读后感
- 伪文艺装逼码农觉得不错的歌
- 职场
- 一个程序员的创业(爱情)故事
- 黑马程序员——JAVA集合