luogg_java学习_06_面向对象特性之封装和继承
这篇博客总结了1天,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用.
**转载请注明 出自 : luogg的博客园 ** ,
因为前不久偶然发现某网站直接复制粘贴我的博客,交谈之后他们修改了出处.
封装
一, 封装的概念
- 类可以看成一个封装体,将对象的属性和方法封装到类中.
- 把不希望外界看到或调用的属性或方法用private 关键字修饰, 然后在属性或方法的类中创建一个可以间接让外部使用属性或方法的通道.
二, 封装的实现
- 通常将类中的成员变量私有化 (private) ,那么再通过这个类创建对象后就不能访问该类的变量 , 通过对外提供方法(setXxx,getXxx),可对该变量(xxx)进行访问。
- boolean 类型的变量没有 getXX,只有 isXX;
- IDE中可以右键source 快捷的设置变量的seter和geter方法
- get方法有返回值和return
- set方法无返回值,担有形参
public int getAge() {
System.out.println(name + "的年龄是 : " + age);
return age;
}
public void setAge(int age) {
this.age = age;
}
三, this关键字的作用
1. 表示本类中的(age)属性
this.age = age;
2. this([实参]); 表示在构造方法中调用构造方法. 应写在构造方法中的第一行, 不然会报错,构造方法中只能使用一次.
// 设置构造函数
public Person() {
System.out.println("这是有0个参数的构造方法");
}
public Person(String name) {
this.name = name;
System.out.println("这是有一个参数的构造方法");
}
public Person(String name , int age , char sex) {
this("张三");
System.out.println("这是有3个参数的构造方法");
}
=================
public class PersonTest {
public static void main(String[] args) {
Person p1 = new Person("",10,'男');
}
}
执行之后:
3. this表示当前对象
// this 的第三种用法:表示当前对象
====ThisPerson类=====
public void run() {
System.out.println("runing....");
System.out.println(this);
}
======主类======
ThisPerson p3 = new ThisPerson();
p3.run();
System.out.println(p3 + "\n");
执行结果:
四, 构造方法 :
创建类的对象并初始化,具体方法day04写了.
五, 类的设计分析
根据要求写出类所包含的字段;
所有的字段(属性)都必须私有化;
封装之后的字段可通过 setter 和 getter 设值和取得;
按需求可添加若干构造方法;
根据需求可添加相应的方法;
类中的所有方法都不要直接处理(输出打印),而是交给调用者去处理。
六, static(静态) 关键字的使用
- static修饰的属性或方法称为静态属性或者静态方法.
- 一旦属性或方法被static修饰,可以直接通过类名.方法()或者类名.属性调用.
- 被static修饰的方法, 程序运行后不管用不用得到都会进入内存中的静态区.
- 随着类的加载而加载, 优先于对象存在 , 被所有对象所共享 , 可以直接被类名调用
- 静态方法只能访问静态成员, 非静态方法可以访问静态方法.
- 静态方法中不可以使用this,super关键字
=====StaticPerson类中定义静态属性========
public class StaticPerson {
static String name;
int age;
char sex;
}
======主类====
public class TestStatic {
public static void main(String[] args) {
StaticPerson.name = "张三";
System.out.println(StaticPerson.name);
fun();
}
public static void fun() {
System.out.println("run..");
StaticPerson.name = "张三";
System.out.println(StaticPerson.name);
}
}
输出结果:
====================================
继承
一, 继承概念及优点
子类扩展其父类的功能,达到类的重用,降低开发成本
优点:
1、提高了代码的复用性。
2、让类与类之间产生关系,有了这个继承关系才有了多态的特性。
3、Java 语言中只支持单继承(有别于 C 语言)。因为多继承容易带来安全隐患(父类多了, 功能相同的话,就会出现调用不确定性,覆写一个方法,到底覆写的谁的?),但是java支持多层继承,即祖孙关系,祖先关系
二, 继承的实现
父类:超类,基类
子类:派生类
格式:
访问修饰符 class 子类名 extends 父类名(){}
三, 继承的限制
- 在java中只允许单继承
- 子类不能继承父类的私有成员
- 父类的构造方法也不可以继承
四, 子类对象实例化过程
1、先实例化父类构造方法为父类中的属性初始化
2、再实例化子类构造方法
实质:在子类的构造方法中隐藏了一个 super()方法,调用父类中的构造方法
=======父类======
public class Person1 {
int age = fun();
public Person1() {
System.out.println("父类的构造方法被调用了");
}
public int fun() {
System.out.println("父类属性方法被执行了");
return 0;
}
}
============子类===============
public class Person1Test extends Person1 {
int age = info();
public Person1Test() {
//super();隐藏了,它默认先调用父类的构造方法
System.out.println("子类的构造方法被执行");
}
public int info() {
System.out.println("子类的属性被执行");
return 0;
}
}
=============主函数============
public static void main(String[] args) {
Person1Test p1 = new Person1Test();
}
===输出结果=
五, super关键字的使用
1, 调用父类中的构造方法 super([参数]);
2, 调用父类中的普通方法 super.普通方法();
3, 调用父类中的属性 super.属性;
======父类Person类======
public Person() {
System.out.println("父类无参构造方法被调用");
}
public Person(String name) {
System.out.println("父类一个参数的构造方法被调用");
}
public String fun() {
System.out.println("父类中的属性被初始化了");
return name;
=========子类Student类========
public void run(int id) {
super.fun();
System.out.println("子类的属性被初始化");
}
public Student() {
super("张三");
System.out.println("子类构造方法被调用");
}
===========主函数===========
public static void main(String[] args) {
Student s1 = new Student();
s1.id = 10;
System.out.println(s1.id);
}
输出结果:
六,包及访问权限
包的使用:import 包名.子包名.* 或 import 包名.子包名.类
访问修饰符:
七, 方法的重写
当父类的某个方法不适合于子类本身的特征行为时就当覆写父类中应当改变的方法。
方法覆写时应遵循的原则(一同两小一大):
(一同):方法签名必须相同;
(两小):
子类方法的返回值类型比父类方法的返回值类型更小或相等
子类方法声明抛出的异常应比父类方法申明抛出的异常更小或相等;
(一大):子类方法的访问权限应比父类方法更大或相等;
实现规则:
(1)在子类中定义了与父类中同名的方法;
(2)方法名称、参数类型、返回值类型、全部相同
(3)并且子类中的的同名方法的访问权限不用比父类中的同名方法更严格 private访问修饰符 权限最低,最严谨
====父类====
public class Person {
public void run() {
System.out.println("父类正在跑步...");
}
}
====子类===
public class Student {
public void run() {
System.out.println("子类正在跑步!!!");
}
}
====主函数====
public static void main(String[] args) {
Student s = new Student();
s.run();
}
输出结果 : 子类正在跑步!!!
八, final 关键字的使用
作用:
(1)声明类:声明类的时候表示该类不能再被继承
(2)声明方法:声明方法的时候表示该方法不能在被子类被覆写
(3)声明变量:声明变量的时候表示该变量变成常量(常量:一旦赋值之后,里面的值不能再变)
九, 难点
重写和重载的区别
super关键字和this关键字的区别
十,语句块
普通块
写在方法里面的 (方法, if语句 switch等等)
{}
构造块
写在类里边 {}
静态块
写在类里边 static{}
执行的先后顺序 :
静态快先被执行
构造块之后被执行
构造方法最后被执行
静态块只在创建对象时候执行一次,不管创建多少个对象,只执行一次
luogg_java学习_06_面向对象特性之封装和继承的更多相关文章
- Javascript面向对象特性实现封装、继承、接口详细案例——进级高手篇
Javascript面向对象特性实现(封装.继承.接口) Javascript作为弱类型语言,和Java.php等服务端脚本语言相比,拥有极强的灵活性.对于小型的web需求,在编写javascript ...
- Javascript面向对象特性实现封装、继承、接口详细案例
Javascript面向对象特性实现(封装.继承.接口) Javascript作为弱类型语言,和Java.php等服务端脚本语言相比,拥有极强的灵活性.对于小型的web需求,在编写javascript ...
- Java语言中的面向对象特性:封装、继承、多态,面向对象的基本思想(总结得不错)
Java语言中的面向对象特性(总结得不错) [课前思考] 1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类? 2. 面向对象编程的特性有哪三个?它们各自又有哪些特性? 3. 你知道jav ...
- (转载)OC学习篇之---类的三大特性:封装,继承,多态
之前的一片文章介绍了OC中类的初始化方法和点语法的使用,今天来继续学习OC中的类的三大特性,我们在学习Java的时候都知道,类有三大特性:继承,封装,多态,这个也是介绍类的时候,必须提到的话题,那么今 ...
- 黑马程序猿——JAVA面向对象的特性:封装,继承,多态
- ----------android培训.java培训.java学习型技术博客.期待与您交流!------------ ...
- PHP其它常用函数;<<<面向对象(OPP)的三大特性:封装、继承、加态:>>> <----面试题 ;构造方法、析构方法,魔术方法、set、get方法;静态;抽象类;接口
PHP其它常用函数: 赋值:$r->name = "元素"; 取值: echo $r->name; count() 计算数组中的元素数目或对象中 ...
- .NET面向对象特性之封装
.NET面向对象特性之封装 面向对象的基本内容由:类.对象.属性.方法.字段构成. 面向对象的三大特性:继承.多态.封装. 关于面向对象的特性很多人都把目光转向了继承.多态和接口,却很少有人提及过封装 ...
- Python 面向对象的三大特性:封装,继承,多态
# 面向对象的三大特性:封装,继承,多态 # 继承的影响:资源的继承,资源的使用,资源的覆盖,资源的累加 # 资源的继承,在Python中的继承是指能使用父类的资源,而不是说在子类也复制一份父类代码到 ...
- java三大特性(封装、继承、多态)
oop(面向对象程序设计)具有三大特性:封装.继承.多态 一.封装 封装就是讲类的信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类的实现隐藏信息的操作和访问. 实现封装 1.需要修改属性的访问 ...
随机推荐
- IOS SWIFT 启动流程学习
其实和我们java.c一样通过一个main函数作为入口. main封装在了UIApplicationMain里面.所以后者变成启动入口. 他会扫描Info.plist,找到需要加载的入口storybo ...
- 如何在 ASP.NET MVC 中集成 AngularJS(2)
在如何在 ASP.NET MVC 中集成 AngularJS(1)中,我们介绍了 ASP.NET MVC 捆绑和压缩.应用程序版本自动刷新和工程构建等内容. 下面介绍如何在 ASP.NET MVC 中 ...
- 【Paddy】数据库监控系列(一) - 监控理念
很多时候,都和身边朋友聊两个问题,DBA的日常工作都是哪些?什么才是数据库方面最重要的? 我相信这两个问题的答案每个人都不会完全一样,我也是,所以这里只代表我的个人观点,并且以下的内容将围绕我的思路展 ...
- Module-Zero之发布说明
返回<Module Zero学习目录> ABP v0.7.6.0 创建组织单元系统. 升级了nuget包. 小修复和改进. 注意: AbpUserManager的构造函数更新了.添加了组织 ...
- Servlet程序中玩验证码
验证码思想:所谓验证码就是产生若干随机数,存放到session中,然后在servlet中获取session中的该值与页面输入值相比较,进而判断正误. 产生验证码的方法: 随机数放在图片中,封装为一 ...
- ATM模拟器(附代码及运行结果)
源代码: import java.util.Scanner; class Account{ String identify; String name; String date; String key; ...
- easyuidatagrid中load,reload,loadData的区别
摘要:datagrid中有load,reload,loadData那三个方式,皆是加载数据的,但又有差别.下面让我们一起来看看: 首先,load方法,比如我已经定义一个datagrid的id为grid ...
- WPF自定义控件与样式(1)-矢量字体图标(iconfont)
一.图标字体 图标字体在网页开发上运用非常广泛,具体可以网络搜索了解,网页上的运用有很多例子,如Bootstrap.但在C/S程序中使用还不多,字体图标其实就是把矢量图形打包到字体文件里,就像使用一般 ...
- WPF Excel导出加个手动修改地址
http://blog.csdn.net/sanjiawan/article/details/6818921 以上是CSDN上的WPF Excel导入导出,我看到有人提问怎么能够手动选择地址,正好用到 ...
- Python标准模块--collections
1.模块简介 collections包含了一些特殊的容器,针对Python内置的容器,例如list.dict.set和tuple,提供了另一种选择: namedtuple,可以创建包含名称的tuple ...