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.需要修改属性的访问 ...
随机推荐
- SQL Server 事务日志传输
概述 可以使用日志传送将事务日志不间断地从一个数据库(主数据库)发送到另一个数据库(辅助数据库).不间断地备份主数据库中的事务日志,然后将它们复制并还原到辅助数据库,这将使辅助数据库与主数据库基本保持 ...
- Eclipse启动参数
from 网络 eclipse 启动参数 -clean2013-- : eclipse 启动参数介绍(如添加插件时,如果不显示,则使用eclipse -clean启动) 其实,Eclipse是一个可以 ...
- 2013 duilib入门简明教程 -- 自绘标题栏(5)
如果大家有做过标题栏的自绘,肯定会感慨各种不容易,并且现有的一些资料虽然完美的实现了功能,但是代码比较乱,需要自行整理.如果用duilib,就是小case啦. duilib其实并没有区 ...
- 解读sencha touch移动框架的核心架构(一)
sencha的前身就是Extjs了,sencha 框架是世界上第一个基于HTML5的Mobile App框架 那么何谓框架,传统软件工程对于库和框架的区分主要着眼于对应用运行流程的控制权,框架提供架构 ...
- C指针(一)
原文链接:http://www.orlion.ga/916/ 一.指针的基本操作 例: int i; int *pi = &i; char c; char *pc = &c; &quo ...
- 【原创】开源Math.NET基础数学类库使用(15)C#计算矩阵行列式
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 上个月 ...
- iOS开发之使用CocoaPods更新第三方出现“target overrides the `OTHER_LDFLAGS`……”问题解决方案
今天在自己的项目中用CocoaPods引入第三方SDWebImage的时候,出现了问题.当更新完毕后,在终端没太注意这个问题的提示,就直接使用SDWebImage了,在使用的时候一些方法的提示和头文件 ...
- linux自定义系统调用
1 Linux3.10.21内核系统调用设置 以前看的内核版本时2.6.11的,里面的系统调用设置一目了然啊!在文件entry.S中直接定义了sys_call_table表,并在这个文件中用各个系统调 ...
- c# 枚举
命名空间: System程序集: mscorlib(mscorlib.dll 中) 定义一个枚举类型 public enum Week { [Description("星期一" ...
- 如何在ios中集成微信登录功能
在ios中集成微信的登录功能有两种方法 1 用微信原生的api来做,这样做的好处就是轻量级,程序负重小,在Build Settings 中这样设置 然后设置 友盟的设置同上,但是要注意,加入你需要的所 ...