文档章节

Java OOP

jit-hakase
 jit-hakase
发布于 2017/08/31 22:26
字数 1928
阅读 20
收藏 1
点赞 0
评论 0

Java OOP

封装

构造方法

  1. 构造方法名必须和类名一致
  2. 如果没有自定义构造方法, 会默认定义空构造方法.

对象的创建使用new操作符(可传参数) 在对象创建时会执行的方法称为构造方法

class Init {
	
	public Init() {
		System.out.println("init...");
	}
}

public class Main {
	
	public static void main(String[] args) {
		
		Init init = new Init();
	}
}

访问控制修饰符

访问控制符用来限制对, , 方法的访问.

  1. 默认权限: default, 在同一个包内可见, 可不使用任何修饰符.
  2. 私有权限: private, 在同一个类内可见.
  3. 公有权限: public, 对所有类可见.
  4. 受保护权限: protected, 对同一个包内的类和所有子类可见.

因为Value对象的value修饰符是private 所以只能使用public修饰的getValue方法来获取它的值

class Value {
	
	private int value;
	
	public Value(int newValue) {
		value = newValue;
	}
	public int getValue() { return value; }
	public void setValue(int newValue) { value = newValue; }
}

public class Main {
	
	public static void main(String[] args) {
		
		Value value = new Value(5);
		System.out.println(value.getValue());
	}
}

static

static关键字表示不依赖类实例存在的事物, 有以下两种用途.

  1. 修饰方法, 变为不依赖类实例方法.
  2. 修饰成员变量, 变为不依赖类实例静态变量.

static变量方法是与类绑定的并且只有一份, 不需要初始化实例对象.

还可以在static块中编写语句, 这些语句在加载的时候执行.

class Value {
	
	private static int VALUE;
	
	static {
		VALUE = 10;
	}
	
	public static int getValue() {
		return VALUE;
	}
}

public class Main {
	
	public static void main(String[] args) {
		
		int value = Value.getValue();
		System.out.println(value);
	}
}

final

final关键字表示事物的最终形态, 不需要再修改, 有以下三种用途.

  1. 修饰, 让不能被继承.
  2. 修饰方法, 让子类无法重写方法, 但可以被继承.
  3. 修饰变量, 表示常量, 只能被赋值一次, 之后不能改变值.

final类中的方法和所有类中的private方法默认为final类型

public class Main {
	
	public static void main(String[] args) {
		
		final int value = 3;
		//value = 5; ERROR !!
		
		System.out.println(value);
	}
}

this

this关键字表示当前对象, 有以下两种用途.

  1. 调用当前构造方法
  2. 显式使用当前中的方法

使用this关键字调用当前构造方法, 必须是构造方法内的第一条语句, 显示使用当前中的可以防止参数名与名的冲突.

使用this关键字简化访问修饰符的例子

class Value {
	
	private int value;
	
	public Value(int value) {
		this.value = value;
	}
	public int getValue() { return value; }
	public void setValue(int value) { this.value = value; }
}

public class Main {
	
	public static void main(String[] args) {
		
		Value value = new Value(5);
		System.out.println(value.getValue());
	}
}

重载(Overload)

根据不同的参数类型或数量, 可以定义和调用同名但方法体不同的方法.

  1. 最常用的就是构造方法重载
  2. 无法以返回值类型作为重载方法的区分标准

使用不同的参数类型来调用方法体不同的add方法

class Calc {
	
	public int add(int numOne, int numTwo) {
		return numOne + numTwo;
	}
	public String add(String numOne, String numTwo) {
		return numOne + numTwo;
	}
}

public class Main {
	
	public static void main(String[] args) {
		
		Calc calc = new Calc();
		
		int value = calc.add(5, 2);
		System.out.println(value);
		
		String str = calc.add("hello ", "java");
		System.out.println(str);
	}
}

声明包

声明文件所属包, 必须在源文件第一行进行声明. package PKG_NAME;

导入包

包的组织结构与目录结构相同, 用.分隔 import PKG_NAME.CLASS 导入包中特定类 import PKG_NAME.* 导入包中所有类

继承

super

super关键字表示父类对象, 有以下三种用途.

  1. 调用父类构造方法
  2. 调用父类方法(当子类****重写父类方法时)
  3. 访问父类(不推荐)

父类构造方法不会被子类继承, 调用父类构造方法的唯一途径是使用super关键字(必须是子类构造方法的第一条语句), 如果子类构造方法中没有显式调用父类构造方法, 则编译器自动将super();作为子类构造方法的第一条语句.

静态方法中不能使用super关键字

class Parent {
	
	public Parent() {
		System.out.println("parent init...(void)");
	}
	
	public Parent(int value) {
		System.out.println("parent init...(int)");
	}
	
