文档章节

Java OOP

jit-hakase
 jit-hakase
发布于 2017/08/31 22:26
字数 1928
阅读 24
收藏 1

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
南京
程序员
从Java到JVM到OS线程的优先级

前言 Java 的线程的调度机制由 JVM 实现,假如有若干条线程,你想让某些线程拥有更长的执行时间,或某些线程分配少点执行时间,这时就涉及“线程优先级”。 优先级别 Java 把线程优先级分成1...

超人汪小建
06/25
0
0
从Java到JVM到OS线程睡眠

前言 Java 中有时需要将线程进入睡眠状态,这时一般我们就会通过使线程进入睡眠状态,接下去就看看执行该语句在 JVM 中做了什么。 简单例子 以下是一个简单的例子,使主线程睡眠5秒钟。 JVM ...

超人汪小建
08/20
0
0
JVM内存结构 VS Java内存模型 VS Java对象模型

Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模型和...

Java架构
07/11
0
0
Python和Java二选一该学啥?你还在等待吗?

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

胶水语言
05/10
0
0
为什么仅仅学Java还不够,你还需要学 Kotlin ?

  作为一个 Java 开发者,你一定对面向对象编程的核心概念烂熟于胸。Java 是纯面向对象语言,如果你想在 Java 项目中写一个函数,那么你首先得先定义一个类,然后再把函数写到这个类里面。...

Android群英传
07/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

你为什么在Redis里读到了本应过期的数据

一个事故的故事 晚上睡的正香突然被电话吵醒,对面是开发焦急的声音:我们的程序在访问redis的时候读到了本应过期的key导致整个业务逻辑出了问题,需要马上解决。 看到这里你可能会想:这是不...

IT--小哥
今天
2
0
祝大家节日快乐,阖家幸福! centos GnuTLS 漏洞

yum update -y gnutls 修复了GnuTLS 漏洞。更新到最新 gnutls.x86_64 0:2.12.23-22.el6 版本

yizhichao
昨天
5
0
Scrapy 1.5.0之选择器

构造选择器 Scrapy选择器是通过文本(Text)或 TextResponse 对象构造的 Selector 类的实例。 它根据输入类型自动选择最佳的解析规则(XML vs HTML): >>> from scrapy.selector import Sele...

Eappo_Geng
昨天
4
0
Windows下Git多账号配置,同一电脑多个ssh-key的管理

Windows下Git多账号配置,同一电脑多个ssh-key的管理   这一篇文章是对上一篇文章《Git-TortoiseGit完整配置流程》的拓展,所以需要对上一篇文章有所了解,当然直接往下看也可以,其中也有...

morpheusWB
昨天
5
0
中秋快乐!!!

HiBlock
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部