	public void func() {
		System.out.println("parent func...");
	}
}

class Child extends Parent {
	
	public Child() {
		System.out.println("child init...(void)");
	}
	
	public Child(int value) {
		super(value);
		System.out.println("child init...(int)");
	}
	
	public void childFunc() {
		super.func();
	}
}

public class Main {
	
	public static void main(String[] args) {
		
		Child childOne = new Child();
		Child childTwo = new Child(5);
		
		childOne.childFunc();
		childTwo.childFunc();
	}
}

继承(extends)

子类继承父类的非private方法, 只能继承一个父类. 调用继承下来的方法时, 只有一份拷贝(父类子类共享).

class Parent {
	
	public int value = 5;
	
	public void func() {
		System.out.println("parent func...");
	}
}

class Child extends Parent {
	
	private void printValue() {
		System.out.println(this.value);
		System.out.println(super.value);
	}
	
	public void testValue() {
		printValue();
		value = 10;
		printValue();
	}
}

public class Main {
	
	public static void main(String[] args) {
		
		Child child = new Child();
		child.testValue();
	}
}

重写(Override)

子类方法父类不同 重写时可使用@Override注解标识 重写之后方法各自独立, 重写规则如下.

  1. 参数列表和返回类型必须完全与被重写方法相同
  2. 访问权限不能比父类中被重写的方法更低
  3. 可以减少或删除, 但不能抛出新的或更广的异常.
  4. final方法, 构造方法不能被重写.
  5. static方法不能被重写, 但能够被再次声明.

不能被重写, 所以也不具有多态性.

调用方法的依据是对象的类型, 所以即便在父类构造方法中也会调用子类方法(this指向的是子类对象).

class Parent {
	
	public Parent() {
		this.func();
	}
	
	public void func() {
		System.out.println("parent func...");
	}
}

class Child extends Parent {
	
	@Override
	public void func() {
		System.out.println("child func...");
	}
}

public class Main {
	
	public static void main(String[] args) {
		
		Child child = new Child();
		child.func();
	}
}

抽象类(abstract)

  1. 抽象类不能被实例化
  2. 抽象方法没有方法体
  3. 抽象方法必须被非抽象类子类重写
  4. 包含抽象方法必须是抽象类
  5. 子类也是抽象类, 则它的抽象方法不能与父类抽象方法同名.

abstract不能与final同时修饰同一个. abstract不能与private, static, finalnative修饰同一个方法.

abstract class Figure {
	
	public abstract void live();
	
	public void func() {
		System.out.println("this is abstract class...");
	}
}

class Person extends Figure {
	@Override
	public void live() {
		System.out.println("need meal and sleep...");
	}
}

class Plant extends Figure {
	@Override
	public void live() {
		System.out.println("need sunshine and water...");	
	}
}

public class Main {
	
	public static void main(String[] args) {
		
		Person person = new Person();
		person.live();
		
		Plant plant = new Plant();
		plant.live();
		plant.func();
	}
}

接口(interface)

接口是一种比抽象类更抽象的""

  1. 接口方法会被自动声明为public
  2. 接口会被自动被声明为public static final
  3. 接口中的方法必须被实现类重写
  4. 实现多接口的时候应避免方法名的重复(防止混淆)
  5. 实现多接口的时候一定要避免名的重复(编译错误)
  6. 抽象类一样, 接口不能被实例化.
  7. 接口可以被其他接口继承, 但只能被类实现.

接口的实现使用implements关键字

interface Spring {
	
	String CONTROLLER_NAME = "SpringMVC";
	String SERVICE_NAME = "Spring";
	
	void runController();
	
	void runService();
}

interface Mybatis {
	
	String REPOSITORY_NAME = "Mybatis";
	
	void runRepository();
}

class JavaWeb implements Spring, Mybatis {
	@Override
	public void runController() {
		System.out.println("run controller...");
	}
	@Override
	public void runService() {
		System.out.println("run service...");
	}
	@Override
	public void runRepository() {
		System.out.println("run repository...");
	}
}

public class Main {
	
	public static void main(String[] args) {
		
		JavaWeb web = new JavaWeb();
		web.runController();
		web.runService();
		web.runRepository();
		
		System.out.println(Spring.CONTROLLER_NAME);
		System.out.println(Spring.SERVICE_NAME);
		System.out.println(Mybatis.REPOSITORY_NAME);
	}
}

多态

父类引用指向子类对象从而调用子类的方法 父类引用可以调用父类中定义的所有方法 运行期间动态绑定从而执行子类重写方法

必要条件: 继承 重写 泛化

由接口实现多态的例子

interface Framework {
	String getName();
}

class Spring implements Framework {
	@Override
	public String getName() {
		return "Spring";
	}
}

class Mybatis implements Framework {
	@Override
	public String getName() {
		return "Mybatis";
	}
}

public class Main {
	
	private static void getFrameworkName(Framework framework) {
		String name = framework.getName();
		System.out.println(name);
	}
	
	public static void main(String[] args) {
		
		Framework spring = new Spring();
		Framework mybatis = new Mybatis();
		
		Main.getFrameworkName(spring);
		Main.getFrameworkName(mybatis);
	}
}

© 著作权归作者所有

jit-hakase
粉丝 0
博文 26
码字总数 30408
作品 0
南京
程序员
Python和Java二选一该学啥?你还在等待吗?

刘鑫:建议你两个都学,从Python开始,然后学java,Java很有用,工作机会多,会用Python,做任何一种开发工作都很有用。而且如果你从0开始做一个项目,python往往是更好的启动技术。对于大型...

胶水语言 ⋅ 05/10 ⋅ 0

如何计算Java对象所占内存的大小

摘要 本文以如何计算Java对象占用内存大小为切入点,在讨论计算Java对象占用堆内存大小的方法的基础上,详细讨论了Java对象头格式并结合JDK源码对对象头中的协议字段做了介绍,涉及内存模型、...

阿里云云栖社区 ⋅ 05/24 ⋅ 0

Java开发每日复盘2018_0514

今天主要跟大家分享3个部分: 一、「Java的核心机制」 二、「Java命名规范」 三、「Java数据类型相关」 下面我们来一个一个的说: 「Java核心机制」 Java是一种强制面向对象的解释型语言(O...

ZeroOSTalk ⋅ 05/14 ⋅ 0

【目录导航】JAVA零基础进阶之路

【JAVA零基础入门系列】(已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 Day4 变量与常量 Day5 Java中的运算符 Day6 Java字符串 Day7 Java输入与输出...

MFrank ⋅ 06/21 ⋅ 0

sharding-jdbc源码分析—准备工作

原文作者:阿飞Javaer 原文链接:https://www.jianshu.com/p/7831817c1da8 接下来对sharding-jdbc源码的分析基于tag为源码,根据sharding-jdbc Features深入学习sharding-jdbc的几个主要特性...

飞哥-Javaer ⋅ 05/03 ⋅ 0

培训云计算学校,虚拟机基本结构讲解

我们要对JVM虚拟机的结构有一个感性的认知。毕竟我们不是编程人员,认知程度达不到那么深入。一个运行时的Java虚拟机实例的天职是:负责运行一个java程序。当启动一个Java程序时,一个虚拟机...

长沙千锋 ⋅ 05/17 ⋅ 0

14、Java并发性和多线程-Java ThreadLocal

以下内容转自http://ifeve.com/java-theadlocal/: Java中的ThreadLocal类可以让你创建的变量只被同一个线程进行读和写操作。因此,尽管有两个线程同时执行一段相同的代码,而且这段代码又有...

easonjim ⋅ 2017/06/16 ⋅ 0

CentOS 6.5 安装JDK(包含卸载原有默认JDK)

卸载原有1.7 JDK 查看是否安装了JDK 若有内容就进一步查看JDK信息 卸载 安装jdk ===================================== 安装wget 新建目录 进入目录 下载JDK 安装JDK 配置环境变量 往文件内...

阿白 ⋅ 05/23 ⋅ 0

Java学习---Java简单认识

前言 小编在学习Java方面的基础知识,发现里面有很多是结合之前的语言的特点发展过来的,不同的地方是,Java有它自己的发展和特点。下面小编先简单地做一下总结,结合看过的1-2章的J2SE视频,...

m18633778874 ⋅ 04/01 ⋅ 0

sharding-jdbc源码解析全集

sharding-jdbc源码解析之词法解析 sharding源码解析之api分析 sharding-jdbc源码解析之spring集成 sharding-jdbc源码解析之spring集成分片构造实现 sharding-jdbc源码解析之jdbc规范重写 sh...

天河2018 ⋅ 05/03 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Jenkins实践3 之脚本

#!/bin/sh# export PROJ_PATH=项目路径# export TOMCAT_PATH=tomcat路径killTomcat(){pid=`ps -ef | grep tomcat | grep java|awk '{print $2}'`echo "tom...

晨猫 ⋅ 今天 ⋅ 0

Spring Bean的生命周期

前言 Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 首先看下生命周期图: 再谈生命周期之前有一点需要先明确: Spring 只帮我们管理单例模...

素雷 ⋅ 今天 ⋅ 0

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

实验楼—MySQL基础课程-挑战3实验报告

按照文档要求创建数据库 sudo sercice mysql startwget http://labfile.oss.aliyuncs.com/courses/9/createdb2.sqlvim /home/shiyanlou/createdb2.sql#查看下数据库代码 代码创建了grade......

zhangjin7 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部